支持obj map & 与更多用户态接口支持
This commit is contained in:
@@ -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);
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user