替换为fastipc

This commit is contained in:
zhangzheng
2024-12-29 21:50:20 +08:00
parent 49060a965b
commit 01cd44d7fd
570 changed files with 735 additions and 598 deletions

View File

@@ -163,7 +163,12 @@
"net_drv_cli.h": "c",
"lwiperf.h": "c",
"stdio_impl.h": "c",
"stack.h": "c"
"stack.h": "c",
"u_fast_ipc.h": "c",
"cons_svr.h": "c",
"u_rpc_buf.h": "c",
"at32f435_437_clock.h": "c",
"at_surf_f437_board_sdram.h": "c"
},
"cortex-debug.showRTOS": false,
"cortex-debug.variableUseNaturalFormat": true,

View File

@@ -98,7 +98,6 @@ elseif(${CONFIG_CPU_TYPE} STREQUAL "at32f437" )
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 ")
endif()
file(GLOB bsp_src
# ${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/cmsis/cm4/device_support/system_at32f435_437.c
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/drivers/src/*.c
)
list(APPEND deps ${bsp_src})
@@ -109,6 +108,7 @@ elseif(${CONFIG_CPU_TYPE} STREQUAL "at32f437" )
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/cmsis/cm4/core_support
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/cmsis/cm4/device_support
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/drivers/inc
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/project/at_surf_f437_board
)
add_subdirectory(bsp/AT32F437)
set(LINKS_FLAGS " --gc-section ")

View File

@@ -1,7 +1,15 @@
cmake_minimum_required(VERSION 3.13)
file(GLOB_RECURSE deps **/*.s *.s **/*.C *.c)
file(GLOB_RECURSE deps
**/*.s
*.s
**/*.C
*.c
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/project/at_surf_f437_board/at_surf_f437_board_qspi_sram.c
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/project/at_surf_f437_board/at_surf_f437_board_sdram.c
)
add_library(boot_bsp STATIC ${deps})
target_include_directories(

View File

@@ -3,6 +3,9 @@
#include <util.h>
#include <boot_info.h>
#include "at32f435_437_clock.h"
#include "at_surf_f437_board_qspi_sram.h"
#include "at_surf_f437_board_sdram.h"
//! 内核镜像的开始地址
#define KERNEL_IMG_START_ADDR (CONFIG_SYS_TEXT_ADDR + CONFIG_BOOTSTRAP_TEXT_SIZE + CONFIG_DTBO_TEXT_SIZE)
@@ -52,14 +55,34 @@ static boot_info_t boot_info = {
.is_sys_mem = 1,
.speed = 0,
},
{
.addr = 0xC0000000,
.size = 32 * 1024 * 1024,
.is_sys_mem = 0,
.speed = 1,
},
.mem_num = 1,
{
.addr = QSPI_SRAM_MEM_BASE,
.size = 8 * 1024 * 1024,
.is_sys_mem = 0,
.speed = 2,
},
},
.mem_num = 3,
},
};
void delay_ms(int ms)
{
for (volatile int i = 0; i < 1000000; i++)
;
}
static void mem_init(void)
{
/*Nothing.*/
/* initialize qspi sram */
qspi_sram_init();
/* initialize sdram */
sdram_init();
}
void jump2kernel(addr_t cpio_start, addr_t cpio_end)

View File

@@ -44,7 +44,7 @@ void thread_knl_pf_set(thread_t *cur_th, void *pc)
cur_th->sp.user_sp = 0;
cur_th->sp.sp_type = 0xfffffff9;
}
void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram, umword_t stack)
void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram)
{
// assert((((umword_t)user_sp) & 0x7UL) == 0);
umword_t usp = ((umword_t)(user_sp) & ~0x7UL);
@@ -59,8 +59,12 @@ void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram, um
cur_th->sp.knl_sp = ((char *)cur_th + CONFIG_THREAD_BLOCK_SIZE - 8);
cur_th->sp.user_sp = cur_pf;
cur_th->sp.sp_type = 0xfffffffd;
// printk("exc_regs:%x %x %x\n", cur_pf->pf_s.pc, cur_th->sp.user_sp, ram);
}
void thread_user_pf_restore(thread_t *cur_th, void *user_sp)
{
cur_th->sp.knl_sp = ((char *)cur_th + CONFIG_THREAD_BLOCK_SIZE - 8);
cur_th->sp.user_sp = user_sp;
cur_th->sp.sp_type = 0xfffffffd;
}
void task_knl_init(task_t *knl_tk)
{

View File

@@ -3,4 +3,5 @@
#include "mm_space.h"
#include "ram_limit.h"
#include "types.h"
void *mpu_ram_alloc(mm_space_t *ms, ram_limit_t *r_limit, size_t ram_size);
void *mpu_ram_alloc(mm_space_t *ms, ram_limit_t *r_limit, size_t ram_size, int mem_block);

View File

@@ -7,11 +7,15 @@
void mm_init(boot_info_t *info);
void *mm_limit_alloc(ram_limit_t *limit, size_t size);
void mm_limit_free(ram_limit_t *limit, void *mem);
struct mem_heap *mm_get_free_raw(int mem_inx, struct mem_heap *next,
umword_t hope_size, umword_t *ret_addr);
struct mem_heap *mm_get_free(struct mem_heap *next,
umword_t hope_size, umword_t *ret_addr);
void mm_trace(void);
void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align);
void *mm_limit_alloc_align_raw(int mem_inx, ram_limit_t *limit, size_t size, size_t align);
void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size);
void mm_limit_free_align_raw(int mem_inx, ram_limit_t *limit, void *mem, size_t size);
void mm_info(size_t *total, size_t *free);
#if IS_ENABLED(CONFIG_BUDDY_SLAB)

View File

@@ -33,6 +33,7 @@ typedef struct task
addr_t nofity_stack; //!< nofity_point_stack.
mutex_t nofity_lock;
addr_t nofity_msg_buf; //!<
umword_t *nofity_map_buf;
umword_t *nofity_bitmap; //!<
int nofity_bitmap_len; //!< max is WORD_BITS
slist_head_t nofity_theads_head;
@@ -46,6 +47,6 @@ static inline pid_t task_pid_get(task_t *task)
}
void task_init(task_t *task, ram_limit_t *ram, int is_knl);
task_t *task_create(ram_limit_t *lim, int is_knl);
int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size);
int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size, int mem_block);
void task_kill(task_t *tk);
int task_set_pid(task_t *task, pid_t pid);

View File

@@ -115,7 +115,7 @@ typedef struct thread_fast_ipc_item
void *usp_backup; //!< 备份用户栈,用于快速通信
void *msg_buf;
} thread_fast_ipc_item_t;
#define THREAD_FAST_IPC_ITEM_NUM 8
#define THREAD_FAST_IPC_ITEM_NUM 4
#define THREAD_MAGIC 0xdeadead //!< 用于栈溢出检测
typedef struct thread

View File

