diff --git a/.vscode/launch.json b/.vscode/launch.json index 2e7af5a23..1d17ad202 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "cwd": "${fileDirname}", "environment": [], "externalConsole": false, - "miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb", + "miDebuggerPath": "/opt/homebrew/bin/arm-none-eabi-gdb", "miDebuggerServerAddress": "127.0.0.1:3333", "MIMode": "gdb", "setupCommands": [ diff --git a/CMakeLists.txt b/CMakeLists.txt index 55cbdf21a..49dae487a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.13) set(CMAKE_C_COMPILER_WORKS TRUE) set(CMAKE_CXX_COMPILER_WORKS TRUE) +SET(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR arm) include(setting.cmake) enable_language(ASM C CXX) project(mkrtos) diff --git a/build.sh b/build.sh index 3d289a6c1..aeb768746 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -export TOOLCHAIN=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/ -export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/lib/gcc/arm-none-eabi/5.4.1/armv7-m +export TOOLCHAIN=/opt/homebrew/bin/ +export TOOLCHAIN_LIB=/opt/homebrew/lib/gcc/arm-none-eabi/13.2.0/thumb export KNL=mkrtos export KEN_OFFSET=0x2000 export INIT_OFFSET=0x10000 diff --git a/mkrtos_user/lib/mlibc/crt/start.S b/mkrtos_user/lib/mlibc/crt/start.S index 21e6275da..8eaa04e1f 100644 --- a/mkrtos_user/lib/mlibc/crt/start.S +++ b/mkrtos_user/lib/mlibc/crt/start.S @@ -1,5 +1,5 @@ .syntax unified - .section .first, #execinstr + .section .first .globl reloc diff --git a/mkrtos_user/lib/mlibc/crt/start_init.S b/mkrtos_user/lib/mlibc/crt/start_init.S index e85b47652..7913cf52d 100644 --- a/mkrtos_user/lib/mlibc/crt/start_init.S +++ b/mkrtos_user/lib/mlibc/crt/start_init.S @@ -1,5 +1,5 @@ .syntax unified - .section .first, #execinstr + .section .first .globl reloc .globl data_offset diff --git a/mkrtos_user/lib/sys_util/inc/u_ns.h b/mkrtos_user/lib/sys_util/inc/u_ns.h new file mode 100644 index 000000000..807a36460 --- /dev/null +++ b/mkrtos_user/lib/sys_util/inc/u_ns.h @@ -0,0 +1,6 @@ +#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); diff --git a/mkrtos_user/lib/sys_util/src/u_ns.c b/mkrtos_user/lib/sys_util/src/u_ns.c new file mode 100644 index 000000000..1dc2e7b34 --- /dev/null +++ b/mkrtos_user/lib/sys_util/src/u_ns.c @@ -0,0 +1,93 @@ + + +#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 +#include +#include +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 = ipc_call(u_get_global_env()->ns_hd, + msg_tag_init4(0, 2 + ROUND_UP(len, WORD_BYTES), 1, 0), + 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 = ipc_call(u_get_global_env()->ns_hd, + msg_tag_init4(0, 2 + ROUND_UP(len, WORD_BYTES), 0, 0), + ipc_timeout_create2(0, 0)); + + if (msg_tag_get_val(tag) < 0) + { + handler_free_umap(new_fd); + } + + return msg_tag_get_val(tag); +} diff --git a/mkrtos_user/server/fs/fatfs/CMakeLists.txt b/mkrtos_user/server/fs/fatfs/CMakeLists.txt index 92d969919..3051ffbee 100644 --- a/mkrtos_user/server/fs/fatfs/CMakeLists.txt +++ b/mkrtos_user/server/fs/fatfs/CMakeLists.txt @@ -35,7 +35,7 @@ add_dependencies( ) set_target_properties( fatfs.elf PROPERTIES LINK_FLAGS - "-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds -pie --gc-section " + "-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds -pie --gc-section -no-dynamic-linker --no-warn-rwx-segments" ) add_custom_target( fatfs_dump ALL diff --git a/mkrtos_user/server/init/CMakeLists.txt b/mkrtos_user/server/init/CMakeLists.txt index 75584a881..6ae404299 100644 --- a/mkrtos_user/server/init/CMakeLists.txt +++ b/mkrtos_user/server/init/CMakeLists.txt @@ -33,7 +33,7 @@ add_dependencies(init.elf muslc ) set_target_properties(init.elf PROPERTIES LINK_FLAGS -"-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds -pie --gc-section " +"-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds -pie --gc-section -no-dynamic-linker --no-warn-rwx-segments" ) #-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds add_custom_target( diff --git a/mkrtos_user/server/init/link.lds b/mkrtos_user/server/init/link.lds index d2b6fc0f9..4c5c55b26 100644 --- a/mkrtos_user/server/init/link.lds +++ b/mkrtos_user/server/init/link.lds @@ -1,4 +1,5 @@ ENTRY(_start_) + SECTIONS { .text : { diff --git a/mkrtos_user/server/init/src/namespace.c b/mkrtos_user/server/init/src/namespace.c index b51a8c3e3..1cd323c87 100644 --- a/mkrtos_user/server/init/src/namespace.c +++ b/mkrtos_user/server/init/src/namespace.c @@ -11,13 +11,13 @@ typedef struct namespace_entry { - char path[NAMESPACE_PATH_LEN]; - obj_handler_t hd; + char path[NAMESPACE_PATH_LEN]; //!< 服务的路径名 + obj_handler_t hd; //!< 服务的fd } namespace_entry_t; typedef struct namespace { - namespace_entry_t ne_list[NAMESAPCE_NR]; + namespace_entry_t ne_list[NAMESAPCE_NR]; //!< 服务列表 } namespace_t; @@ -79,7 +79,7 @@ int ns_query(const char *path, obj_handler_t *hd) { for (int i = 0; i < NAMESAPCE_NR; i++) { - if (ns.ne_list[i].hd == HANDLER_INVALID) + if (ns.ne_list[i].hd != HANDLER_INVALID) { if (strncmp(ns.ne_list[i].path, path, NAMESPACE_PATH_LEN) == 0) { @@ -90,7 +90,7 @@ int ns_query(const char *path, obj_handler_t *hd) } return -1; } -obj_handler_t pre_alloc_hd = HANDLER_INVALID; +obj_handler_t pre_alloc_hd = HANDLER_INVALID; //!< 预备一个可用的fd int ns_pre_alloc_map_fd(ipc_msg_t *msg) { obj_handler_t hd = handler_alloc(); @@ -110,7 +110,7 @@ msg_tag_t ns_dispatch(ipc_msg_t *msg) switch (msg->msg_buf[0]) { - case OP_REGISTER: + case OP_REGISTER: //!< 服务注册 { size_t len = msg->msg_buf[1]; if (len > NAMESPACE_PATH_LEN) @@ -124,9 +124,24 @@ msg_tag_t ns_dispatch(ipc_msg_t *msg) tag = msg_tag_init4(0, 0, 0, ret); } break; - case OP_QUERY: - tag = msg_tag_init4(0, 0, 0, 0); - break; + case OP_QUERY: //!< 服务申请 + { + obj_handler_t hd; + int ret = ns_query(((char *)&(msg->msg_buf[2])), &hd); + if (ret < 0) + { + tag = msg_tag_init4(0, 0, 0, ret); + } + else + { + size_t len = msg->msg_buf[1]; + + msg->map_buf[0] = hd; + printf("query..\n"); + tag = msg_tag_init4(0, 0, 1, ret); + } + } + break; default: tag = msg_tag_init4(0, 0, 0, -ENOSYS); break; diff --git a/mkrtos_user/server/shell/CMakeLists.txt b/mkrtos_user/server/shell/CMakeLists.txt index 15412d96f..d8c4bf079 100644 --- a/mkrtos_user/server/shell/CMakeLists.txt +++ b/mkrtos_user/server/shell/CMakeLists.txt @@ -38,7 +38,7 @@ add_dependencies(shell.elf muslc ) set_target_properties(shell.elf PROPERTIES LINK_FLAGS -"-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds -pie --gc-section " +"-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds -pie --gc-section -no-dynamic-linker --no-warn-rwx-segments" ) add_custom_target( shell_dump ALL diff --git a/mkrtos_user/server/shell/link.lds b/mkrtos_user/server/shell/link.lds index d2b6fc0f9..4c5c55b26 100644 --- a/mkrtos_user/server/shell/link.lds +++ b/mkrtos_user/server/shell/link.lds @@ -1,4 +1,5 @@ ENTRY(_start_) + SECTIONS { .text : { diff --git a/mkrtos_user/server/shell/src/main.c b/mkrtos_user/server/shell/src/main.c index f8a6e1a9b..e53ac2fe4 100644 --- a/mkrtos_user/server/shell/src/main.c +++ b/mkrtos_user/server/shell/src/main.c @@ -8,11 +8,13 @@ #include "u_ipc.h" #include "u_env.h" #include "u_hd_man.h" +#include "u_ns.h" #include "test.h" #include #include #include #include + void malloc_test(void) { void *mem = malloc(1024); @@ -30,24 +32,18 @@ void malloc_test(void) } void ns_test(void) { - char *buf; - ipc_msg_t *ipc_msg; + int ret; obj_handler_t tmp_ipc_hd; tmp_ipc_hd = handler_alloc(); assert(tmp_ipc_hd != HANDLER_INVALID); msg_tag_t tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(0, 0, tmp_ipc_hd)); assert(msg_tag_get_val(tag) >= 0); - - thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL); - ipc_msg = (ipc_msg_t *)buf; - ipc_msg->msg_buf[0] = 0; - ipc_msg->msg_buf[1] = strlen("shell") + 1; - ipc_msg->map_buf[0] = vpage_create_raw3(0, 0, tmp_ipc_hd).raw; - strcpy((char *)(&ipc_msg->msg_buf[2]), "shell"); - tag = ipc_call(u_get_global_env()->ns_hd, msg_tag_init4(0, 2 + ROUND_UP(strlen("shell"), WORD_BYTES), 1, 0), ipc_timeout_create2(0, 0)); - printf("msg %d\n", tag.msg_buf_len); - handler_free_umap(tmp_ipc_hd); + ret = cli_ns_register("shell", tmp_ipc_hd); + assert(ret >= 0); + ret = cli_ns_query("shell", &tmp_ipc_hd); + assert(ret >= 0); + } int main(int argc, char *args[]) { diff --git a/setting.cmake b/setting.cmake index 0c50087b3..a25310889 100755 --- a/setting.cmake +++ b/setting.cmake @@ -25,7 +25,7 @@ set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb -O0 -g -lc -lrdimon -mfloat-abi=soft -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker \ --gc-sections -fno-stack-protector \ " CACHE STRING "" FORCE) - +message(${CMAKE_C_FLAGS}) set(CMAKE_CXX_FLAGS "-mcpu=cortex-m3 -mthumb -mno-thumb-interwork \ -mfix-cortex-m3-ldrd -O0 -g -std=c++11 \ -fmessage-length=0 -Xlinker --print-map -Wall -W -fno-stack-protector -g \