支持解析脚步中的应用并自动执行
This commit is contained in:
zhangzheng
2023-11-27 22:25:21 +08:00
parent 5fc71a7f98
commit 3a10b63e5f
14 changed files with 128 additions and 138 deletions

View File

@@ -253,7 +253,8 @@
"mutex": "c",
"__threading_support": "c",
"spinlock.h": "c",
"mr_api.h": "c"
"mr_api.h": "c",
"u_app_loader.h": "c"
},
"cortex-debug.showRTOS": false,
"cortex-debug.variableUseNaturalFormat": false,

View File

@@ -499,8 +499,10 @@ static void futex_unmap(obj_space_t *obj_space, kobject_t *kobj)
}
static void futex_release_stage1(kobject_t *kobj)
{
/*TODO:删除task所占用的futex资源*/
/*删除的任务可能不是当前任务*/
}
static bool_t futex_release_put(kobject_t *kobj)
{
return FALSE;
}
static void futex_release_stage2(kobject_t *kobj)
{
@@ -517,4 +519,5 @@ static void futex_init(futex_t *ft)
ft->kobj.unmap_func = futex_unmap;
ft->kobj.stage_1_func = futex_release_stage1;
ft->kobj.stage_2_func = futex_release_stage2;
ft->kobj.put_func = futex_release_put;
}

View File

@@ -26,7 +26,6 @@ static void print_raw(const char *str)
{
for (int i = 0; str[i]; i++)
{
// xputc(str[i]);
uart_putc(uart_get_global(), str[i]);
}
}
@@ -37,7 +36,6 @@ static void print_raw(const char *str)
*/
void putc(int c)
{
// xputc(c);
uart_putc(uart_get_global(), c);
}
int getc(void)

View File

@@ -47,7 +47,7 @@ int htoi(char *str, int len)
return n;
}
umword_t cpio_find_file(umword_t st, umword_t en, const char *name)
umword_t cpio_find_file(umword_t st, umword_t en, const char *name, umword_t *size)
{
uint8_t rByte;
int32_t bk_inx;
@@ -65,6 +65,10 @@ umword_t cpio_find_file(umword_t st, umword_t en, const char *name)
const char *f_name = (char *)(i + sizeof(cpio_fs_t));
if (strcmp(f_name, name) == 0)
{
if (size)
{
*size = htoi(file_info->c_filesize, 8);
}
return (umword_t)(ALIGN(i + sizeof(cpio_fs_t) + name_size, 4));
}

View File

@@ -31,4 +31,4 @@ static inline int64_t check_magic(char magic[6])
}
int htoi(char *str, int len);
umword_t cpio_find_file(umword_t st, umword_t en, const char *name);
umword_t cpio_find_file(umword_t st, umword_t en, const char *name, umword_t *size);

View File

@@ -24,124 +24,9 @@ RPC_GENERATION_OP2(ns_t, NS_REGISTER_OP, register,
}
return ret;
}
msg_tag_t ns_t_register_dispatch(ns_t *obj, msg_tag_t tag, ipc_msg_t *ipc_msg)
{
rpc_array_uint32_t_uint8_t_32_t var0;
rpc_obj_handler_t_t var1;
size_t op_val;
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf);
int off = 0;
rpc_var_rpc_array_uint32_t_uint8_t_32_t_init(&var0);
rpc_var_rpc_obj_handler_t_t_init(&var1);
op_val = *((typeof(((uint16_t)0)) *)value);
if (op_val != ((uint16_t)0))
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (-100)});
}
off += sizeof(typeof(((uint16_t)0)));
off = rpc_align(off, __alignof(typeof(((uint16_t)0))));
do
{
if (1 == 1)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_svr_buf_to_msg_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), 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 (2 == 1)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_svr_buf_to_msg_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), 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);
short ret_val = ns_t_register_op(obj, &var0, &var1);
if (ret_val < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret_val)});
}
off = 0;
int off_map = 0;
do
{
if (1 == 1)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), 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 (2 == 1)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), 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 == 2 || 1 == 4)
{
int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(ipc_msg->map_buf), off_map);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off_map = ret;
}
}
} while (0);
do
{
if (2 == 2)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(ipc_msg->map_buf), off_map);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off_map = ret;
}
}
} while (0);
return ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = ((((off_map) / ((sizeof(void *)))) + (((off_map) % ((sizeof(void *)))) ? 1 : 0))), .prot = (ret_val)});
}
// RPC_GENERATION_DISPATCH2(ns_t, 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_GENERATION_DISPATCH2(ns_t, 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_GENERATION_OP2(ns_t, 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,

View File

