替换为fastipc
This commit is contained in:
7
.vscode/settings.json
vendored
7
.vscode/settings.json
vendored
@@ -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,
|
||||
|
||||
@@ -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 ")
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) \
|
||||
; \
|
||||
} \
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
4
mkrtos_user/lib/sys_util/inc/u_fast_ipc.h
Normal file
4
mkrtos_user/lib/sys_util/inc/u_fast_ipc.h
Normal 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);
|
||||
@@ -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);
|
||||
@@ -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 填充映射数据
|
||||
*
|
||||
|
||||
@@ -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); \
|
||||
\
|
||||
|
||||
@@ -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) \
|
||||
|
||||
@@ -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); \
|
||||
|
||||
@@ -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; \
|
||||
|
||||
@@ -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);
|
||||
|
||||
10
mkrtos_user/lib/sys_util/src/fast_ipc_setsp.S
Normal file
10
mkrtos_user/lib/sys_util/src/fast_ipc_setsp.S
Normal 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
|
||||
@@ -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;
|
||||
|
||||
129
mkrtos_user/lib/sys_util/src/u_fast_ipc.c
Normal file
129
mkrtos_user/lib/sys_util/src/u_fast_ipc.c
Normal 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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
@@ -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]);
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -2,3 +2,4 @@ cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
# add_subdirectory(3d_test)
|
||||
# add_subdirectory(drv_test)
|
||||
add_subdirectory(nes_simulator)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
#define HEAP_SIZE (64 * 1024)
|
||||
#define HEAP_SIZE (32 * 1024)
|
||||
#define STACK_SIZE (1024 * 3)
|
||||
|
||||
#if defined(__CC_ARM)
|
||||
@@ -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)
|
||||
10
mkrtos_user/user/app/ATSURFF437/nes_simulator/nes.S
Normal file
10
mkrtos_user/user/app/ATSURFF437/nes_simulator/nes.S
Normal 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
Reference in New Issue
Block a user