@@ -11,11 +11,14 @@
#include "mm_wrap.h"
#include "printk.h"
#define assert(cond) \
do { \
if (!(cond)) { \
do \
{ \
if (!(cond)) \
{ \
printk("\n%s:%d %s\n", __FILE__, __LINE__, #cond); \
dumpstack(); \
mm_trace(); \
sys_reset(); \
while (1) \
; \
} \

View File

@@ -191,7 +191,9 @@ int task_vma_alloc(task_vma_t *task_vma, vma_addr_t vaddr, size_t size,
if (alloc_cn == 0)
{
task_vma->mem_pages_alloc_size[i] = size;
} else {
}
else
{
task_vma->mem_pages_alloc_size[i] = 0;
}
alloc_cn++;
@@ -592,14 +594,14 @@ static bool_t mpu_calc(
return TRUE;
}
void *mpu_ram_alloc(mm_space_t *ms, ram_limit_t *r_limit, size_t ram_size)
void *mpu_ram_alloc(mm_space_t *ms, ram_limit_t *r_limit, size_t ram_size, int mem_block)
{
#if CONFIG_MPU_VERSION == 1
umword_t pre_alloc_addr;
struct mem_heap *heap = NULL;
umword_t status = cpulock_lock();
again_alloc:
heap = mm_get_free(heap, ram_size, &pre_alloc_addr);
heap = mm_get_free_raw(mem_block, heap, ram_size, &pre_alloc_addr);
if (!heap)
{
cpulock_set(status);
@@ -619,7 +621,7 @@ again_alloc:
return NULL;
}
void *ram = mm_limit_alloc_align(r_limit, ram_size, need_align);
void *ram = mm_limit_alloc_align_raw(mem_block, r_limit, ram_size, need_align);
if (!ram)
{
cpulock_set(status);
@@ -632,7 +634,7 @@ again_alloc:
{
cpulock_set(status);
printk("Again.\n");
mm_limit_free_align(r_limit, ram, need_align);
mm_limit_free_align_raw(mem_block, r_limit, ram, need_align);
heap = heap->next;
goto again_alloc;
}
@@ -641,7 +643,7 @@ again_alloc:
#elif CONFIG_MPU_VERSION == 2
region_info_t *region;
void *ram = mm_limit_alloc_align(r_limit, ram_size + MPU_ALIGN_SIZE, MPU_ALIGN_SIZE);
void *ram = mm_limit_alloc_align_raw(mem_block, r_limit, ram_size + MPU_ALIGN_SIZE, MPU_ALIGN_SIZE);
if (!ram)
{
printk("The system is low on memory.\n");
@@ -650,7 +652,7 @@ again_alloc:
region = mm_space_alloc_pt_region(ms);
if (!region)
{
mm_limit_free_align(r_limit, ram, ram_size);
mm_limit_free_align_raw(mem_block, r_limit, ram, ram_size);
return NULL;
}
region->block_start_addr = (umword_t)ram;
@@ -662,9 +664,9 @@ again_alloc:
#endif
}
#else
void *mpu_ram_alloc(mm_space_t *ms, ram_limit_t *r_limit, size_t ram_size)
void *mpu_ram_alloc(mm_space_t *ms, ram_limit_t *r_limit, size_t ram_size, int mem_block)
{
void *ram = mm_limit_alloc(r_limit, ram_size);
void *ram = mm_limit_alloc_raw(mem_block, r_limit, ram_size);
return ram;
}

View File

@@ -99,6 +99,11 @@ void mm_limit_free(ram_limit_t *limit, void *mem)
mem_free(&mem_manage[0], (char *)mem - sizeof(size_t));
ram_limit_free(limit, size);
}
struct mem_heap *mm_get_free_raw(int mem_inx, struct mem_heap *next,
umword_t hope_size, umword_t *ret_addr)
{
return mem_get_free(&mem_manage[mem_inx], next, hope_size, (uint32_t *)ret_addr);
}
struct mem_heap *mm_get_free(struct mem_heap *next,
umword_t hope_size, umword_t *ret_addr)
{
@@ -112,13 +117,13 @@ void mm_info(size_t *total, size_t *free)
{
mem_info(&mem_manage[0], total, free);
}
void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align)
void *mm_limit_alloc_align_raw(int mem_inx, ram_limit_t *limit, size_t size, size_t align)
{
if (ram_limit_alloc(limit, size) == FALSE)
{
return NULL;
}
void *new_mem = mem_alloc_align(&mem_manage[0], size, align);
void *new_mem = mem_alloc_align(&mem_manage[mem_inx], size, align);
if (!new_mem)
{
@@ -128,15 +133,23 @@ void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align)
return (char *)new_mem;
}
void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size)
void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align)
{
return mm_limit_alloc_align_raw(0, limit, size, align);
}
void mm_limit_free_align_raw(int mem_inx, ram_limit_t *limit, void *mem, size_t size)
{
if (!mem)
{
return;
}
mem_free_align(&mem_manage[0], (char *)mem);
mem_free_align(&mem_manage[mem_inx], (char *)mem);
ram_limit_free(limit, size);
}
void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size)
{
mm_limit_free_align_raw(0, limit, mem, size);
}
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
#include <buddy.h>
#include <slab.h>

View File

@@ -75,6 +75,7 @@ void sema_up(sema_t *obj)
// printk("up1 sema cnt:%d max:%d.\n", obj->cnt, obj->max_cnt);
}
spinlock_set(&obj->lock, status);
preemption();
}
void sema_down(sema_t *obj)
{
@@ -91,6 +92,7 @@ again:
slist_add_append(&obj->suspend_head, &wait_item.node);
thread_suspend_sw(th, FALSE);
spinlock_set(&obj->lock, status);
preemption();
goto again;
}
else

View File

@@ -73,16 +73,17 @@ INIT_KOBJ_MEM(task_mem_init);
* @param tk
* @param lim
* @param size
* @param mem_block 使用的内存块
* @return int
*/
int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size)
int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size, int mem_block)
{
if (tk->mm_space.mm_block)
{
return -EACCES;
}
// 申请init的ram内存
void *ram = mpu_ram_alloc(&tk->mm_space, lim, size + THREAD_MSG_BUG_LEN);
void *ram = mpu_ram_alloc(&tk->mm_space, lim, size + THREAD_MSG_BUG_LEN, mem_block);
if (!ram)
{
printk("Failed to request process memory.\n");
@@ -306,7 +307,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
tag = msg_tag_init4(0, 0, 0, -EINVAL);
break;
}
int ret = task_alloc_base_ram(tag_task, tag_task->lim, f->regs[1]);
int ret = task_alloc_base_ram(tag_task, tag_task->lim, f->regs[1], f->regs[2]);
tag = msg_tag_init4(0, 0, 0, ret);
f->regs[1] = (umword_t)(tag_task->mm_space.mm_block);
spinlock_set(&tag_task->kobj.lock, status);
@@ -411,12 +412,14 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
tag = msg_tag_init4(0, 0, 0, -EINVAL);
break;
}
if (!is_rw_access(tag_task, (void *)(f->regs[3]), ROUND_UP(f->regs[4], 8), FALSE))
if (!is_rw_access(tag_task, (void *)(f->regs[3]),
ROUND_UP(f->regs[4], 8), FALSE))
{
tag = msg_tag_init4(0, 0, 0, -EPERM);
break;
}
if (!is_rw_access(tag_task, (void *)(f->regs[5]), THREAD_MSG_BUG_LEN, FALSE))
if (!is_rw_access(tag_task, (void *)(f->regs[5]),
THREAD_MSG_BUG_LEN + CONFIG_THREAD_MAP_BUF_LEN * WORD_BYTES, FALSE))
{
tag = msg_tag_init4(0, 0, 0, -EPERM);
break;
@@ -428,6 +431,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
tag_task->nofity_bitmap = (void *)(f->regs[3]);
tag_task->nofity_bitmap_len = (f->regs[4]);
tag_task->nofity_msg_buf = (addr_t)f->regs[5];
tag_task->nofity_map_buf = (umword_t *)((addr_t)f->regs[5] + THREAD_MSG_BUG_LEN);
tag = msg_tag_init4(0, 0, 0, 0);
}
break;

View File