@@ -47,7 +47,7 @@ int app_load(const char *name, uenv_t *cur_env)
{
return -ENOENT;
}
umword_t addr = cpio_find_file((umword_t)sys_info.bootfs_start_addr, (umword_t)(-1), name);
umword_t addr = cpio_find_file((umword_t)sys_info.bootfs_start_addr, (umword_t)(-1), name, NULL);
if (!addr)
{

View File

@@ -57,8 +57,11 @@ add_custom_target(
cp init.bin ${CMAKE_SOURCE_DIR}/build/output/init
COMMAND
cp init.elf ${CMAKE_SOURCE_DIR}/build/output/init.elf
COMMAND
cp ${CMAKE_CURRENT_LIST_DIR}/src/init.cfg ${CMAKE_SOURCE_DIR}/build/output/cpio/
)
add_dependencies(init_dump init.elf)
add_dependencies(init.elf muslc)

View File

@@ -0,0 +1,4 @@
#一次读取一行,每行代表启动的应用程序,暂时不支持参数
mr_drv
hello

View File

@@ -16,6 +16,7 @@
#include "namespace.h"
#include "ns_svr.h"
#include "syscall_backend.h"
#include "parse_cfg.h"
#include <assert.h>
#include <stdio.h>
extern void futex_init(void);
@@ -43,22 +44,24 @@ int main(int argc, char *args[])
uenv_t env = *u_get_global_env();
env.ns_hd = namespace_init();
int ret;
ret = ret;
ret = app_load("mr_drv", &env);
if (ret < 0)
{
printf("%s load fail, 0x%x\n", "mr_drv", ret);
}
ret = parse_cfg("init.cfg", &env);
printf("run app num is %d.\n", ret);
// ret = app_load("mr_drv", &env);
// if (ret < 0)
// {
// printf("%s load fail, 0x%x\n", "mr_drv", ret);
// }
// ret = app_load("rtthread_drv", &env);
// if (ret < 0)
// {
// printf("%s load fail, 0x%x\n", "mr_drv", ret);
// }
ret = app_load("hello", &env);
if (ret < 0)
{
printf("%s load fail, 0x%x\n", "hello", ret);
}
// ret = app_load("hello", &env);
// if (ret < 0)
// {
// printf("%s load fail, 0x%x\n", "hello", ret);
// }
// ret = app_load("app", &env);
// if (ret < 0)
// {

View File

@@ -0,0 +1,84 @@
/**
* @file parse_cfg.c
* @author zhangzheng (1358745329@qq.com)
* @brief
* @version 0.1
* @date 2023-11-27
*
* @copyright Copyright (c) 2023
*
*/
#include <u_types.h>
#include <u_prot.h>
#include <u_sys.h>
#include <errno.h>
#include <stdio.h>
#include <cpiofs.h>
#include <u_app_loader.h>
#include <u_env.h>
#include <string.h>
static int find_line_end(const char *str, size_t size)
{
for (int i = 0; i < size; i++)
{
if (str[i] == '\n')
{
return i + 1;
}
}
return size;
}
int parse_cfg(const char *parse_cfg_file_name, uenv_t *env)
{
int run_cn = 0;
msg_tag_t tag;
sys_info_t sys_info;
tag = sys_read_info(SYS_PROT, &sys_info);
if (msg_tag_get_val(tag) < 0)
{
printf("read info is errno.\n");
return -ENOENT;
}
umword_t size;
const char *str = (const char *)cpio_find_file((umword_t)sys_info.bootfs_start_addr, (umword_t)(-1), parse_cfg_file_name, &size);
if (!str)
{
return -ENOENT;
}
for (int i = 0; i < size;)
{
int line_inx = find_line_end(str + i, size - i);
if (str[i] != '#')
{
if (strlen(&str[i]) != 0 && str[i] != '\n')
{
char name[32];
strncpy(name, &str[i], MIN(line_inx, sizeof(name)));
if (line_inx + i >= size && str[i + line_inx - 1] != '\n')
{
name[MIN(line_inx + 1, sizeof(name)) - 1] = 0;
}
else
{
name[MIN(line_inx, sizeof(name)) - 1] = 0;
}
int ret = app_load(name, env);
if (ret < 0)
{
printf("%s load fail, 0x%x\n", name, ret);
}
else
{
run_cn++;
}
}
}
i += line_inx;
}
return run_cn;
}

View File

@@ -0,0 +1,5 @@
#pragma once
#include <u_env.h>
int parse_cfg(const char *parse_cfg_file_name, uenv_t *env);

View File

@@ -27,7 +27,7 @@ umword_t app_stack_push(umword_t *stack, umword_t val)
void app_test(void)
{
msg_tag_t tag;
umword_t addr = cpio_find_file((umword_t)0x8020000, (umword_t)0x8040000, TEST_APP_NAME);
umword_t addr = cpio_find_file((umword_t)0x8020000, (umword_t)0x8040000, TEST_APP_NAME, NULL);
assert(addr);
app_info_t *app = (app_info_t *)addr;