优化系统调用

This commit is contained in:
zhangzheng
2023-09-03 15:55:06 +08:00
parent a9969d7762
commit ad72f5e0da
28 changed files with 355 additions and 146 deletions

View File

@@ -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,
};
}

View File

@@ -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向下取整

View File

@@ -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,

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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);

View File

@@ -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;