@@ -718,6 +718,7 @@ void thread_timeout_del_recv_remote(thread_t *th, bool_t is_sche)
static int ipc_dat_copy_raw(obj_space_t *dst_obj, obj_space_t *src_obj, ram_limit_t *lim,
ipc_msg_t *dst_ipc, ipc_msg_t *src_ipc, msg_tag_t tag, int is_reply)
{
int i = 0;
if (tag.map_buf_len > 0)
{
kobj_del_list_t del;
@@ -725,13 +726,14 @@ static int ipc_dat_copy_raw(obj_space_t *dst_obj, obj_space_t *src_obj, ram_limi
kobj_del_list_init(&del);
for (int i = 0; i < map_len; i++)
for (i = 0; i < map_len; i++)
{
int ret = 0;
vpage_t dst_page = vpage_create_raw(dst_ipc->map_buf[i]);
vpage_t src_page = vpage_create_raw(src_ipc->map_buf[i]);
// printk("map-> src:%d dst:%d\n", src_page.addr, dst_page.addr);
if ((src_page.flags & VPAGE_FLAGS_MAP) || is_reply)
{
ret = obj_map_src_dst(dst_obj, src_obj,
@@ -749,6 +751,7 @@ static int ipc_dat_copy_raw(obj_space_t *dst_obj, obj_space_t *src_obj, ram_limi
}
memcpy(dst_ipc->msg_buf, src_ipc->msg_buf,
MIN(tag.msg_buf_len * WORD_BYTES, IPC_MSG_SIZE));
return i;
}
/**
* @brief ipc传输时的数据拷贝
@@ -1249,15 +1252,27 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id)
mutex_unlock(&old_task->nofity_lock);
return msg_tag_init4(0, 0, 0, ret);
}
umword_t cpu_status = cpulock_lock();
task_t *cur_task = thread_get_current_task();
ipc_msg_t *dst_ipc = (void *)cur_th->msg.msg;
ipc_msg_t *src_ipc = (void *)old_task->nofity_msg_buf;
ret = ipc_dat_copy_raw(&cur_task->obj_space, &old_task->obj_space, cur_task->lim,
dst_ipc, src_ipc, in_tag, FALSE);
if (ret < 0)
dst_ipc, src_ipc, in_tag, TRUE);
// if (ret > 0)
// {
// }
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++)
{
mutex_unlock(&old_task->nofity_lock);
return msg_tag_init4(0, 0, 0, ret);
if (i < ret)
{
src_ipc->map_buf[i] = old_task->nofity_map_buf[i];
old_task->nofity_map_buf[i] = 0;
}
else
{
src_ipc->map_buf[i] = old_task->nofity_map_buf[i];
}
}
mutex_unlock(&old_task->nofity_lock);
pf_t *cur_pf = ((pf_t *)((char *)cur_th + CONFIG_THREAD_BLOCK_SIZE + 8)) - 1;
@@ -1266,7 +1281,12 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id)
extern void mpu_switch_to_task(struct task * tk);
mpu_switch_to_task(cur_task);
ref_counter_dec_and_release(&old_task->ref_cn, &old_task->kobj);
return msg_tag_init4(0, 0, 0, ret);
if (ret < 0)
{
in_tag = msg_tag_init4(0, 0, 0, ret);
}
cpulock_set(cpu_status);
return in_tag;
}
break;
case IPC_FAST_CALL:
@@ -1280,6 +1300,7 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id)
if (to_task->nofity_point == NULL)
{
printk("task:0x%x, notify point is not set.\n", to_task);
return msg_tag_init4(0, 0, 0, -EIO);
}
_to_unlock:
@@ -1297,6 +1318,7 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id)
preemption();
goto _to_unlock;
}
umword_t cpu_status = cpulock_lock();
ref_counter_inc((&to_task->ref_cn));
//!< 执行目标线程时用的是当前线程的资源,这里还需要备份当前线程的上下文。
ret = thread_fast_ipc_save(cur_th, to_task, (void *)(to_task->nofity_stack - 4 * 8)); //!< 备份栈和usp
@@ -1324,9 +1346,9 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id)
//! 寄存器传参数
f->regs[0] = in_tag.raw;
f->regs[1] = f->regs[2];
f->regs[2] = f->regs[3];
f->regs[3] = f->regs[4];
f->regs[1] = user_id;
f->regs[2] = f->regs[2];
f->regs[3] = f->regs[3];
extern void mpu_switch_to_task(struct task * tk);
mpu_switch_to_task(to_task);
@@ -1343,6 +1365,7 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id)
ref_counter_dec_and_release(&to_task->ref_cn, &to_task->kobj);
mutex_unlock(&to_task->nofity_lock);
}
cpulock_set(cpu_status);
return msg_tag_init4(0, 0, 0, ret);
}
break;

View File

@@ -169,7 +169,7 @@ static void knl_init_2(void)
assert(app);
printk("init task text is 0x%x.\n", app);
// 申请init的ram内存
assert(task_alloc_base_ram(init_task, &root_factory_get()->limit, app->i.ram_size + THREAD_MSG_BUG_LEN) >= 0);
assert(task_alloc_base_ram(init_task, &root_factory_get()->limit, app->i.ram_size + THREAD_MSG_BUG_LEN, 0) >= 0);
void *sp_addr = (char *)init_task->mm_space.mm_block + app->i.stack_offset - app->i.data_offset;
void *sp_addr_top = (char *)sp_addr + app->i.stack_size;

View File

@@ -13,7 +13,7 @@ msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *data);
msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx, int *obj_type);
msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj, uint8_t attrs);
msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage);
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr);
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr, int mem_block);
msg_tag_t task_copy_data(obj_handler_t task_obj, void *st_addr, umword_t size);
msg_tag_t task_copy_data_to(obj_handler_t task_obj, obj_handler_t dst_task_obj, void *st_addr, void *dst_addr, umword_t size);
msg_tag_t task_set_com_point(obj_handler_t task_obj, void *com_point_func,

View File

@@ -139,7 +139,7 @@ msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage)
return tag;
}
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr)
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr,int mem_block)
{
register volatile umword_t r0 asm(ARCH_REG_0);
register volatile umword_t r1 asm(ARCH_REG_1);
@@ -147,7 +147,7 @@ msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *all
mk_syscall(syscall_prot_create(TASK_ALLOC_RAM_BASE, TASK_PROT, task_han).raw,
0,
size,
0,
mem_block,
0,
0,
0);

View File

@@ -13,7 +13,7 @@ typedef struct cons
queue_t r_queue;
uint8_t r_data[CONS_WRITE_BUF_SIZE];
pthread_spinlock_t r_lock;
pthread_mutex_t w_lock;
// pthread_mutex_t w_lock;
pid_t active_pid;
obj_handler_t hd_cons_read;
uint8_t r_data_buf[16];

View File

@@ -8,124 +8,13 @@
#include "u_rpc_svr.h"
#include <u_env.h>
RPC_GENERATION_CALL1(cons_t, CONS_PROT, CONS_WRITE, write,
RPC_GENERATION_CALL1(TRUE, cons_t, CONS_PROT, CONS_WRITE, write,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data)
// RPC_GENERATION_CALL2(cons_t, CONS_PROT, CONS_READ, read,
// rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_OUT, RPC_TYPE_DATA, data,
// rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
msg_tag_t cons_t_read_call(obj_handler_t hd, rpc_ref_array_uint32_t_uint8_t_32_t *var0, rpc_int_t *var1)
{
void *buf;
ipc_msg_t *msg_ipc;
int off = 0;
int off_buf = 0;
int ret = -1;
umword_t op_val = ((umword_t)1);
RPC_GENERATION_CALL2(TRUE, cons_t, CONS_PROT, CONS_READ, read,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_OUT, RPC_TYPE_DATA, data,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
thread_msg_buf_get(-1, (umword_t *)(&buf), ((void *)0));
msg_ipc = (ipc_msg_t *)buf;
msg_ipc->msg_buf[0] = op_val;
off += rpc_align(sizeof(op_val), __alignof(((umword_t)1)));
do
{
if (1 == 1)
{
if (2 == 1 || 2 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_ref_array_uint32_t_uint8_t_32_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (1 == 2)
{
if (2 == 1 || 2 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_ref_array_uint32_t_uint8_t_32_t(var0, (uint8_t *)((uint8_t *)msg_ipc->map_buf), off_buf);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off_buf = ret;
}
}
} while (0);
do
{
if (1 == 1)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_int_t(var1, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (1 == 2)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_int_t(var1, (uint8_t *)((uint8_t *)msg_ipc->map_buf), off_buf);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off_buf = ret;
}
}
} while (0);
msg_tag_t tag = thread_ipc_call(((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = ((((off_buf) / ((sizeof(void *)))) + (((off_buf) % ((sizeof(void *)))) ? 1 : 0))), .prot = (0x0006)}), hd, ipc_timeout_create2(0, 0));
if (((int)((tag).prot)) < 0)
{
return tag;
}
off = 0;
do
{
if (1 == 1)
{
if (2 == 2 || 2 == 4)
{
int ret = rpc_cli_buf_to_msg_rpc_ref_array_uint32_t_uint8_t_32_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off, tag.msg_buf_len * (sizeof(void *)));
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (1 == 1)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_cli_buf_to_msg_rpc_int_t(var1, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off, tag.msg_buf_len * (sizeof(void *)));
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
return tag;
}
RPC_GENERATION_CALL1(cons_t, CONS_PROT, CONS_ACTIVE, active,
RPC_GENERATION_CALL1(TRUE, cons_t, CONS_PROT, CONS_ACTIVE, active,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
int cons_write(const uint8_t *data, int len)

View File

@@ -56,5 +56,5 @@ void cons_svr_obj_init(cons_t *cons)
cons->active_pid = -1;
q_init(&cons->r_queue, cons->r_data, CONS_WRITE_BUF_SIZE);
pthread_spin_init(&cons->r_lock, 0);
pthread_mutex_init(&cons->w_lock, NULL);
// pthread_mutex_init(&cons->w_lock, NULL);
}

View File

@@ -10,20 +10,20 @@
#include <string.h>
#include <assert.h>
RPC_GENERATION_CALL2(drv_t, FS_PROT, DRV_OPEN, open,
RPC_GENERATION_CALL2(TRUE, drv_t, FS_PROT, DRV_OPEN, open,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, name,
rpc_uint32_t_t, rpc_uint32_t_t, RPC_DIR_IN, RPC_TYPE_DATA, oflags)
RPC_GENERATION_CALL1(drv_t, FS_PROT, DRV_CLOSE, close,
RPC_GENERATION_CALL1(TRUE, drv_t, FS_PROT, DRV_CLOSE, close,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc)
RPC_GENERATION_CALL3(drv_t, FS_PROT, DRV_READ, read,
RPC_GENERATION_CALL3(TRUE, drv_t, FS_PROT, DRV_READ, read,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_OUT, RPC_TYPE_DATA, data,
rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size)
RPC_GENERATION_CALL3(drv_t, FS_PROT, DRV_WRITE, write,
RPC_GENERATION_CALL3(TRUE, drv_t, FS_PROT, DRV_WRITE, write,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, data,
rpc_size_t_t, rpc_size_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size)
RPC_GENERATION_CALL3(drv_t, FS_PROT, DRV_IOCTL, ioctl,
RPC_GENERATION_CALL3(TRUE, drv_t, FS_PROT, DRV_IOCTL, ioctl,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, desc,
rpc_mword_t_t, rpc_mword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, data,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, size)

View File

@@ -13,7 +13,7 @@
#include <assert.h>
/*open*/
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_OPEN, open,
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_OPEN, open,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mode)
@@ -47,7 +47,7 @@ sd_t fs_open(const char *path, int flags, int mode)
return mk_sd_init2(hd, msg_tag_get_val(tag)).raw;
}
/*close*/
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_CLOSE, close,
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_CLOSE, close,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd)
int fs_close(sd_t _fd)
{
@@ -67,7 +67,7 @@ int fs_close(sd_t _fd)
return msg_tag_get_val(tag);
}
/*read*/
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_READ, read,
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_READ, read,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
@@ -110,7 +110,7 @@ int fs_read(sd_t _fd, void *buf, size_t len)
return rlen;
}
/*write*/
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_WRITE, write,
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_WRITE, write,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, buf,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
@@ -156,7 +156,7 @@ int fs_write(sd_t _fd, void *buf, size_t len)
return wlen;
}
/*readdir*/
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_READDIR, readdir,
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_READDIR, readdir,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_dirent_t_t, rpc_dirent_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, dir)
@@ -184,7 +184,7 @@ int fs_readdir(sd_t _fd, dirent_t *dirent)
return msg_tag_get_val(tag);
}
/*lseek*/
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_LSEEK, lseek,
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_LSEEK, lseek,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, offs,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, whence)
@@ -213,7 +213,7 @@ int fs_lseek(sd_t _fd, int offs, int whence)
return msg_tag_get_val(tag);
}
/*ftruncate*/
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_FTRUNCATE, ftruncate,
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_FTRUNCATE, ftruncate,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_int64_t_t, rpc_int64_t_t, RPC_DIR_IN, RPC_TYPE_DATA, offs)
int fs_ftruncate(sd_t _fd, off_t off)
@@ -238,7 +238,7 @@ int fs_ftruncate(sd_t _fd, off_t off)
}
/*fstat*/
// int fstat(int fd, struct stat *statbuf);
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_FSTAT, fstat,
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_FSTAT, fstat,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_stat_t_t, rpc_stat_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, statbuf)
int fs_fstat(sd_t _fd, stat_t *stat)
@@ -267,7 +267,7 @@ int fs_fstat(sd_t _fd, stat_t *stat)
return msg_tag_get_val(tag);
}
// int ioctl(int fd, int req, void *arg)
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_IOCTL, ioctl,
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_IOCTL, ioctl,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, req,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, arg)
@@ -296,7 +296,7 @@ int fs_ioctl(sd_t _fd, int req, void *arg)
return msg_tag_get_val(tag);
}
// int fcntl(int fd, int cmd, void *arg)
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_FCNTL, fcntl,
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_FCNTL, fcntl,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, cmd,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, arg)
@@ -326,7 +326,7 @@ int fs_fcntl(sd_t _fd, int cmd, void *arg)
}
/*fsync*/
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_FSYNC, fsync,
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_FSYNC, fsync,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd)
int fs_fsync(sd_t _fd)
{
@@ -342,7 +342,7 @@ int fs_fsync(sd_t _fd)
}
/*int unlink(const char *path)*/
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_UNLINK, unlink,
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_UNLINK, unlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path)
int fs_unlink(const char *path)
{
@@ -364,7 +364,7 @@ int fs_unlink(const char *path)
return msg_tag_get_val(tag);
}
// int symlink(const char *existing, const char *new)
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_SYMLINK, symlink,
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_SYMLINK, symlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, src,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dst)
@@ -405,7 +405,7 @@ int fs_symlink(const char *src, const char *dst)
}
/*int mkdir(char *path)*/
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_MKDIR, mkdir,
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_MKDIR, mkdir,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dir)
int fs_mkdir(char *path)
@@ -429,7 +429,7 @@ int fs_mkdir(char *path)
}
/*int rmdir(char *path)*/
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_RMDIR, rmdir,
RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_RMDIR, rmdir,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dir)
int fs_rmdir(char *path)
@@ -452,7 +452,7 @@ int fs_rmdir(char *path)
return msg_tag_get_val(tag);
}
/*int rename(char *old, char *new)*/
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_RENAME, rename,
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_RENAME, rename,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, old,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, new)
@@ -492,7 +492,7 @@ int fs_rename(char *old, char *new)
return msg_tag_get_val(tag);
}
// int stat(const char *restrict path, struct stat *restrict buf)
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_STAT, stat,
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_STAT, stat,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_stat_t_t, rpc_stat_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf)
@@ -525,7 +525,7 @@ int fs_stat(char *path, stat_t *buf)
return msg_tag_get_val(tag);
}
// ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize)
RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_READLINK, readlink,
RPC_GENERATION_CALL3(TRUE, fs_t, FS_PROT, FS_READLINK, readlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, bufsize)
@@ -561,7 +561,7 @@ int fs_readlink(const char *path, char *buf, int bufsize)
}
// static int __statfs(const char *path, struct statfs *buf)
RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_STATFS, statfs,
RPC_GENERATION_CALL2(TRUE, fs_t, FS_PROT, FS_STATFS, statfs,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_statfs_t_t, rpc_statfs_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf)

