支持obj map & 与更多用户态接口支持

This commit is contained in:
zhangzheng
2023-08-28 23:54:33 +08:00
parent dadfda135c
commit 24ed049af7
16 changed files with 214 additions and 33 deletions

View File

@@ -2,4 +2,5 @@
#include "u_types.h"
msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler);
msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler);
msg_tag_t factory_create_task(obj_handler_t obj, obj_handler_t tgt_obj_handler);

View File

@@ -30,5 +30,5 @@ typedef struct msg_tag
msg_tag_init(((umword_t)(t)&0xf) | (((umword_t)(t2)&0xff) << 4) | (((umword_t)(p)) << 12))
#define msg_tag_get_prot(tag) \
((mword_t)((tag).prot))
((int16_t)((tag).prot))

View File

@@ -2,4 +2,6 @@
#include "u_prot.h"
#include "u_types.h"
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj);
msg_tag_t task_unmap(obj_handler_t task_han, obj_handler_t obj);
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr);

View File

@@ -10,6 +10,7 @@ typedef umword_t ptr_t;
typedef char bool_t;
typedef unsigned long obj_addr_t;
typedef unsigned long obj_handler_t;
typedef umword_t addr_t;
#ifndef NULL
#define NULL ((void *)0)
#endif

View File

@@ -13,5 +13,19 @@ msg_tag_t factory_create_thread(obj_handler_t obj, obj_handler_t tgt_obj_handler
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}
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,
TASK_PROT,
tgt_obj_handler,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}

View File

@@ -1,12 +1,28 @@
#include "u_types.h"
#include "u_prot.h"
#include "u_task.h"
enum task_op_code
{
TASK_OBJ_MAP,
TASK_OBJ_UNMAP,
TASK_ALLOC_RAM_BASE,
};
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj)
{
register volatile umword_t r0 asm("r0");
syscall(dst_task, msg_tag_init3(TASK_OBJ_MAP, 2, TASK_PROT).raw,
src_obj,
dst_obj,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
}
msg_tag_t task_unmap(obj_handler_t task_han, obj_handler_t obj)
{
register volatile umword_t r0 asm("r0");
@@ -21,3 +37,21 @@ msg_tag_t task_unmap(obj_handler_t task_han, obj_handler_t obj)
return tag;
}
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr)
{
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,
size,
0,
0,
0,
0);
if (alloc_addr)
{
*alloc_addr = r1;
}
return msg_tag_init(r0);
}

View File

@@ -40,21 +40,75 @@ void thread_test_func2(void)
}
static __attribute__((aligned(8))) uint8_t val[1024];
static __attribute__((aligned(8))) uint8_t val1[1024];
typedef struct app_info
{
const char d[32];
const char magic[8];
union
{
struct exec_head_info
{
umword_t ram_size;
umword_t heap_offset;
umword_t stack_offset;
umword_t heap_size;
umword_t stack_size;
umword_t data_offset;
umword_t bss_offset;
umword_t got_start;
umword_t got_end;
umword_t rel_start;
umword_t rel_end;
umword_t text_start;
} i;
const char d1[128];
};
const char dot_text[];
} app_info_t;
void factory_test(void)
{
// void *mem = mm_alloc_page(MM_PROT, 4, REGION_RWX);
// assert(mem);
// memset(mem, 0, 2048);
factory_create_thread(FACTORY_PROT, 11);
msg_tag_t tag = factory_create_thread(FACTORY_PROT, 11);
if (msg_tag_get_prot(tag) < 0)
{
printf("factory_create_thread no memory\n");
return;
}
#if 0
thread_exec_regs(11, (umword_t)thread_test_func, (umword_t)val + 1024, RAM_BASE());
thread_bind_task(11, TASK_PROT);
thread_run(11);
#if 1
factory_create_thread(FACTORY_PROT, 10);
thread_exec_regs(10, (umword_t)thread_test_func2, (umword_t)val1 + 1024, RAM_BASE());
thread_bind_task(10, TASK_PROT);
thread_run(10);
#else
app_info_t *app = (app_info_t *)0x8014000;
umword_t ram_base;
tag = factory_create_task(FACTORY_PROT, 10);
if (msg_tag_get_prot(tag) < 0)
{
printf("factory_create_task no memory\n");
return;
}
tag = task_alloc_ram_base(10, app->i.ram_size, &ram_base);
if (msg_tag_get_prot(tag) < 0)
{
printf("task_alloc_ram_base no memory\n");
return;
}
task_map(10, LOG_PROT, LOG_PROT);
void *sp_addr = (char *)ram_base + app->i.stack_offset - app->i.data_offset;
void *sp_addr_top = (char *)sp_addr + app->i.stack_size;
thread_exec_regs(11, (umword_t)0x8014000, (umword_t)sp_addr_top, ram_base);
thread_bind_task(11, 10);
thread_run(11);
#endif
}
void mpu_test(void)
@@ -75,18 +129,23 @@ void printf_test(void)
float a = 1.1;
float b = 1.2;
float c = a + b;
printf("%c %d %f\n", 'a', 1234, 1.1);
// printf("%c %d %f\n", 'a', 1234, 1.1);
// c = c;
// printf("%c %d %lf\n", 'a', 1234, 1.1); 浮点打印有问题
}
int main(int argc, char *args[])
{
ulog_write_str(LOG_PROT, "init..\n");
factory_test();
#if 0
mm_test();
mpu_test();
ulog_test();
#endif
printf_test();
printf("exit init.\n");
task_unmap(TASK_PROT, TASK_PROT);
while (1)
;
// task_unmap(TASK_PROT, TASK_PROT);
return 0;
}