init
支持解析脚步中的应用并自动执行
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
4
mkrtos_user/server/init/src/init.cfg
Normal file
4
mkrtos_user/server/init/src/init.cfg
Normal file
@@ -0,0 +1,4 @@
|
||||
#一次读取一行,每行代表启动的应用程序,暂时不支持参数
|
||||
|
||||
mr_drv
|
||||
hello
|
||||
@@ -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)
|
||||
// {
|
||||
|
||||
84
mkrtos_user/server/init/src/parse_cfg.c
Normal file
84
mkrtos_user/server/init/src/parse_cfg.c
Normal 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;
|
||||
}
|
||||
5
mkrtos_user/server/init/src/parse_cfg.h
Normal file
5
mkrtos_user/server/init/src/parse_cfg.h
Normal file
@@ -0,0 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#include <u_env.h>
|
||||
|
||||
int parse_cfg(const char *parse_cfg_file_name, uenv_t *env);
|
||||
0
mkrtos_user/server/init/src/process_manager.c
Normal file
0
mkrtos_user/server/init/src/process_manager.c
Normal 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;
|
||||
|
||||
Reference in New Issue
Block a user