View File

@@ -11,7 +11,7 @@
#include <stdio.h>
#include <assert.h>
RPC_GENERATION_CALL2(net_drv_t, NET_DRV_PROT, NET_DRV_WRITE, write,
RPC_GENERATION_CALL2(TRUE, net_drv_t, NET_DRV_PROT, NET_DRV_WRITE, write,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
int net_drv_cli_write(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len)
@@ -27,7 +27,7 @@ int net_drv_cli_write(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL2(net_drv_t, NET_DRV_PROT, NET_DRV_READ, read,
RPC_GENERATION_CALL2(TRUE, net_drv_t, NET_DRV_PROT, NET_DRV_READ, read,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
@@ -43,7 +43,7 @@ int net_drv_cli_read(obj_handler_t dm9000_obj, obj_handler_t shm_obj)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL1(net_drv_t, NET_DRV_PROT, NET_DRV_MAP, map,
RPC_GENERATION_CALL1(TRUE, net_drv_t, NET_DRV_PROT, NET_DRV_MAP, map,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
int net_drv_cli_map(obj_handler_t dm9000_obj, obj_handler_t *sem_obj)

View File

@@ -68,12 +68,12 @@ static bool_t reg_hd(const char *path, obj_handler_t hd, int split_inx)
return FALSE;
}
RPC_GENERATION_CALL3(ns_t, NS_PROT, NS_REGISTER_OP, register,
RPC_GENERATION_CALL3(TRUE, ns_t, NS_PROT, NS_REGISTER_OP, register,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, svr_hd,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, type)
RPC_GENERATION_CALL2(ns_t, NS_PROT, NS_QUERY_OP, query,
RPC_GENERATION_CALL2(TRUE, ns_t, NS_PROT, NS_QUERY_OP, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)

View File

@@ -15,7 +15,7 @@ RPC_GENERATION_OP3(ns_t, NS_PROT, NS_REGISTER_OP, register,
{
path->data[path->len - 1] = 0;
int ret = namespace_register((char *)(path->data), rpc_hd_get(0), type->data);
int ret = namespace_register((char *)(path->data), vpage_create_raw(svr_hd->data).addr, type->data);
if (ret >= 0)
{
printf("register [%s] success.\n", (char *)(path->data));
@@ -40,7 +40,7 @@ RPC_GENERATION_OP2(ns_t, NS_PROT, NS_QUERY_OP, query,
int ret = namespace_query((char *)(path->data), &cli_hd->data);
if (ret >= 0)
{
// printf("The request service [%s] was successful, hd is %d.\n", (char *)(path->data), cli_hd->data);
printf("The request service [%s] was successful, hd is %d.\n", (char *)(path->data), cli_hd->data);
}
else
{

View File

@@ -10,7 +10,7 @@
#include <string.h>
#include <assert.h>
RPC_GENERATION_CALL2(pm_t, PM_PROT, PM_RUN_APP, run_app,
RPC_GENERATION_CALL2(TRUE, pm_t, PM_PROT, PM_RUN_APP, run_app,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
int pm_run_app(const char *path, int flags)
@@ -27,7 +27,7 @@ int pm_run_app(const char *path, int flags)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL2(pm_t, PM_PROT, PM_KILL_TASK, kill_task,
RPC_GENERATION_CALL2(TRUE, pm_t, PM_PROT, PM_KILL_TASK, kill_task,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, pid,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
@@ -43,7 +43,7 @@ int pm_kill_task(int pid, int flags)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL3(pm_t, PM_PROT, PM_WATCH_PID, watch_pid,
RPC_GENERATION_CALL3(TRUE, pm_t, PM_PROT, PM_WATCH_PID, watch_pid,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, sig_hd,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, pid,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
@@ -63,7 +63,7 @@ int pm_watch_pid(obj_handler_t sig_hd, pid_t pid, int flags)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL5(pm_t, PM_PROT, PM_COPY_DATA, copy_data,
RPC_GENERATION_CALL5(TRUE, pm_t, PM_PROT, PM_COPY_DATA, copy_data,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, dst_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_addr,

View File

@@ -11,7 +11,7 @@
#include <stdio.h>
#include <assert.h>
RPC_GENERATION_CALL2(snd_drv_t, SND_DRV_PROT, SND_DRV_WRITE, write,
RPC_GENERATION_CALL2(TRUE, snd_drv_t, SND_DRV_PROT, SND_DRV_WRITE, write,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
int snd_drv_cli_write(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len)
@@ -27,7 +27,7 @@ int snd_drv_cli_write(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL2(snd_drv_t, SND_DRV_PROT, SND_DRV_READ, read,
RPC_GENERATION_CALL2(TRUE, snd_drv_t, SND_DRV_PROT, SND_DRV_READ, read,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
@@ -43,7 +43,7 @@ int snd_drv_cli_read(obj_handler_t dm9000_obj, obj_handler_t shm_obj)
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL1(snd_drv_t, SND_DRV_PROT, SND_DRV_MAP, map,
RPC_GENERATION_CALL1(TRUE, snd_drv_t, SND_DRV_PROT, SND_DRV_MAP, map,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
int snd_drv_cli_map(obj_handler_t dm9000_obj, obj_handler_t *sem_obj)

View File

@@ -3,4 +3,8 @@
#include "u_env.h"
#include "u_hd_man.h"
int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn, char *envp[], int envp_cn, obj_handler_t *p_sem_hd);
int app_load(const char *name, uenv_t *cur_env, pid_t *pid,
char *argv[], int arg_cn,
char *envp[], int envp_cn,
obj_handler_t *p_sem_hd,
int mem_block);

View File

@@ -0,0 +1,4 @@
#pragma once
#include <u_types.h>
int u_fast_ipc_init(uint8_t *stack_array, uint8_t *msg_buf_array, int stack_msgbuf_array_num, size_t stack_size);

View File

@@ -1,6 +0,0 @@
#pragma once
#include "u_types.h"
int cli_ns_register(const char *name, obj_handler_t hd);
int cli_ns_query(const char *name, obj_handler_t *ret_hd);

View File

@@ -441,7 +441,13 @@ RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
*/
RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
{
return len;
if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > max)
{
return -ETOLONG;
}
len = rpc_align(len, __alignof(d->data));
d->data = *((typeof(d->data) *)(buf + len));
return sizeof(d->data) + rpc_align(len, __alignof(d->data));
}
/**
* @brief Construct a new rpc type init without impl object
@@ -562,6 +568,26 @@ RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t)
} \
} \
} while (0)
/**
* @brief 服务端从map里面取出数据
*
*/
#define RPC_SVR_MAP_TO_MSG_IN(rpc_type, var_type, var, dir, buf, off, max) \
do \
{ \
if (rpc_type == RPC_TYPE_BUF) \
{ \
if (dir == RPC_DIR_IN || dir == RPC_DIR_INOUT) \
{ \
int ret = rpc_svr_buf_to_msg_##var_type(var, (uint8_t *)(buf), off, max); \
if (ret < 0) \
{ \
return msg_tag_init4(0, 0, 0, ret); \
} \
off = ret; \
} \
} \
} while (0)
/**
* @brief 填充映射数据
*

View File

@@ -11,7 +11,7 @@
* @brief 该宏用于生成一个客户端的调用函数(传递一个参数)
*
*/
#define RPC_GENERATION_CALL1(struct_type, prot, op, func_name, cli_type0, svr_type0, dir0, rpc_type0, name0) \
#define RPC_GENERATION_CALL1(is_fast, struct_type, prot, op, func_name, cli_type0, svr_type0, dir0, rpc_type0, name0) \
msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, cli_type0 *var0) \
{ \
void *buf; \
@@ -21,7 +21,7 @@
msg_ipc = (ipc_msg_t *)buf; \
\
int off = 0; \
int off_map = 0; \
int off_buf = 0; \
int ret = -1; \
umword_t op_val = op; \
/*拷贝op*/ \
@@ -29,11 +29,19 @@
off += rpc_align(sizeof(op_val), __alignof(op)); \
\
RPC_CLI_MSG_TO_BUF_IN(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->map_buf, off_map); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_map, WORD_BYTES), 0), msg_ipc);*/ \
msg_tag_t tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_map, WORD_BYTES), prot), hd, \
PRC_CLI_FILL_MAP_BUF(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc);*/ \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
\
} \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \
@@ -53,7 +61,9 @@
svr_type0 var0; \
size_t op_val; \
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); \
uint8_t *map_value = (uint8_t *)(ipc_msg->map_buf); \
int off = 0; \
int map_off = 0; \
\
RPC_TYPE_INIT_FUNC_CALL(svr_type0, &var0); \
\
@@ -63,6 +73,7 @@
off = rpc_align(off, __alignof(typeof(op))); \
\
RPC_SVR_BUF_TO_MSG_IN(rpc_type0, svr_type0, &var0, dir0, value, off, tag.msg_buf_len *WORD_BYTES); \
RPC_SVR_MAP_TO_MSG_IN(rpc_type0, svr_type0, &var0, dir0, map_value, map_off, tag.map_buf_len *WORD_BYTES); \
\
short ret_val = struct_type##_##func_name##_op(obj, &var0); \
\

View File

@@ -8,7 +8,7 @@
#include <sys/types.h>
#include <errno.h>
#define RPC_GENERATION_CALL2(struct_type, prot, op, func_name, \
#define RPC_GENERATION_CALL2(is_fast, struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1) \
msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, cli_type0 *var0, cli_type1 *var1) \
@@ -32,9 +32,17 @@
RPC_CLI_MSG_TO_BUF_IN(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
\
} \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \
@@ -54,11 +62,16 @@
svr_type1 var1; \
size_t op_val; \
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); \
uint8_t *map_value = (uint8_t *)(ipc_msg->map_buf); \
int off = 0; \
int map_off = 0; \
\
RPC_TYPE_INIT_FUNC_CALL(svr_type0, &var0); \
RPC_TYPE_INIT_FUNC_CALL(svr_type1, &var1); \
\
RPC_SVR_MAP_TO_MSG_IN(rpc_type0, svr_type0, &var0, dir0, map_value, map_off, tag.map_buf_len *WORD_BYTES); \
RPC_SVR_MAP_TO_MSG_IN(rpc_type1, svr_type1, &var1, dir1, map_value, map_off, tag.map_buf_len *WORD_BYTES); \
\
/*取得op*/ \
op_val = *((typeof(op) *)value); \
if (op_val != op) \

View File

@@ -8,7 +8,7 @@
#include <sys/types.h>
#include <errno.h>
#define RPC_GENERATION_CALL3(struct_type, prot, op, func_name, \
#define RPC_GENERATION_CALL3(is_fast, struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1, \
cli_type2, svr_type2, dir2, rpc_type2, name2) \
@@ -35,9 +35,17 @@
RPC_CLI_MSG_TO_BUF_IN(rpc_type2, cli_type2, var2, dir2, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type2, cli_type2, var2, dir2, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
\
} \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \
@@ -60,11 +68,16 @@
svr_type2 var2; \
size_t op_val; \
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); \
uint8_t *map_value = (uint8_t *)(ipc_msg->map_buf); \
int off = 0; \
int map_off = 0; \
\
RPC_TYPE_INIT_FUNC_CALL(svr_type0, &var0); \
RPC_TYPE_INIT_FUNC_CALL(svr_type1, &var1); \
RPC_TYPE_INIT_FUNC_CALL(svr_type2, &var2); \
RPC_SVR_MAP_TO_MSG_IN(rpc_type0, svr_type0, &var0, dir0, map_value, map_off, tag.map_buf_len *WORD_BYTES); \
RPC_SVR_MAP_TO_MSG_IN(rpc_type1, svr_type1, &var1, dir1, map_value, map_off, tag.map_buf_len *WORD_BYTES); \
RPC_SVR_MAP_TO_MSG_IN(rpc_type2, svr_type2, &var2, dir2, map_value, map_off, tag.map_buf_len *WORD_BYTES); \
\
/*取得op*/ \
op_val = *((typeof(op) *)value); \

View File

@@ -8,7 +8,7 @@
#include <sys/types.h>
#include <errno.h>
#define RPC_GENERATION_CALL5(struct_type, prot, op, func_name, \
#define RPC_GENERATION_CALL5(is_fast, struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1, \
cli_type2, svr_type2, dir2, rpc_type2, name2, \
@@ -41,9 +41,17 @@
RPC_CLI_MSG_TO_BUF_IN(rpc_type4, cli_type4, var4, dir4, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type4, cli_type4, var4, dir4, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
msg_tag_t tag; \
if (is_fast) \
{ \
tag = thread_ipc_fast_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), \
hd, 1111, 2222, 3333); \
} \
else \
{ \
tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
\
} \
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \

View File

@@ -1,4 +1,6 @@
#pragma once
#include "u_thread.h"
obj_handler_t rpc_hd_get(int inx);
int rpc_hd_alloc_raw(ipc_msg_t *msg);
int rpc_hd_alloc(void);

View File

@@ -0,0 +1,10 @@
.syntax unified
.thumb
.global fast_ipc_setsp
/**
* @brief syscall结束时到这儿
*/
.type fast_ipc_setsp, %function
fast_ipc_setsp:
mov sp, r1
bx lr

View File

@@ -110,7 +110,11 @@ static void *app_stack_push_array(obj_handler_t task_obj, umword_t **stack, uint
* @param name app的名字
* @return int
*/
int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn, char *envp[], int envp_cn, obj_handler_t *p_sem_hd)
int app_load(const char *name, uenv_t *cur_env, pid_t *pid,
char *argv[], int arg_cn,
char *envp[], int envp_cn,
obj_handler_t *p_sem_hd,
int mem_block)
{
msg_tag_t tag;
sys_info_t sys_info;
@@ -170,7 +174,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar
{
goto end_del_obj;
}
tag = task_alloc_ram_base(hd_task, app->i.ram_size, &ram_base);
tag = task_alloc_ram_base(hd_task, app->i.ram_size, &ram_base, mem_block);
if (msg_tag_get_prot(tag) < 0)
{
goto end_del_obj;

View File

@@ -0,0 +1,129 @@
#include <u_task.h>
#include <u_types.h>
#include <u_thread.h>
#include <u_prot.h>
#include <u_rpc_svr.h>
#include <u_rpc_buf.h>
#include <u_hd_man.h>
#include <string.h>
#include <errno.h>
int fast_ipc_setsp(int i, void *stack);
#define FAST_IPC_MAIN_STACK_SIZE 512
static ATTR_ALIGN(8) uint8_t com_stack[FAST_IPC_MAIN_STACK_SIZE];
static uint8_t cons_msg_buf_main[MSG_BUG_LEN + CONFIG_THREAD_MAP_BUF_LEN * WORD_BYTES];
static umword_t *cons_map_buf = (umword_t *)(cons_msg_buf_main + MSG_BUG_LEN);
static volatile umword_t cons_stack_bitmap;
static int stack_array_nr;
static size_t stack_item_size;
static uint8_t *cons_stack;
static uint8_t *cons_msg_buf;
static int fast_ipc_dat_copy(ipc_msg_t *dst_ipc, ipc_msg_t *src_ipc, msg_tag_t tag)
{
memcpy(dst_ipc->map_buf, src_ipc->map_buf,
MIN(tag.map_buf_len * WORD_BYTES, IPC_MSG_SIZE));
memcpy(dst_ipc->msg_buf, src_ipc->msg_buf,
MIN(tag.msg_buf_len * WORD_BYTES, IPC_MSG_SIZE));
memcpy(dst_ipc->user, src_ipc->user,
sizeof(dst_ipc->user));
}
static void update_map_buf(void)
{
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++)
{
if (cons_map_buf[i] == 0)
{
cons_map_buf[i] = vpage_create_raw3(0, 0, handler_alloc()).raw; /*TODO:申请失败检查*/
}
}
}
static msg_tag_t process_ipc(int j, umword_t obj, long tag)
{
rpc_svr_obj_t *svr_obj;
ipc_msg_t *msg;
msg_tag_t ret_tag;
int ret = 0;
msg = (ipc_msg_t *)(&cons_msg_buf[j * MSG_BUG_LEN]);
ret_tag = msg_tag_init4(0, 0, 0, -EIO);
svr_obj = (rpc_svr_obj_t *)obj;
if (svr_obj == NULL)
{
ret_tag = msg_tag_init4(0, 0, 0, -EACCES);
goto end;
}
if (svr_obj->dispatch)
{
ret_tag = svr_obj->dispatch(svr_obj, msg_tag_init(tag), msg);
}
end:
return ret_tag;
}
static void update_map_buf_last(void)
{
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++)
{
vpage_t vpage = vpage_create_raw(cons_map_buf[i]);
if (handler_is_used(vpage.addr))
{
if (task_obj_valid(TASK_THIS, vpage.addr, 0).prot == 1)
{
cons_map_buf[i] = vpage_create_raw3(0, 0, handler_alloc()).raw;
}
}
}
}
static void fast_ipc_goto_process(int j, long tag, umword_t obj, umword_t arg1, umword_t arg2)
{
msg_tag_t ret_tag;
thread_msg_buf_set(-1, (void *)(&cons_msg_buf[j * MSG_BUG_LEN]));
update_map_buf();
task_com_unlock(TASK_THIS);
ret_tag = process_ipc(j, obj, tag);
task_com_lock(TASK_THIS);
update_map_buf_last();
fast_ipc_dat_copy((void *)cons_msg_buf_main, (void *)(&cons_msg_buf[j * MSG_BUG_LEN]), ret_tag);
thread_ipc_fast_replay(ret_tag, -1, j);
}
static __attribute__((optimize(0))) void fast_ipc_com_point(msg_tag_t tag, umword_t arg0, umword_t arg1, umword_t arg2)
{
int i;
for (i = 0; i < stack_array_nr; i++)
{
if ((cons_stack_bitmap & (1 << i)) == 0)
{
cons_stack_bitmap |= (1 << i);
break;
}
}
fast_ipc_dat_copy((void *)&cons_msg_buf[i * MSG_BUG_LEN], (void *)cons_msg_buf_main, tag);
fast_ipc_goto_process(fast_ipc_setsp(i, &cons_stack[(i + 1) * stack_item_size - 8]), tag.raw, arg0, arg1, arg2);
}
int u_fast_ipc_init(uint8_t *stack_array, uint8_t *msg_buf_array, int stack_msgbuf_array_num, size_t stack_size)
{
msg_tag_t tag;
stack_array_nr = stack_msgbuf_array_num;
cons_stack = stack_array;
stack_item_size = stack_size;
cons_msg_buf = msg_buf_array;
ipc_msg_t *msg = (void *)cons_msg_buf_main;
for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++)
{
cons_map_buf[i] = vpage_create_raw3(0, 0, handler_alloc()).raw;
msg->map_buf[i] = cons_map_buf[i];
}
tag = task_set_com_point(TASK_THIS, &fast_ipc_com_point, (addr_t)com_stack,
sizeof(com_stack), (void *)(&cons_stack_bitmap),
stack_msgbuf_array_num, cons_msg_buf_main);
if (msg_tag_get_val(tag) < 0)
{
return msg_tag_get_val(tag);
}
return msg_tag_get_val(tag);
}

View File

@@ -1,93 +0,0 @@
#include "u_types.h"
#include "u_ipc.h"
#include "u_thread.h"
#include "u_prot.h"
#include "u_env.h"
#include "u_arch.h"
#include "u_util.h"
#include "u_hd_man.h"
#include <string.h>
#include <assert.h>
#include <errno.h>
enum ns_op
{
OP_REGISTER,
OP_QUERY,
};
/**
* @brief 暂时手动填充数据后期改为RPC。TODO:
*
* @param buf
* @param len
* @return int
*/
int cli_ns_register(const char *name, obj_handler_t hd)
{
ipc_msg_t *ipc_msg;
msg_tag_t tag;
void *buf;
int len = strlen(name);
len = MIN(len, IPC_MSG_SIZE - WORD_BYTES * 2 - 1);
// 获取发送数据的buf
thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL);
ipc_msg = (ipc_msg_t *)buf;
// 发送的正常数据
ipc_msg->msg_buf[0] = OP_REGISTER;
ipc_msg->msg_buf[1] = len + 1;
// 映射数据
ipc_msg->map_buf[0] = vpage_create_raw3(0, 0, hd).raw;
strncpy((char *)(&ipc_msg->msg_buf[2]), name, IPC_MSG_SIZE - WORD_BYTES * 2);
((char *)(&ipc_msg->msg_buf[2]))[IPC_MSG_SIZE - WORD_BYTES * 2 - 1] = 0;
// 发送ipc
tag = thread_ipc_call(
msg_tag_init4(0, 2 + ROUND_UP(len, WORD_BYTES), 1, 0), u_get_global_env()->ns_hd,
ipc_timeout_create2(0, 0));
return msg_tag_get_val(tag);
}
int cli_ns_query(const char *name, obj_handler_t *ret_hd)
{
ipc_msg_t *ipc_msg;
msg_tag_t tag;
void *buf;
obj_handler_t new_fd;
assert(ret_hd);
new_fd = handler_alloc();
if (new_fd == HANDLER_INVALID)
{
return -ENOMEM;
}
int len = strlen(name);
len = MIN(len, IPC_MSG_SIZE - WORD_BYTES * 2 - 1);
// 获取发送数据的buf
thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL);
ipc_msg = (ipc_msg_t *)buf;
// 发送的正常数据
ipc_msg->msg_buf[0] = OP_QUERY;
ipc_msg->msg_buf[1] = len + 1;
// 映射数据
ipc_msg->map_buf[0] = vpage_create_raw3(0, 0, new_fd).raw;
strncpy((char *)(&ipc_msg->msg_buf[2]), name, IPC_MSG_SIZE - WORD_BYTES * 2);
((char *)(&ipc_msg->msg_buf[2]))[IPC_MSG_SIZE - WORD_BYTES * 2 - 1] = 0;
// 发送ipc
tag = thread_ipc_call(
msg_tag_init4(0, 2 + ROUND_UP(len, WORD_BYTES), 0, 0), u_get_global_env()->ns_hd,
ipc_timeout_create2(0, 0));
if (msg_tag_get_val(tag) < 0)
{
handler_free_umap(new_fd);
}
return msg_tag_get_val(tag);
}

View File

@@ -24,9 +24,8 @@ obj_handler_t rpc_hd_get(int inx)
assert(inx < RPC_SVR_MAP_OBJ_NR && inx >= 0);
return buf_hd[inx];
}
int rpc_hd_alloc(void)
int rpc_hd_alloc_raw(ipc_msg_t *msg)
{
ipc_msg_t *msg;
msg_tag_t tag;
obj_handler_t hd;
bool_t alloc_new = TRUE;
@@ -62,9 +61,19 @@ int rpc_hd_alloc(void)
{
hd = tmp_hd;
}
thread_msg_buf_get(-1, (umword_t *)(&msg), NULL);
msg->map_buf[i] = vpage_create_raw3(0, 0, hd).raw;
buf_hd[i] = hd;
}
return 0;
}
int rpc_hd_alloc(void)
{
ipc_msg_t *msg;
msg_tag_t tag;
tag = thread_msg_buf_get(-1, (void *)(&msg), NULL);
if (msg_tag_get_val(tag) < 0)
{
return msg_tag_get_val(tag);
}
return rpc_hd_alloc_raw(msg);
}

View File

@@ -192,7 +192,8 @@ void rpc_loop(void)
thread_ipc_reply(tag, ipc_timeout_create2(0, 0));
}
}
#define RPC_MTD_TH_STACK_SIZE (1024+256)
#define RPC_MTD_TH_STACK_SIZE (1024 + 256)
typedef struct mtd_params
{
rpc_svr_obj_t *obj;
@@ -298,7 +299,6 @@ int rpc_mtd_loop(void)
}
uint8_t *msg_buf = (uint8_t *)stack + RPC_MTD_TH_STACK_SIZE;
int ret_val;
umword_t *stack_tmp = (umword_t *)((uint8_t *)stack + RPC_MTD_TH_STACK_SIZE);
mtd_params_t *params = (mtd_params_t *)((char *)stack + RPC_MTD_TH_STACK_SIZE + MSG_BUG_LEN);

View File

@@ -11,18 +11,28 @@
#include <assert.h>
#include <stdlib.h>
#include <getopt.h>
#include <u_fast_ipc.h>
#define STACK_COM_ITME_SIZE (1024+512)
ATTR_ALIGN(8)
uint8_t stack_coms[STACK_COM_ITME_SIZE];
uint8_t msg_buf_coms[MSG_BUG_LEN];
void fast_ipc_init(void)
{
u_fast_ipc_init(stack_coms, msg_buf_coms, 1, STACK_COM_ITME_SIZE);
}
int main(int argc, char *argv[])
{
obj_handler_t hd;
int ret;
char *mount_path = NULL;
// task_set_obj_name(TASK_THIS, TASK_THIS, "tk_cpio");
// task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_cpio");
task_set_obj_name(TASK_THIS, TASK_THIS, "tk_cpio");
task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_cpio");
for (int i = 0; i < argc; i++)
{
printf("args[%d]:%s\n", i, argv[i]);
}
fast_ipc_init();
int o;
const char *optstring = "m:"; // 有三个选项-abc其中c选项后有冒号所以后面必须有参数
while ((o = getopt(argc, argv, optstring)) != -1)

View File

@@ -78,9 +78,9 @@ int console_write(uint8_t *data, size_t len)
// /*TODO:存储到文件或者通过其他方式*/
// return -EACCES;
// }
pthread_mutex_lock(&cons_obj.w_lock);
// pthread_mutex_lock(&cons_obj.w_lock);
ulog_write_bytes(LOG_PROT, data, len);
pthread_mutex_unlock(&cons_obj.w_lock);
// pthread_mutex_unlock(&cons_obj.w_lock);
return len;
}

View File

@@ -12,7 +12,7 @@
*/
#ifdef MKRTOS_TEST_MODE
#define HEAP_SIZE (256 * 1024)
#define STACK_SIZE (4 * 1024) //(1024 + 256)
#define STACK_SIZE (2 * 1024) //(1024 + 256)
#else
#define HEAP_SIZE (2 * 1024)
#define STACK_SIZE (4 * 1024) //(1024 + 256)

View File

@@ -30,70 +30,18 @@
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <u_fast_ipc.h>
#define DEFAULT_INIT_CFG "init.cfg"
#define STACK_SIZE 2048
#define STASCK_NUM 4
static ATTR_ALIGN(8) uint8_t com_stack[512];
static ATTR_ALIGN(8) uint8_t cons_stack[STASCK_NUM][STACK_SIZE];
static uint8_t cons_msg_buf[STASCK_NUM][MSG_BUG_LEN];
static umword_t cons_stack_bitmap;
static uint8_t cons_msg_buf_main[MSG_BUG_LEN];
static inline umword_t arch_get_sp(void)
#define STACK_COM_ITME_SIZE (1024+512)
ATTR_ALIGN(8)
uint8_t stack_coms[STACK_COM_ITME_SIZE];
uint8_t msg_buf_coms[MSG_BUG_LEN];
void fast_ipc_init(void)
{
umword_t ret;
__asm__ __volatile__(
"mov %0, sp\n"
: "=r"(ret)
:
:);
return ret;
u_fast_ipc_init(stack_coms, msg_buf_coms, 1, STACK_COM_ITME_SIZE);
}
#define SET_SP(sp) \
do \
{ \
__asm__ __volatile__("mov sp, %0" ::"r"(sp)); \
__asm__ __volatile__("" \
: \
: \
: "sp"); \
} while (0)
int setsp(int i, void *stack, msg_tag_t tag, int arg0, int arg1);
void last_process(int j, msg_tag_t tag, int arg0, int arg1)
{
thread_msg_buf_set(-1, (void *)(cons_msg_buf[j]));
task_com_unlock(TASK_THIS);
// printf("j:%d sp:0x%x\n", j, arch_get_sp());
// printf("j:%d comm tag:%x r0:%d r1:%d\n", j, tag.raw, arg0, arg1);
// printf("%s\n", cons_msg_buf[j]);
// strcpy((void *)cons_msg_buf[j], "okay");
// u_sleep_ms(100);
// *((uint8_t *)0) = 0;
task_com_lock(TASK_THIS);
memcpy(cons_msg_buf_main, cons_msg_buf[j], MSG_BUG_LEN);
tag = msg_tag_init4(0, 2, 0, 0);
thread_ipc_fast_replay(tag, -1, j);
}
static void init_com_point_test_func(msg_tag_t tag, int arg0, int arg1, int arg2)
{
int i;
for (i = 0; i < STASCK_NUM; i++)
{
if ((cons_stack_bitmap & (1 << i)) == 0)
{
cons_stack_bitmap |= (1 << i);
break;
}
}
memcpy(cons_msg_buf[i], cons_msg_buf_main, MSG_BUG_LEN);
setsp(i, &cons_stack[i][STACK_SIZE - 8], tag, arg0, arg1);
}
int main(int argc, char *args[])
{
int ret;
@@ -102,9 +50,7 @@ int main(int argc, char *args[])
#if 0
thread_run(-1, 4);
#endif
task_set_com_point(TASK_THIS, &init_com_point_test_func, (addr_t)com_stack,
sizeof(com_stack), &cons_stack_bitmap, STASCK_NUM, cons_msg_buf_main);
fast_ipc_init();
task_set_obj_name(TASK_THIS, TASK_THIS, "tk_init");
task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_init");

View File

@@ -1,12 +1,12 @@
#一次读取一行,每行代表启动的应用程序
# fatfs
cpiofs -m /bin
# pin
# i2c
# pca9555
# display
# eth
# snd
# net
# nes
sh
pin
i2c
pca9555
display
eth | 1
snd | 1
net | 1
nes
sh | 1

View File

@@ -21,6 +21,7 @@
#include <cons_svr.h>
#include <u_mutex.h>
#include <u_hd_man.h>
#include <stdlib.h>
#define CMD_LEN 64 //!< 命令行最大长度
#define CMD_PARAMS_CN 8 //!< 参数个数
@@ -45,11 +46,12 @@ void parse_cfg_init(void)
}
/**
* @brief 解析命令行
*
* @return int 应用使用的内存块
*/
static void parse_cfg_cmd_line(void)
static int parse_cfg_cmd_line(void)
{
int cmd_params_inx = 0;
int mem_block = 0;
cmd_params_num = 0;
printf("cmd_line:%s\n", cmd_line);
@@ -73,7 +75,13 @@ static void parse_cfg_cmd_line(void)
break;
}
}
if (cmd_line[i] == '|')
{
cmd_line[i] = 0;
mem_block = atol(&cmd_line[i + 1]); // 获取应用使用的内存块
}
}
return mem_block;
}
/**
@@ -152,15 +160,17 @@ int parse_cfg(const char *parse_cfg_file_name, uenv_t *env)
NULL,
};
obj_handler_t hd_sem;
int mem_block;
parse_cfg_cmd_line();
mem_block = parse_cfg_cmd_line();
for (int i = 0; i < cmd_params_num; i++)
{
args[i] = &cmd_line[cmd_params_off[i]];
printf("parse_cfg args[%d] = %s\n", i, args[i]);
}
printf("parse_cfg cmd_params_num:%d\n", cmd_params_num);
int ret = app_load(cmd_line, env, &pid, args, cmd_params_num, NULL, 0, &hd_sem);
int ret = app_load(cmd_line, env, &pid, args, cmd_params_num,
NULL, 0, &hd_sem, mem_block);
if (ret < 0)
{
printf("%s load fail, 0x%x\n", cmd_line, ret);

View File

@@ -194,7 +194,7 @@ int pm_rpc_kill_task(int pid, int flags)
ns_node_del_by_pid(pid, flags); //!< 从ns中删除
pm_del_watch_by_pid(&pm, pid); //!< 从watch中删除
pm_send_sig_to_task(&pm, pid, KILL_SIG); //!< 给watch者发送sig
handler_del_umap(pid);
// handler_del_umap(pid);
printf("[pm] kill pid:%d.\n", pid);
return 0;
}
@@ -216,7 +216,7 @@ int pm_rpc_run_app(const char *path, int flags)
};
obj_handler_t sem;
ret = app_load(path, u_get_global_env(), &pid, args, 1, NULL, 0, &sem);
ret = app_load(path, u_get_global_env(), &pid, args, 1, NULL, 0, &sem, 0);
if (ret > 0)
{
if (!(flags & PM_APP_BG_RUN))

View File

@@ -1,12 +0,0 @@
.syntax unified
@ .cpu cortex-m3
.thumb
.global setsp
.global last_process
/**
* @brief syscall结束时到这儿
*/
.type setsp, %function
setsp:
mov sp, r1
bl last_process

View File

@@ -10,6 +10,16 @@
#include <u_thread.h>
#include <u_env.h>
#include <pthread.h>
#include <u_fast_ipc.h>
#define STACK_COM_ITME_SIZE (1024+512)
ATTR_ALIGN(8)
uint8_t stack_coms[STACK_COM_ITME_SIZE];
uint8_t msg_buf_coms[MSG_BUG_LEN];
void fast_ipc_init(void)
{
u_fast_ipc_init(stack_coms, msg_buf_coms, 1, STACK_COM_ITME_SIZE);
}
void *test_func(void *arg)
{
msg_tag_t tag;
@@ -46,10 +56,11 @@ int main(int argc, char *args[])
{
task_set_obj_name(TASK_THIS, TASK_THIS, "tk_sh");
task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_sh");
fast_ipc_init();
#if 0
thread_run(-1, 3);
#endif
fast_ipc_test();
// fast_ipc_test();
for (int i = 0; i < argc; i++)
{
printf("args[%d]:%s\n", i, args[i]);

View File

@@ -17,7 +17,7 @@ RPC_GENERATION_OP1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT,
return 1;
}
RPC_GENERATION_DISPATCH1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0)
RPC_GENERATION_CALL1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0)
RPC_GENERATION_CALL1(TRUE, test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0)
#endif
#if 0
RPC_GENERATION_OP2(test_svr_t, 0, query,
@@ -34,7 +34,7 @@ RPC_GENERATION_OP2(test_svr_t, 0, query,
RPC_GENERATION_DISPATCH2(test_svr_t, 0, query,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
RPC_GENERATION_CALL2(test_svr_t, 0, query,
RPC_GENERATION_CALL2(TRUE, test_svr_t, 0, query,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
@@ -62,7 +62,7 @@ RPC_GENERATION_DISPATCH2(test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
RPC_GENERATION_CALL2(test_svr_t, 0, query,
RPC_GENERATION_CALL2(TRUE, test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
@@ -86,7 +86,7 @@ RPC_GENERATION_DISPATCH2(test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
RPC_GENERATION_CALL2(test_svr_t, 0, query,
RPC_GENERATION_CALL2(TRUE, test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
@@ -107,7 +107,7 @@ RPC_GENERATION_OP2(test_svr_t, 0, 0, query,
RPC_GENERATION_DISPATCH2(test_svr_t, 0, 0, query,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
RPC_GENERATION_CALL2(test_svr_t, 0, 0, query,
RPC_GENERATION_CALL2(TRUE, test_svr_t, 0, 0, query,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)

View File

@@ -2,3 +2,4 @@ cmake_minimum_required(VERSION 3.13)
# add_subdirectory(3d_test)
# add_subdirectory(drv_test)
add_subdirectory(nes_simulator)

View File

@@ -1,5 +1,5 @@
#define HEAP_SIZE (64 * 1024)
#define HEAP_SIZE (32 * 1024)
#define STACK_SIZE (1024 * 3)
#if defined(__CC_ARM)

View File

@@ -148,7 +148,7 @@ int main(int argc, char *argv[])
{
task_set_obj_name(TASK_THIS, TASK_THIS, "tk_nes");
task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_nes");
thread_run(-1, 4);
// thread_run(-1, 4);
printf("nes init..\n");
#if 0
if (drv_iomem_init() < 0)

View File

@@ -0,0 +1,10 @@
.section .text
.balign 4
.global nes_rom
nes_rom:
.incbin "/Users/zhangzheng/mkrtos-real/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/超级马里奥兄弟3[MM之神汉化](JP)[ACT](3Mb).nes"
.global nes_rom_end
nes_rom_end:
.long 0

Some files were not shown because too many files have changed in this diff Show More