优化系统调用
This commit is contained in:
@@ -12,26 +12,78 @@
|
||||
#define THREAD_MAIN THREAD_PROT
|
||||
#define TASK_THIS TASK_PROT
|
||||
|
||||
typedef struct msg_tag
|
||||
enum msg_type
|
||||
{
|
||||
MSG_NONE_TYPE = 0,
|
||||
MSG_DEF_TYPE = 1,
|
||||
};
|
||||
|
||||
typedef union ipc_type
|
||||
{
|
||||
union
|
||||
{
|
||||
umword_t raw;
|
||||
uint8_t raw;
|
||||
struct
|
||||
{
|
||||
umword_t type : 4;
|
||||
umword_t type2 : 8;
|
||||
umword_t prot : (sizeof(umword_t) * 8) - 12;
|
||||
uint8_t type : 1;
|
||||
uint8_t msg_buf_len : 5;
|
||||
uint8_t map_buf_len : 2;
|
||||
};
|
||||
};
|
||||
} ipc_type_t;
|
||||
|
||||
static inline ipc_type_t ipc_type_create(uint8_t raw)
|
||||
{
|
||||
return (ipc_type_t){.raw = raw};
|
||||
}
|
||||
|
||||
static inline ipc_type_t ipc_type_create_3(
|
||||
enum msg_type type, uint8_t msg_buf_len, uint8_t map_buf_len)
|
||||
{
|
||||
return (ipc_type_t){
|
||||
.type = (uint8_t)type,
|
||||
.msg_buf_len = msg_buf_len,
|
||||
.map_buf_len = map_buf_len,
|
||||
};
|
||||
}
|
||||
|
||||
typedef union msg_tag
|
||||
{
|
||||
umword_t raw;
|
||||
struct
|
||||
{
|
||||
umword_t type : 4;
|
||||
umword_t type2 : 8;
|
||||
umword_t prot : WORD_BITS - 12;
|
||||
};
|
||||
} msg_tag_t;
|
||||
|
||||
#define msg_tag_init(r) \
|
||||
((msg_tag_t){.raw = (r)})
|
||||
|
||||
#define msg_tag_init3(t, t2, p) \
|
||||
msg_tag_init(((umword_t)(t)&0xf) | (((umword_t)(t2)&0xff) << 4) | (((umword_t)(p)) << 12))
|
||||
|
||||
#define msg_tag_init3(t, t2, p) ((msg_tag_t){ \
|
||||
.type = t, \
|
||||
.type2 = t2, \
|
||||
.prot = p})
|
||||
#define msg_tag_get_prot(tag) \
|
||||
((int16_t)((tag).prot))
|
||||
|
||||
typedef union syscall_prot
|
||||
{
|
||||
umword_t raw;
|
||||
struct
|
||||
{
|
||||
umword_t op : 6; //!< 操作的op
|
||||
umword_t prot : 6; //!< 通信的类型
|
||||
umword_t obj_inx : (WORD_BITS - 12); //!<
|
||||
};
|
||||
} syscall_prot_t;
|
||||
|
||||
static inline syscall_prot_t syscall_prot_create(uint8_t op, uint8_t prot, obj_handler_t obj_inx)
|
||||
{
|
||||
return (syscall_prot_t){
|
||||
.op = op,
|
||||
.prot = prot,
|
||||
.obj_inx = obj_inx,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -6,4 +6,7 @@
|
||||
#define ABS(a) ((a) < 0 ? -(a) : (a)) //!< 取绝对值
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b)) //!< 最小值
|
||||
#define ALIGN(mem, align) (((mem) + ((align)-1)) & (~((align)-1))) //!< 向上对齐
|
||||
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) //!< 获取数组大小
|
||||
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) //!< 获取数组大小
|
||||
#define ROUND(a, b) (((a) / (b)) + (((a) % (b)) ? 1 : 0)) //!< a/b后的值向上取整
|
||||
#define ROUND_UP(a, b) ROUND(a, b) //!< a除b向上取整数
|
||||
#define ROUND_DOWN(a, b) ((a) / (b)) //!< a/b向下取整
|
||||
@@ -1,11 +1,18 @@
|
||||
#include "u_types.h"
|
||||
#include "u_prot.h"
|
||||
#include "u_factory.h"
|
||||
|
||||
enum
|
||||
{
|
||||
FACTORY_CREATE_KOBJ
|
||||
};
|
||||
|
||||
msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(obj, msg_tag_init3(0, 2, FACTORY_PROT).raw,
|
||||
syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 2, 0).raw, FACTORY_PROT).raw,
|
||||
THREAD_PROT,
|
||||
tgt_obj_handler,
|
||||
0,
|
||||
@@ -19,7 +26,8 @@ msg_tag_t factory_create_task(obj_handler_t obj, obj_handler_t tgt_obj_handler)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(obj, msg_tag_init3(0, 2, FACTORY_PROT).raw,
|
||||
syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 2, 0).raw, FACTORY_PROT).raw,
|
||||
TASK_PROT,
|
||||
tgt_obj_handler,
|
||||
0,
|
||||
@@ -33,7 +41,8 @@ msg_tag_t factory_create_ipc(obj_handler_t obj, obj_handler_t tgt_obj_handler)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(obj, msg_tag_init3(0, 2, FACTORY_PROT).raw,
|
||||
syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 2, 0).raw, FACTORY_PROT).raw,
|
||||
IPC_PROT,
|
||||
tgt_obj_handler,
|
||||
0,
|
||||
|
||||
@@ -10,7 +10,8 @@ msg_tag_t ipc_recv(obj_handler_t obj, umword_t flags)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(obj, msg_tag_init3(IPC_REVC, 1, IPC_PROT).raw,
|
||||
syscall(syscall_prot_create(IPC_REVC, IPC_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 1, 0).raw, IPC_PROT).raw,
|
||||
flags,
|
||||
0,
|
||||
0,
|
||||
@@ -24,7 +25,8 @@ msg_tag_t ipc_send(obj_handler_t obj, umword_t len, umword_t flags)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(obj, msg_tag_init3(IPC_SEND, 2, IPC_PROT).raw,
|
||||
syscall(syscall_prot_create(IPC_SEND, IPC_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 2, 0).raw, IPC_PROT).raw,
|
||||
len,
|
||||
flags,
|
||||
0,
|
||||
|
||||
@@ -3,11 +3,17 @@
|
||||
#include "u_log.h"
|
||||
#include "u_prot.h"
|
||||
#include "u_types.h"
|
||||
#include "u_util.h"
|
||||
#include <string.h>
|
||||
|
||||
enum log_op
|
||||
{
|
||||
WRITE_DATA,
|
||||
READ_DATA,
|
||||
SET_FLAGS
|
||||
};
|
||||
void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len)
|
||||
{
|
||||
uint8_t write_buf[ULOG_RW_MAX_BYTES];
|
||||
uint8_t write_buf[ULOG_RW_MAX_BYTES] = {0};
|
||||
umword_t j = 0;
|
||||
int i = 0;
|
||||
|
||||
@@ -20,7 +26,8 @@ void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len)
|
||||
if (i > 0)
|
||||
{
|
||||
umword_t *write_word_buf = (umword_t *)write_buf;
|
||||
syscall(obj_inx, msg_tag_init3(0, i, LOG_PROT).raw,
|
||||
syscall(syscall_prot_create(WRITE_DATA, LOG_PROT, obj_inx),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, i, 0).raw, LOG_PROT).raw,
|
||||
write_word_buf[0],
|
||||
write_word_buf[1],
|
||||
write_word_buf[2],
|
||||
@@ -39,5 +46,5 @@ void ulog_write_str(obj_handler_t obj_inx, const char *str)
|
||||
size_t i;
|
||||
for (i = 0; str[i]; i++)
|
||||
;
|
||||
ulog_write_bytes(obj_inx, (uint8_t *)str, i);
|
||||
ulog_write_bytes(obj_inx, (uint8_t *)str, i + 1);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,8 @@ void *mm_alloc_page(obj_handler_t obj_inx, umword_t pnf_nr, uint8_t attrs)
|
||||
register volatile umword_t r1 asm("r1");
|
||||
register volatile umword_t r2 asm("r2");
|
||||
register volatile umword_t r3 asm("r3");
|
||||
syscall(obj_inx, msg_tag_init3(MM_ALLOC, 1, MM_PROT).raw,
|
||||
syscall(syscall_prot_create(MM_ALLOC, MM_PROT, obj_inx),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 2, 0).raw, MM_PROT).raw,
|
||||
pnf_nr,
|
||||
attrs,
|
||||
0,
|
||||
@@ -34,7 +35,8 @@ void *mm_alloc_page(obj_handler_t obj_inx, umword_t pnf_nr, uint8_t attrs)
|
||||
}
|
||||
void mm_free_page(obj_handler_t obj_inx, void *addr, umword_t pfn_nr)
|
||||
{
|
||||
syscall(obj_inx, msg_tag_init3(MM_FREE, 1, MM_PROT).raw,
|
||||
syscall(syscall_prot_create(MM_FREE, MM_PROT, obj_inx),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 2, 0).raw, MM_PROT).raw,
|
||||
addr,
|
||||
pfn_nr,
|
||||
0,
|
||||
|
||||
@@ -12,7 +12,8 @@ msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(dst_task, msg_tag_init3(TASK_OBJ_MAP, 2, TASK_PROT).raw,
|
||||
syscall(syscall_prot_create(TASK_OBJ_MAP, TASK_PROT, dst_task),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 2, 0).raw, TASK_PROT).raw,
|
||||
src_obj,
|
||||
dst_obj,
|
||||
0,
|
||||
@@ -27,7 +28,8 @@ msg_tag_t task_unmap(obj_handler_t task_han, obj_handler_t obj)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(task_han, msg_tag_init3(TASK_OBJ_UNMAP, 1, TASK_PROT).raw,
|
||||
syscall(syscall_prot_create(TASK_OBJ_UNMAP, TASK_PROT, task_han),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 1, 0).raw, TASK_PROT).raw,
|
||||
obj,
|
||||
0,
|
||||
0,
|
||||
@@ -42,7 +44,8 @@ msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *all
|
||||
register volatile umword_t r0 asm("r0");
|
||||
register volatile umword_t r1 asm("r1");
|
||||
|
||||
syscall(task_han, msg_tag_init3(TASK_ALLOC_RAM_BASE, 1, TASK_PROT).raw,
|
||||
syscall(syscall_prot_create(TASK_ALLOC_RAM_BASE, TASK_PROT, task_han),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 1, 0).raw, TASK_PROT).raw,
|
||||
size,
|
||||
0,
|
||||
0,
|
||||
|
||||
@@ -15,7 +15,8 @@ msg_tag_t thread_msg_buf_set(obj_handler_t obj, void *msg)
|
||||
register volatile umword_t r1 asm("r1");
|
||||
register volatile umword_t r2 asm("r2");
|
||||
|
||||
syscall(obj, msg_tag_init3(MSG_BUG_SET, 0, THREAD_PROT).raw,
|
||||
syscall(syscall_prot_create(MSG_BUG_SET, THREAD_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 1, 0).raw, THREAD_PROT).raw,
|
||||
msg,
|
||||
0,
|
||||
0,
|
||||
@@ -29,7 +30,8 @@ msg_tag_t thread_msg_buf_get(obj_handler_t obj, umword_t *msg, umword_t *len)
|
||||
register volatile umword_t r1 asm("r1");
|
||||
register volatile umword_t r2 asm("r2");
|
||||
|
||||
syscall(obj, msg_tag_init3(MSG_BUG_GET, 0, THREAD_PROT).raw,
|
||||
syscall(syscall_prot_create(MSG_BUG_GET, THREAD_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 0, 0).raw, THREAD_PROT).raw,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -50,7 +52,8 @@ msg_tag_t thread_exec_regs(obj_handler_t obj, umword_t pc, umword_t sp, umword_t
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(obj, msg_tag_init3(SET_EXEC_REGS, 3, THREAD_PROT).raw,
|
||||
syscall(syscall_prot_create(SET_EXEC_REGS, THREAD_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 3, 0).raw, THREAD_PROT).raw,
|
||||
pc,
|
||||
sp,
|
||||
ram,
|
||||
@@ -63,7 +66,8 @@ msg_tag_t thread_run(obj_handler_t obj)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(obj, msg_tag_init3(RUN_THREAD, 1, THREAD_PROT).raw,
|
||||
syscall(syscall_prot_create(RUN_THREAD, THREAD_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 0, 0).raw, THREAD_PROT).raw,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -77,7 +81,8 @@ msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(obj, msg_tag_init3(BIND_TASK, 1, THREAD_PROT).raw,
|
||||
syscall(syscall_prot_create(BIND_TASK, THREAD_PROT, obj),
|
||||
msg_tag_init3(0, ipc_type_create_3(MSG_NONE_TYPE, 1, 0).raw, THREAD_PROT).raw,
|
||||
tk_obj,
|
||||
0,
|
||||
0,
|
||||
|
||||
@@ -52,6 +52,8 @@ void app_test(void)
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = thread_bind_task(hd_thread, hd_task);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = thread_msg_buf_set(hd_thread, ram_base + app->i.ram_size);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
tag = thread_run(hd_thread);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
|
||||
|
||||
@@ -8,12 +8,10 @@
|
||||
#include "u_ipc.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
static uint8_t msg_buf[MSG_BUG_LEN];
|
||||
int main(int argc, char *args[])
|
||||
{
|
||||
// printf("shell>\n");
|
||||
ulog_write_str(LOG_PROT, "MKRTOS:\n");
|
||||
thread_msg_buf_set(THREAD_MAIN, msg_buf);
|
||||
ipc_recv(12, 0);
|
||||
char *buf;
|
||||
umword_t len;
|
||||
|
||||
Reference in New Issue
Block a user