diff --git a/.vscode/settings.json b/.vscode/settings.json index 8e33fb29f..f75ac40f7 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -193,10 +193,11 @@ "mman.h": "c", "sockets.h": "c", "socket.h": "c", - "net_svr.h": "c" + "net_svr.h": "c", + "inet.h": "c" }, "cortex-debug.showRTOS": false, - "cortex-debug.variableUseNaturalFormat": false, + "cortex-debug.variableUseNaturalFormat": true, "C_Cpp.default.systemIncludePath": [""], "C_Cpp.default.forcedInclude": ["${workspaceFolder}/build/autoconf.h"] } \ No newline at end of file diff --git a/TODO.md b/TODO.md index 9a8ef653f..1d1518497 100644 --- a/TODO.md +++ b/TODO.md @@ -6,10 +6,15 @@ * [x] 完善mpu缺页模拟支持,红黑树管理,支持整块或者分块缺页支持。 * [x] 内存管理对象mpu支持完善(在缺页时自动映射)。 * [x] 一种新的ipc机制(暂时取名fastipc),不切上下文,只切内存,流程更加简单,解决原来ipc优先级问题,以及并发性问题。 +* [x] cpu占用率支持 * [ ] 进程管理机制完善,进程状态订阅,进程间信号发送。 * [ ] 内核信号量对象完善(支持优先级反转,支持超时)。 * [ ] FPU完善支持,目前版本偶发压栈错误 -* [ ] cpu占用率支持 +* [ ] console 支持自动切换 +* [ ] 重构路径管理 +* [ ] 线程占用率统计 +* [ ] 去除原来的ipc机制(使用fastipc机制),并单独实现sleep接口,目前的ipc有概率卡死问题 +* [ ] 几大组件稳定性测试 ### mid prio * [ ] net server support * [x] block driver @@ -19,10 +24,10 @@ * [x] pca9555 driver * [x] pin drvier * [x] snd drvier +* [ ] ymodem support ### low prio - [ ] toybox support - [ ] ota support -- [ ] ymodem support - [ ] lvgl support - [ ] modubs support diff --git a/armv7_8.cmake b/armv7_8.cmake index 1cc1dd41c..bc66b8b21 100644 --- a/armv7_8.cmake +++ b/armv7_8.cmake @@ -1,6 +1,6 @@ message("========use armv7_8.cmake") -set(CMAKE_C_FLAGS "-mcpu=${CONFIG_ARCH} -Ofast -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -mthumb -DMKRTOS \ +set(CMAKE_C_FLAGS "-mcpu=${CONFIG_ARCH} -O0 -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -mthumb -DMKRTOS \ -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin -u=_printf_float \ -nostartfiles -nodefaultlibs -nostdlib -nostdinc \ -fno-stack-protector -Wl,--gc-section -D__ARM_ARCH_7M__ \ @@ -8,7 +8,7 @@ set(CMAKE_C_FLAGS "-mcpu=${CONFIG_ARCH} -Ofast -g3 -mfloat-abi=${CONFIG_FLOAT_TY " CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS "-mcpu=${CONFIG_ARCH} -Ofast -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -mthumb -DMKRTOS -std=c++11 \ --fmessage-length=0 -Xlinker --print-map -Wall -W -fno-stack-protector -g \ +-fmessage-length=0 -Xlinker --print-map -Wall -W -fno-stack-protector \ -u=_printf_float -D__ARM_ARCH_7M__ \ -ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker \ -include ${CMAKE_SOURCE_DIR}/build/autoconf.h \ @@ -27,8 +27,8 @@ if (${CONFIG_FLOAT_TYPE} STREQUAL "hard") endif() if (${CONFIG_FLOAT_TYPE} STREQUAL "softfp") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMKRTOS_USE_FPU ") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMKRTOS_USE_FPU ") - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -DMKRTOS_USE_FPU ") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ") endif() diff --git a/mkrtos_configs/ATSURFF437_defconfig b/mkrtos_configs/ATSURFF437_defconfig index 04c9e7b2f..f1f541a49 100644 --- a/mkrtos_configs/ATSURFF437_defconfig +++ b/mkrtos_configs/ATSURFF437_defconfig @@ -9,7 +9,7 @@ CONFIG_SYS_DATA_ADDR=0x20000000 CONFIG_SYS_DATA_SIZE=0x60000 CONFIG_BOOTSTRAP_TEXT_SIZE=0x3000 CONFIG_DTBO_TEXT_SIZE=0x1000 -CONFIG_KNL_TEXT_SIZE=0x30000 +CONFIG_KNL_TEXT_SIZE=0x10000 CONFIG_MPU=y CONFIG_FT_ADDR_NR=16 @@ -45,7 +45,7 @@ CONFIG_BOARD_NAME="ATSURFF437" CONFIG_BUDDY_SLAB=n CONFIG_SMP=n CONFIG_CPU=1 -CONFIG_THREAD_BLOCK_SIZE=0x800 +CONFIG_THREAD_BLOCK_SIZE=0x400 CONFIG_PAGE_SHIFT=9 CONFIG_MMU=n CONFIG_KNL_TEST=n diff --git a/mkrtos_img/CMakeLists.txt b/mkrtos_img/CMakeLists.txt index 1e6509cc3..4f710db06 100755 --- a/mkrtos_img/CMakeLists.txt +++ b/mkrtos_img/CMakeLists.txt @@ -59,9 +59,14 @@ add_dependencies(mkrtos_img_dump bootstrap_dump mkrtos_dump init_dump + nes_dump # app_dump shell_dump # fatfs_dump - cpiofs_dump + appfs_dump + vi_dump + tst_dump + eth_dump + net_dump # tcc_dump ) \ No newline at end of file diff --git a/mkrtos_knl/arch/cortex-m4/link.lds b/mkrtos_knl/arch/cortex-m4/link.lds index 28861c727..ee27d1a43 100644 --- a/mkrtos_knl/arch/cortex-m4/link.lds +++ b/mkrtos_knl/arch/cortex-m4/link.lds @@ -2,7 +2,7 @@ ENTRY(Reset_Handler) MEMORY { RAM (arw) : ORIGIN = 0x20000000, LENGTH = 0x60000 - FLASH (arx) : ORIGIN = 0x8000000 + 0x3000 + 0x1000, LENGTH = 0x30000 + FLASH (arx) : ORIGIN = 0x8000000 + 0x3000 + 0x1000, LENGTH = 0x10000 } SECTIONS { diff --git a/mkrtos_knl/drivers/at32f437/systick/systick.c b/mkrtos_knl/drivers/at32f437/systick/systick.c index e5ab94df5..3cbaca968 100755 --- a/mkrtos_knl/drivers/at32f437/systick/systick.c +++ b/mkrtos_knl/drivers/at32f437/systick/systick.c @@ -2,6 +2,7 @@ #include "arch.h" #include "thread.h" #include "futex.h" +#include "thread_knl.h" static umword_t sys_tick_cnt; umword_t sys_tick_cnt_get(void) @@ -13,9 +14,13 @@ void SysTick_Handler(void) { umword_t status = cpulock_lock(); // 进行上下文切换 - thread_sched(TRUE); + if (!thread_sched(TRUE)) + { + atomic_inc(&thread_get_current()->time_count); + } sys_tick_cnt++; thread_timeout_check(1); futex_timeout_times_tick(); cpulock_set(status); + thread_calc_cpu_usage(); } diff --git a/mkrtos_knl/drivers/stm32f1/systick/systick.c b/mkrtos_knl/drivers/stm32f1/systick/systick.c index 2acf73393..7c5e5da98 100755 --- a/mkrtos_knl/drivers/stm32f1/systick/systick.c +++ b/mkrtos_knl/drivers/stm32f1/systick/systick.c @@ -2,6 +2,7 @@ #include "arch.h" #include "thread.h" #include "futex.h" +#include "thread_knl.h" static umword_t sys_tick_cnt; umword_t sys_tick_cnt_get(void) @@ -16,4 +17,5 @@ void SysTick_Handler(void) sys_tick_cnt++; thread_timeout_check(1); futex_timeout_times_tick(); + thread_calc_cpu_usage(); } diff --git a/mkrtos_knl/drivers/stm32f4/systick/systick.c b/mkrtos_knl/drivers/stm32f4/systick/systick.c index 2acf73393..7c5e5da98 100755 --- a/mkrtos_knl/drivers/stm32f4/systick/systick.c +++ b/mkrtos_knl/drivers/stm32f4/systick/systick.c @@ -2,6 +2,7 @@ #include "arch.h" #include "thread.h" #include "futex.h" +#include "thread_knl.h" static umword_t sys_tick_cnt; umword_t sys_tick_cnt_get(void) @@ -16,4 +17,5 @@ void SysTick_Handler(void) sys_tick_cnt++; thread_timeout_check(1); futex_timeout_times_tick(); + thread_calc_cpu_usage(); } diff --git a/mkrtos_knl/drivers/swm34s/systick/systick.c b/mkrtos_knl/drivers/swm34s/systick/systick.c index 2acf73393..7c5e5da98 100755 --- a/mkrtos_knl/drivers/swm34s/systick/systick.c +++ b/mkrtos_knl/drivers/swm34s/systick/systick.c @@ -2,6 +2,7 @@ #include "arch.h" #include "thread.h" #include "futex.h" +#include "thread_knl.h" static umword_t sys_tick_cnt; umword_t sys_tick_cnt_get(void) @@ -16,4 +17,5 @@ void SysTick_Handler(void) sys_tick_cnt++; thread_timeout_check(1); futex_timeout_times_tick(); + thread_calc_cpu_usage(); } diff --git a/mkrtos_knl/inc/knl/scheduler.h b/mkrtos_knl/inc/knl/scheduler.h index 035b884d1..837eb44ae 100755 --- a/mkrtos_knl/inc/knl/scheduler.h +++ b/mkrtos_knl/inc/knl/scheduler.h @@ -32,7 +32,7 @@ typedef struct scheduler slist_head_t prio_list[PRIO_MAX]; umword_t bitmap[PRIO_MAX / WORD_BITS]; sched_t *cur_sche; - int max_prio; + int max_prio; //msg.msg, }; - ret = stack_push(&th->fast_ipc_stack, &item); + ret = stack_push(&th->com->fast_ipc_stack, &item); if (ret < 0) { return ret; @@ -245,7 +250,7 @@ static inline int thread_fast_ipc_restore(thread_t *th) assert(th); thread_fast_ipc_item_t item; - ret = stack_pop(&th->fast_ipc_stack, &item); + ret = stack_pop(&th->com->fast_ipc_stack, &item); if (ret < 0) { return ret; @@ -261,7 +266,7 @@ static inline int thread_fast_ipc_pop(thread_t *th, thread_fast_ipc_item_t *item assert(th); assert(item); - ret = stack_pop(&th->fast_ipc_stack, item); + ret = stack_pop(&th->com->fast_ipc_stack, item); return ret; } diff --git a/mkrtos_knl/knl/irq.c b/mkrtos_knl/knl/irq.c index 37e708ae9..90b3b1ee0 100755 --- a/mkrtos_knl/knl/irq.c +++ b/mkrtos_knl/knl/irq.c @@ -90,12 +90,7 @@ __USED void entry_handler(void) { umword_t isr_no = arch_get_isr_no(); - if (isr_no < 0) - { - return; - } isr_no -= CONFIG_USER_ISR_START_NO; //!< 系统用的irq偏移 - if (isr_no >= CONFIG_IRQ_REG_TAB_SIZE) { assert(isr_no < CONFIG_IRQ_REG_TAB_SIZE); diff --git a/mkrtos_knl/knl/share_mem.c b/mkrtos_knl/knl/share_mem.c index 22516c13a..502d515d8 100644 --- a/mkrtos_knl/knl/share_mem.c +++ b/mkrtos_knl/knl/share_mem.c @@ -464,7 +464,7 @@ static void share_mem_release_stage2(kobject_t *kobj) { share_mem_t *sm = container_of(kobj, share_mem_t, kobj); - assert(dlist_is_empty(&sm->task_head)); + assert(dlist_is_empty(&sm->task_head));//TODO:有bug #if IS_ENABLED(CONFIG_MMU) share_mem_free_pmem(sm); diff --git a/mkrtos_knl/knl/task.c b/mkrtos_knl/knl/task.c index d8c23111c..09e9c35cd 100755 --- a/mkrtos_knl/knl/task.c +++ b/mkrtos_knl/knl/task.c @@ -503,9 +503,9 @@ static void task_release_stage1(kobject_t *kobj) thread_t *restore_th; thread_fast_ipc_item_t ipc_item; - slist_foreach(restore_th, &tk->nofity_theads_head, fast_ipc_node) + slist_foreach(restore_th->com, &tk->nofity_theads_head, fast_ipc_node) { - ret = thread_fast_ipc_pop(restore_th, &ipc_item); + ret = thread_fast_ipc_pop(restore_th, &ipc_item);/*TODO:这里有问题*/ if (ret >= 0) { // 还原栈和usp TODO: arch相关的 diff --git a/mkrtos_knl/knl/thread.c b/mkrtos_knl/knl/thread.c index 1a0e35977..a2348c263 100755 --- a/mkrtos_knl/knl/thread.c +++ b/mkrtos_knl/knl/thread.c @@ -120,19 +120,24 @@ INIT_KOBJ_MEM(thread_mem_init); */ void thread_init(thread_t *th, ram_limit_t *lim, umword_t flags) { + assert(th); + assert(th->com); + assert(lim); kobject_init(&th->kobj, THREAD_TYPE); sched_init(&th->sche); slist_init(&th->futex_node); slist_init(&th->wait_send_head); - slist_init(&th->fast_ipc_node); spinlock_init(&th->recv_lock); spinlock_init(&th->send_lock); ref_counter_init(&th->ref); ref_counter_inc(&th->ref); thread_arch_init(th, flags); - stack_init(&th->fast_ipc_stack, &th->fast_ipc_stack_data, - ARRARY_LEN(th->fast_ipc_stack_data), - sizeof(th->fast_ipc_stack_data[0])); + + slist_init(&th->com->fast_ipc_node); + stack_init(&th->com->fast_ipc_stack, &th->com->fast_ipc_stack_data, + ARRARY_LEN(th->com->fast_ipc_stack_data), + sizeof(th->com->fast_ipc_stack_data[0])); + th->cpu = arch_get_current_cpu_id(); th->lim = lim; th->kobj.invoke_func = thread_syscall; @@ -365,7 +370,6 @@ bool_t thread_sched(bool_t is_sche) assert(th->magic == THREAD_MAGIC); if (next_sche == &th->sche) { - atomic_inc(&th->time_count); //!< 线程没有发生变化,则不用切换 cpulock_set(status); return FALSE; @@ -482,8 +486,15 @@ thread_t *thread_create(ram_limit_t *ram, umword_t flags) { return NULL; } - // assert(((mword_t)th & (~(CONFIG_THREAD_BLOCK_SIZE - 1))) == 0); memset(th, 0, CONFIG_THREAD_BLOCK_SIZE); + th->com = mm_limit_alloc(ram, sizeof(*th->com)); + if (!th->com) + { + mm_limit_free(ram, th); + return NULL; + } + // assert(((mword_t)th & (~(CONFIG_THREAD_BLOCK_SIZE - 1))) == 0); + memset(th->com, 0, sizeof(*th->com)); thread_init(th, ram, flags); printk("create thread 0x%x\n", th); return th; @@ -1205,14 +1216,14 @@ _to_unlock: if (ret >= 0) { dst_ipc->user[2] = task_pid_get(cur_task); // 设置pid - slist_add(&to_task->nofity_theads_head, &cur_th->fast_ipc_node); // 添加到链表中,用于进程关闭时进行释放 + slist_add(&to_task->nofity_theads_head, &cur_th->com->fast_ipc_node); // 添加到链表中,用于进程关闭时进行释放 pf_s_t *usr_stask_point = (void *)arch_get_user_sp(); if (thread_is_knl(cur_th)) { // 如果是内核线程则全部重新设置 thread_set_user_pf_noset_knl_sp(cur_th, to_task->nofity_point, - (void *)to_task->nofity_stack, (void *)to_task->mm_space.mm_block); + (void *)to_task->nofity_stack, (void *)to_task->mm_space.mm_block); usr_stask_point->rg0[0] = in_tag.raw; usr_stask_point->rg0[1] = user_id; usr_stask_point->rg0[2] = f->regs[2]; @@ -1273,7 +1284,7 @@ msg_tag_t thread_fast_ipc_replay(entry_frame_t *f) int ret; *(cur_task->nofity_bitmap) &= ~(1 << MIN(f->regs[2], cur_task->nofity_bitmap_len)); //!< 解锁bitmap - slist_del(&cur_th->fast_ipc_node); // 从链表中删除 + slist_del(&cur_th->com->fast_ipc_node); // 从链表中删除 ret = thread_fast_ipc_restore(cur_th); // 还原栈和usp if (ret < 0) diff --git a/mkrtos_knl/knl/thread_knl.c b/mkrtos_knl/knl/thread_knl.c index 39efd701c..67adf74b6 100755 --- a/mkrtos_knl/knl/thread_knl.c +++ b/mkrtos_knl/knl/thread_knl.c @@ -43,6 +43,7 @@ #include "pre_cpu.h" static uint8_t knl_msg_buf[CONFIG_CPU][THREAD_MSG_BUG_LEN]; +static thread_fast_ipc_com_t knl_th_ipc_com; static task_t knl_task; static thread_t *init_thread; static task_t *init_task; @@ -158,6 +159,7 @@ void knl_init_1(void) knl_thread[arch_get_current_cpu_id()] = thread_get_current(); knl_th = knl_thread[arch_get_current_cpu_id()]; + knl_th->com = &knl_th_ipc_com; thread_init(knl_th, &root_factory_get()->limit, FALSE); task_init(&knl_task, &root_factory_get()->limit, TRUE); task_knl_init(&knl_task); @@ -257,7 +259,7 @@ static void knl_init_2(void) assert(obj_map_root(kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, i))); } } - init_thread->sche.prio = 15; + init_thread->sche.prio = 3; init_task->pid = 0; thread_ready(init_thread, FALSE); #endif @@ -274,7 +276,7 @@ bool_t task_knl_kill(thread_t *kill_thread, bool_t is_knl) umword_t status2; status2 = spinlock_lock(&del_lock); - if (stack_len(&kill_thread->fast_ipc_stack) != 0) + if (stack_len(&kill_thread->com->fast_ipc_stack) != 0) { int ret; thread_fast_ipc_item_t ipc_item; diff --git a/mkrtos_script/build_at32f437.sh b/mkrtos_script/build_at32f437.sh index 8a987bb58..10656b19f 100755 --- a/mkrtos_script/build_at32f437.sh +++ b/mkrtos_script/build_at32f437.sh @@ -1,15 +1,15 @@ #!/bin/bash -export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/ -export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp +# export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/ +# export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp # linux build # 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/armv7e-m/fpu # mac compile -# export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/ -# export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/softfp +export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/ +export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/softfp # windows compile # export TOOLCHAIN=/d/GNUArmEmbeddedToolchain/102021.10/bin/ diff --git a/mkrtos_user/CMakeLists.txt b/mkrtos_user/CMakeLists.txt index 52361c45a..5051e355d 100644 --- a/mkrtos_user/CMakeLists.txt +++ b/mkrtos_user/CMakeLists.txt @@ -8,18 +8,18 @@ if (${CONFIG_ARCH} STREQUAL "cortex-m3" OR # -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ -fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ - -z max-page-size=0x4 -z common-page-size=0x4 \ + \ " ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \ -fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ - -z max-page-size=0x4 -z common-page-size=0x \ + \ " ) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} \ -fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ - -z max-page-size=0x4 -z common-page-size=0x4 \ + \ " ) - #-Ttext-segment=0x0 - set(CORTEX_M_LINK_FLAGS "-pie -z max-page-size=0x4 -z common-page-size=0x4 ") + #-Ttext-segment=0x0 -z max-page-size=0x4 -z common-page-size=0x4 + set(CORTEX_M_LINK_FLAGS "-pie ") set(LIBC_NAME "muslc") set(ARCH_NAME "armv7_8m") diff --git a/mkrtos_user/lib/CMakeLists.txt b/mkrtos_user/lib/CMakeLists.txt index 08f397f50..3e8bb5c9c 100644 --- a/mkrtos_user/lib/CMakeLists.txt +++ b/mkrtos_user/lib/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.13) if (${ARCH_NAME} STREQUAL "armv7_8m") # add_subdirectory(modbus) add_subdirectory(mlibc) - add_subdirectory(mlibc_shared) + # add_subdirectory(mlibc_shared) add_subdirectory(mr) # add_subdirectory(at_device) elseif(${CONFIG_ARCH} STREQUAL "aarch64") diff --git a/mkrtos_user/lib/letter-shell/src/shell.c b/mkrtos_user/lib/letter-shell/src/shell.c index f443a378a..ee532a72f 100644 --- a/mkrtos_user/lib/letter-shell/src/shell.c +++ b/mkrtos_user/lib/letter-shell/src/shell.c @@ -1461,7 +1461,7 @@ void shellExec(Shell *shell) params_len += strlen(shell->parser.param[i]) + 1; } //!< 内建命令中未找到,则执行应用 - if (pm_run_app(shell->parser.param[0], 0/*PM_APP_BG_RUN*/, params, params_len) < 0) + if (pm_run_app(shell->parser.param[0], PM_APP_BG_RUN/*PM_APP_BG_RUN*/, params, params_len) < 0) { shellWriteString(shell, shellText[SHELL_TEXT_CMD_NOT_FOUND]); } diff --git a/mkrtos_user/lib/lwip/CMakeLists.txt b/mkrtos_user/lib/lwip/CMakeLists.txt index aa904ff53..8769e13f2 100644 --- a/mkrtos_user/lib/lwip/CMakeLists.txt +++ b/mkrtos_user/lib/lwip/CMakeLists.txt @@ -11,7 +11,7 @@ file(GLOB ${CMAKE_CURRENT_LIST_DIR}/src/apps/lwiperf/lwiperf.c ) -message("lwip:${deps}") +# message("lwip:${deps}") add_library( lwip ${deps} diff --git a/mkrtos_user/lib/lwip/src/include/lwip/sockets.h b/mkrtos_user/lib/lwip/src/include/lwip/sockets.h index b6f3d524f..3e3db2337 100644 --- a/mkrtos_user/lib/lwip/src/include/lwip/sockets.h +++ b/mkrtos_user/lib/lwip/src/include/lwip/sockets.h @@ -65,8 +65,12 @@ extern "C" { /* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED to prevent this code from redefining it. */ #if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED) +#ifdef MKRTOS +typedef u16_t sa_family_t; +#else typedef u8_t sa_family_t; #endif +#endif /* If your port already typedef's in_port_t, define IN_PORT_T_DEFINED to prevent this code from redefining it. */ #if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED) @@ -334,6 +338,9 @@ typedef struct ip_mreq { #if LWIP_IPV4 struct in_pktinfo { unsigned int ipi_ifindex; /* Interface index */ + #ifdef MKRTOS + struct in_addr ipi_spec_dst; + #endif struct in_addr ipi_addr; /* Destination (from header) address */ }; #endif /* LWIP_IPV4 */ diff --git a/mkrtos_user/lib/mlibc/include/netinet/in.h b/mkrtos_user/lib/mlibc/include/netinet/in.h index fb628b61a..437b38044 100644 --- a/mkrtos_user/lib/mlibc/include/netinet/in.h +++ b/mkrtos_user/lib/mlibc/include/netinet/in.h @@ -14,6 +14,9 @@ typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { +#ifdef MKRTOS + uint8_t sin_len; +#endif sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; diff --git a/mkrtos_user/lib/mlibc/include/pthread.h b/mkrtos_user/lib/mlibc/include/pthread.h index ea9b6f4e3..84b1cd04d 100644 --- a/mkrtos_user/lib/mlibc/include/pthread.h +++ b/mkrtos_user/lib/mlibc/include/pthread.h @@ -80,6 +80,7 @@ extern "C" { #include obj_handler_t pthread_hd_get(pthread_t th); +size_t pthread_struct_size(void); int pthread_create(pthread_t *__restrict, const pthread_attr_t *__restrict, void *(*)(void *), void *__restrict); int pthread_detach(pthread_t); _Noreturn void pthread_exit(void *); diff --git a/mkrtos_user/lib/mlibc/include/sys/socket.h b/mkrtos_user/lib/mlibc/include/sys/socket.h index 6dc1e40ad..2b7771094 100644 --- a/mkrtos_user/lib/mlibc/include/sys/socket.h +++ b/mkrtos_user/lib/mlibc/include/sys/socket.h @@ -367,11 +367,17 @@ struct linger { #define SCM_CREDENTIALS 0x02 struct sockaddr { +#ifdef MKRTOS + unsigned char sa_len; +#endif sa_family_t sa_family; char sa_data[14]; }; struct sockaddr_storage { +#ifdef MKRTOS + unsigned char sa_len; +#endif sa_family_t ss_family; char __ss_padding[128-sizeof(long)-sizeof(sa_family_t)]; unsigned long __ss_align; diff --git a/mkrtos_user/lib/mlibc/src/thread/pthread_mkrtos.c b/mkrtos_user/lib/mlibc/src/thread/pthread_mkrtos.c index 680440728..7938e4808 100644 --- a/mkrtos_user/lib/mlibc/src/thread/pthread_mkrtos.c +++ b/mkrtos_user/lib/mlibc/src/thread/pthread_mkrtos.c @@ -5,3 +5,8 @@ obj_handler_t pthread_hd_get(pthread_t th) { return th->hd; } + +size_t pthread_struct_size(void) +{ + return sizeof(struct pthread); +} \ No newline at end of file diff --git a/mkrtos_user/lib/sys_svr/src/net_cli.c b/mkrtos_user/lib/sys_svr/src/net_cli.c index bb66a601b..4d3369377 100644 --- a/mkrtos_user/lib/sys_svr/src/net_cli.c +++ b/mkrtos_user/lib/sys_svr/src/net_cli.c @@ -47,7 +47,7 @@ int net_accept(sd_t s, struct sockaddr *addr, socklen_t *addrlen) obj_handler_t hd = mk_sd_init_raw(s).hd; int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_socketaddr_t_t rpc_addr = { .data = *addr, @@ -80,7 +80,7 @@ int net_bind(int s, const struct sockaddr *name, socklen_t namelen) obj_handler_t hd = mk_sd_init_raw(s).hd; int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_socketaddr_t_t rpc_addr = { .data = *name, @@ -101,7 +101,7 @@ int net_shutdown(int s, int how) obj_handler_t hd = mk_sd_init_raw(s).hd; int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_int_t rpc_how = { .data = how, @@ -128,7 +128,7 @@ int net_getpeername(int s, struct sockaddr *name, socklen_t *namelen) obj_handler_t hd = mk_sd_init_raw(s).hd; int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_socketaddr_t_t rpc_name = { .data = *name, @@ -164,7 +164,7 @@ int net_getsockname(int s, struct sockaddr *name, socklen_t *namelen) obj_handler_t hd = mk_sd_init_raw(s).hd; int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_socketaddr_t_t rpc_name = { .data = *name, @@ -203,7 +203,7 @@ int net_getsockopt(int s, int level, int optname, void *optval, socklen_t *optle int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_int_t rpc_level = { .data = level, @@ -245,7 +245,7 @@ int net_setsockopt(int s, int level, int optname, const void *optval, socklen_t int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_int_t rpc_level = { .data = level, @@ -282,7 +282,7 @@ int net_connect(int s, const struct sockaddr *name, socklen_t namelen) obj_handler_t hd = mk_sd_init_raw(s).hd; int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_socketaddr_t_t rpc_name = { .data = *name, @@ -303,7 +303,7 @@ int net_listen(int s, int backlog) obj_handler_t hd = mk_sd_init_raw(s).hd; int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_int_t rpc_backlog = { .data = backlog, @@ -328,7 +328,7 @@ int net_recv(int s, void *mem, size_t len, int flags) int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_int_t rpc_flags = { @@ -383,7 +383,7 @@ int net_recvfrom(int s, void *mem, size_t len, int flags, int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_int_t rpc_flags = { @@ -442,7 +442,7 @@ int net_send(int s, const void *dataptr, size_t size, int flags) int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_int_t rpc_flags = { @@ -498,7 +498,7 @@ int net_sendto(int s, const void *dataptr, size_t size, int flags, int fd = mk_sd_init_raw(s).fd; rpc_int_t rpc_s = { - .data = s, + .data = fd, }; rpc_int_t rpc_flags = { @@ -573,5 +573,9 @@ int net_socket(int domain, int type, int protocol) msg_tag_t tag; tag = net_t_socket_call(hd, &rpc_domain, &rpc_type, &rpc_protocol); - return msg_tag_get_val(tag); + if (msg_tag_get_val(tag) < 0) + { + return msg_tag_get_val(tag); + } + return mk_sd_init2(hd, msg_tag_get_val(tag)).raw; } \ No newline at end of file diff --git a/mkrtos_user/lib/sys_util/src/u_fast_ipc.c b/mkrtos_user/lib/sys_util/src/u_fast_ipc.c index 288681b36..ca4fb36f3 100644 --- a/mkrtos_user/lib/sys_util/src/u_fast_ipc.c +++ b/mkrtos_user/lib/sys_util/src/u_fast_ipc.c @@ -19,7 +19,7 @@ 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 uint8_t fake_pthread[256/*FIXME:*/]; static int stack_array_nr; static size_t stack_item_size; static uint8_t *cons_stack; @@ -131,6 +131,7 @@ int u_fast_ipc_init(uint8_t *stack_array, uint8_t *msg_buf_array, int stack_msgb cons_map_buf[i] = vpage_create_raw3(0, 0, handler_alloc()).raw; msg->map_buf[i] = cons_map_buf[i]; } + msg->user[0] = (umword_t)((char *)fake_pthread + sizeof(fake_pthread)); tag = task_set_com_point(TASK_THIS, &fast_ipc_com_point, (addr_t)com_stack, sizeof(com_stack), (void *)(&cons_stack_bitmap), diff --git a/mkrtos_user/server/fs/CMakeLists.txt b/mkrtos_user/server/fs/CMakeLists.txt index eb3540516..0765f5523 100644 --- a/mkrtos_user/server/fs/CMakeLists.txt +++ b/mkrtos_user/server/fs/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) -add_subdirectory(cpiofs) -add_subdirectory(fatfs) +# add_subdirectory(cpiofs) +# add_subdirectory(fatfs) add_subdirectory(appfs) # add_subdirectory(lxext4) diff --git a/mkrtos_user/server/fs/appfs/CMakeLists.txt b/mkrtos_user/server/fs/appfs/CMakeLists.txt index e502499fc..e6f89daa4 100644 --- a/mkrtos_user/server/fs/appfs/CMakeLists.txt +++ b/mkrtos_user/server/fs/appfs/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.13) -# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 ") - #appfs lib file(GLOB appfs_src src/appfs.c src/appfs_open.c) add_library( diff --git a/mkrtos_user/server/fs/appfs/src/main.c b/mkrtos_user/server/fs/appfs/src/main.c index ab61827fe..7bf84d769 100644 --- a/mkrtos_user/server/fs/appfs/src/main.c +++ b/mkrtos_user/server/fs/appfs/src/main.c @@ -1,5 +1,6 @@ #include "appfs.h" #include "hw_block_sim.h" +#include "libgen.h" #include "test.h" #include #include @@ -15,6 +16,51 @@ static fs_info_t fs; static char *pack_path; static char *output_path; +// 比较函数,用于 qsort 排序 +int compare(const void *a, const void *b) +{ + return strcmp(*(const char **)a, *(const char **)b); +} +static char **file_get_all_sort(const char *file_path, int *ret_size) +{ + DIR *dir; + struct dirent *entry; + char **filenames = NULL; + int count = 0; + + assert(ret_size); + // 打开目录 + dir = opendir(file_path); + if (dir == NULL) + { + perror("opendir"); + exit(EXIT_FAILURE); + return NULL; + } + + // 读取目录中的文件 + while ((entry = readdir(dir)) != NULL) + { + if (entry->d_type == DT_REG) + { // 只处理普通文件 + char full_path[1024]; + snprintf(full_path, sizeof(full_path), "%s/%s", file_path, entry->d_name); + filenames = realloc(filenames, (count + 1) * sizeof(char *)); + filenames[count] = strdup(full_path); + count++; + } + } + + // 关闭目录 + closedir(dir); + + // 对文件名进行排序 + qsort(filenames, count, sizeof(char *), compare); + + *ret_size = count; + return filenames; +} + static int read_file_all(const char *file_path, void **ret_ptr) { FILE *file = fopen(file_path, "rb"); // 以二进制模式打开文件 @@ -61,57 +107,43 @@ static int read_file_all(const char *file_path, void **ret_ptr) int read_files_and_write_appfs(const char *path) { - DIR *dir; - struct dirent *entry; struct stat info; int ret; long total_size = 0; + int files_count; + char **files = file_get_all_sort(path, &files_count); - // 打开目录 - dir = opendir(path); - if (dir == NULL) + if (files == NULL) { - perror("opendir"); - return errno; + return -ENOENT; } - - // 读取目录中的每一个条目 - while ((entry = readdir(dir)) != NULL) + for (int i = 0; i < files_count; i++) { - // 忽略"."和".."目录 - if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) - { - continue; - } - - // 构建完整的文件路径 - char full_path[1024]; - snprintf(full_path, sizeof(full_path), "%s/%s", path, entry->d_name); - // 获取文件信息 - if (stat(full_path, &info) != 0) + if (stat(files[i], &info) != 0) { - printf("pack fail:%s\n", full_path); + printf("pack fail:%s\n", files[i]); continue; } + char *file_name = basename(files[i]); if (S_ISREG(info.st_mode)) { - printf("%s %fMB\n", full_path, (float)info.st_size / 1024.0f / 1024.0f); - ret = appfs_create_file(&fs, entry->d_name, info.st_size); + printf("%s %fMB\n", files[i], (float)info.st_size / 1024.0f / 1024.0f); + ret = appfs_create_file(&fs, file_name, info.st_size); if (ret < 0) { printf("create file error.\n"); return -1; } void *file_ptr; - ret = read_file_all(full_path, &file_ptr); + ret = read_file_all(files[i], &file_ptr); if (ret < 0) { printf("read file error.\n"); return ret; } - ret = appfs_write_file(&fs, entry->d_name, file_ptr, info.st_size, 0); + ret = appfs_write_file(&fs, file_name, file_ptr, info.st_size, 0); if (ret < 0) { free(file_ptr); @@ -122,9 +154,6 @@ int read_files_and_write_appfs(const char *path) total_size += info.st_size; } } - - // 关闭目录 - closedir(dir); printf("file total size:%fMB\n", ((float)total_size / 1024.0f / 1024.0f)); return 0; } diff --git a/mkrtos_user/server/init/board/ATSURFF437/init.cfg b/mkrtos_user/server/init/board/ATSURFF437/init.cfg index b00fac1d0..c7716bf39 100644 --- a/mkrtos_user/server/init/board/ATSURFF437/init.cfg +++ b/mkrtos_user/server/init/board/ATSURFF437/init.cfg @@ -10,5 +10,5 @@ appfs -m /bin -d /block # eth # snd # net -# nes +# nes /bin/sm.nes sh \ No newline at end of file diff --git a/mkrtos_user/server/init/src/cons.c b/mkrtos_user/server/init/src/cons.c index 5f4cd7a40..280f0bb9d 100644 --- a/mkrtos_user/server/init/src/cons.c +++ b/mkrtos_user/server/init/src/cons.c @@ -60,7 +60,7 @@ void console_init(void) cons_svr_obj_init(&cons_obj); meta_reg_svr_obj(&cons_obj.svr, CONS_PROT); u_thread_create(&cons_th, (char *)cons_stack + sizeof(cons_stack) - 8, NULL, console_read_func); - u_thread_run(cons_th, 15); + u_thread_run(cons_th, 3); ulog_write_str(LOG_PROT, "cons svr init...\n"); } /** diff --git a/mkrtos_user/server/init/src/test/aarch64/thread_vcpu_test.c b/mkrtos_user/server/init/src/test/aarch64/thread_vcpu_test.c index 9987f280e..1d7044983 100644 --- a/mkrtos_user/server/init/src/test/aarch64/thread_vcpu_test.c +++ b/mkrtos_user/server/init/src/test/aarch64/thread_vcpu_test.c @@ -59,7 +59,7 @@ int thread_vcpu_test(void) { goto end_free_mm; } - thread_run(th1_hd, 2); // 优先级默认为2 + thread_run(th1_hd, 3); // 优先级默认为2 ret = 0; goto end_ok; end_free_mm: diff --git a/mkrtos_user/server/net/CMakeLists.txt b/mkrtos_user/server/net/CMakeLists.txt index 45dd86011..d8433bf28 100644 --- a/mkrtos_user/server/net/CMakeLists.txt +++ b/mkrtos_user/server/net/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) -file(GLOB_RECURSE deps src/*.c src/*.S) +file(GLOB deps src/*.c src/*.S src/test/*.c) add_executable(net.elf ${deps} @@ -29,6 +29,7 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/lwip/src/include ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/lwip/src/include/lwip/apps ${CMAKE_SOURCE_DIR}/mkrtos_user/server/net/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/net/src/test ) set_target_properties(net.elf PROPERTIES LINK_FLAGS "-T ${CMAKE_CURRENT_LIST_DIR}/${ARCH_NAME}/link.lds ${CORTEX_M_LINK_FLAGS} --gc-section -no-dynamic-linker " @@ -40,7 +41,7 @@ add_custom_target( COMMAND ${CMAKE_OBJCOPY} -O binary -S net.elf net.bin COMMAND - ${CMAKE_COMMAND} -E copy net.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/net + ${CMAKE_COMMAND} -E copy net.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/a_net COMMAND ${CMAKE_COMMAND} -E copy net.elf ${CMAKE_SOURCE_DIR}/build/output/net.elf ) diff --git a/mkrtos_user/server/net/src/heap_stack.c b/mkrtos_user/server/net/src/heap_stack.c index a090be97f..502c14a3a 100644 --- a/mkrtos_user/server/net/src/heap_stack.c +++ b/mkrtos_user/server/net/src/heap_stack.c @@ -1,6 +1,6 @@ #include #if !IS_ENABLED(CONFIG_MMU) -#define HEAP_SIZE (10 * 1024) +#define HEAP_SIZE (32 * 1024) #define STACK_SIZE (2048) #if defined(__CC_ARM) diff --git a/mkrtos_user/server/net/src/main.c b/mkrtos_user/server/net/src/main.c index 7d938a668..efd1a1ae1 100644 --- a/mkrtos_user/server/net/src/main.c +++ b/mkrtos_user/server/net/src/main.c @@ -22,13 +22,19 @@ static umword_t addr; static umword_t size; obj_handler_t net_drv_hd; -#define STACK_COM_ITME_SIZE (2 * 1024) +#define STACK_COM_ITME_SIZE (2 * 1024 + 512 /*sizeof(struct pthread) + TP_OFFSET*/) #define STACK_NUM 4 ATTR_ALIGN(8) static uint8_t stack_coms[STACK_COM_ITME_SIZE * STACK_NUM]; -static uint8_t msg_buf_coms[MSG_BUG_LEN]; +static uint8_t msg_buf_coms[MSG_BUG_LEN * STACK_NUM]; static void fast_ipc_init(void) { + // ipc_msg_t *ipc_msg = (ipc_msg_t *)msg_buf_coms; + + // for (int i = 0; i < STACK_NUM; i++) + // { + // ipc_msg->user[0] = (umword_t)(stack_coms + (i * STACK_COM_ITME_SIZE) + 2 * 1024); + // } u_fast_ipc_init(stack_coms, msg_buf_coms, STACK_NUM, STACK_COM_ITME_SIZE); } @@ -98,7 +104,7 @@ again: return -1; } cons_write_str("net mount success\n"); - // fs_svr_loop(); + net_test(); while (1) { if (msg_tag_get_prot(u_sema_down(sem_hd)) < 0) diff --git a/mkrtos_user/server/net/src/test/net_test.c b/mkrtos_user/server/net/src/test/net_test.c new file mode 100644 index 000000000..d41d7949c --- /dev/null +++ b/mkrtos_user/server/net/src/test/net_test.c @@ -0,0 +1,161 @@ +#include "pthread.h" +#include "unistd.h" +#include +#include +#include +#include +#include +#define PORT 8080 +#define BUFFER_SIZE 128 + +static int tcp_server(void) +{ + int server_socket, client_socket; + struct sockaddr_in server_addr, client_addr; + char buffer[BUFFER_SIZE]; + + // 创建服务器套接字 + if ((server_socket = lwip_socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + perror("lwip_socket creation failed"); + exit(EXIT_FAILURE); + } + printf("create server lwip_socket is success:%d\n", server_socket); + // 设置服务器地址 + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = htonl(INADDR_ANY); + server_addr.sin_port = htons(PORT); + + // 绑定套接字到本地地址和端口 + if (lwip_bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) + { + perror("lwip_bind failed"); + lwip_close(server_socket); + exit(EXIT_FAILURE); + } + + // 监听连接请求 + if (lwip_listen(server_socket, 3) < 0) + { + perror("lwip_listen failed"); + lwip_close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Server is listening on port %d...\n", PORT); + + socklen_t acc_len; + // 接收客户端连接 + client_socket = lwip_accept(server_socket, (struct sockaddr *)&client_addr, &acc_len); + if (client_socket < 0) + { + perror("lwip_accept failed"); + lwip_close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Client connected!\n"); + + // 发送数据 + const char *message = "Hello from server!"; + lwip_send(client_socket, message, strlen(message), 0); + + // 接收数据 + memset(buffer, 0, BUFFER_SIZE); + ssize_t bytes_received = lwip_recv(client_socket, buffer, BUFFER_SIZE - 1, 0); + if (bytes_received < 0) + { + perror("lwip_recv failed"); + lwip_close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Received message from client: %s\n", buffer); + + // 关闭套接字 + lwip_close(client_socket); + lwip_close(server_socket); + + return 0; +} +static void *net_server_func(void *arg) +{ + tcp_server(); + return NULL; +} + +static int tcp_client(void) +{ + int server_socket; + struct sockaddr_in server_addr; + char buffer[BUFFER_SIZE]; + + // 创建服务器套接字 + if ((server_socket = lwip_socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + perror("lwip_socket creation failed"); + exit(EXIT_FAILURE); + } + + // 设置服务器地址 + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = inet_addr("192.168.3.10"); // 使用本机IP地址 + server_addr.sin_port = htons(PORT); + + // 连接到服务器 + if (lwip_connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) + { + perror("connect failed"); + lwip_close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Connected to server!\n"); + + // 发送数据 + const char *message = "Hello from client!"; + lwip_send(server_socket, message, strlen(message), 0); + + // 接收数据 + memset(buffer, 0, BUFFER_SIZE); + ssize_t bytes_received = lwip_recv(server_socket, buffer, BUFFER_SIZE - 1, 0); + if (bytes_received < 0) + { + perror("lwip_recv failed"); + lwip_close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Received message from server: %s\n", buffer); + + // 关闭套接字 + lwip_close(server_socket); + + return 0; +} +static void *net_client_func(void *arg) +{ + tcp_client(); + return NULL; +} + +static pthread_t net_server_pt; +static pthread_t net_client_pt; +int net_test(void) +{ + sleep(1); + if (pthread_create(&net_server_pt, NULL, net_server_func, NULL)) + { + printf("net server pthread create failed.\n"); + return -1; + } + sleep(1); + if (pthread_create(&net_server_pt, NULL, net_client_func, NULL)) + { + printf("net server pthread create failed.\n"); + return -1; + } + return 0; +} \ No newline at end of file diff --git a/mkrtos_user/server/net/src/test/net_test.h b/mkrtos_user/server/net/src/test/net_test.h new file mode 100644 index 000000000..1b840d93c --- /dev/null +++ b/mkrtos_user/server/net/src/test/net_test.h @@ -0,0 +1,3 @@ +#pragma once + +int net_test(void); diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt b/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt index 8a6b2c2ad..d453c3e2d 100644 --- a/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt +++ b/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt @@ -77,7 +77,7 @@ add_custom_target( COMMAND ${CMAKE_SIZE} nes.elf COMMAND - ${CMAKE_COMMAND} -E copy nes.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/nes + ${CMAKE_COMMAND} -E copy nes.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/a_nes COMMAND cp nes.elf ${CMAKE_SOURCE_DIR}/build/output/nes.elf COMMAND diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c b/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c index 41ff202f8..152e11395 100644 --- a/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c +++ b/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c @@ -47,6 +47,7 @@ static int new_rom_get(const char *path) new_rom_size = appfs_arg.size; return 0; } +bool_t print_fps = FALSE; int main(int argc, char *argv[]) { if (argc < 2) @@ -61,6 +62,10 @@ int main(int argc, char *argv[]) printf("rom don't finded.\n"); return -1; } + if (argc >= 3) + { + print_fps = TRUE; + } // thread_run(-1, 4); printf("nes init..\n"); #if 0 diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/vnes/nes_main.c b/mkrtos_user/user/app/ATSURFF437/nes_simulator/vnes/nes_main.c index c46360856..02f9eb7e0 100644 --- a/mkrtos_user/user/app/ATSURFF437/nes_simulator/vnes/nes_main.c +++ b/mkrtos_user/user/app/ATSURFF437/nes_simulator/vnes/nes_main.c @@ -11,6 +11,7 @@ #include #include "ns_cli.h" #include "u_sleep.h" +#include "unistd.h" #include #include #include @@ -442,9 +443,9 @@ void nes_emulate_frame(void) u8 nes_frame = 0; int jump_frame_cnt = 0; - st_tick = sys_read_tick(); while (1) { + st_tick = sys_read_tick(); // printf("%d\r\n",framecnt); // LINES 0-239 PPU_start_frame(); @@ -521,8 +522,19 @@ void nes_emulate_frame(void) nes_frame = 0; } #endif -#if 0 - printf("fps:%d\n", 1000 / ((sys_read_tick() - st_tick) / framecnt)); +#if 1 + extern bool_t print_fps; + int32_t used_tick = sys_read_tick() - st_tick; + + // if (1000 / 60 >= used_tick) + // { + // usleep((1000 / 60 - used_tick) * 1000); + // } + used_tick = sys_read_tick() - st_tick; + if (print_fps) + { + printf("fps:%d\n", 1000 / used_tick); + } #endif } } diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/vnes/nes_main.h b/mkrtos_user/user/app/ATSURFF437/nes_simulator/vnes/nes_main.h index 9abac27be..5f5630c67 100644 --- a/mkrtos_user/user/app/ATSURFF437/nes_simulator/vnes/nes_main.h +++ b/mkrtos_user/user/app/ATSURFF437/nes_simulator/vnes/nes_main.h @@ -11,7 +11,7 @@ //版本:V1.0 ////////////////////////////////////////////////////////////////////////////////// -#define NES_SKIP_FRAME 1 //定义模拟器跳帧数,默认跳2帧 +#define NES_SKIP_FRAME 0 //定义模拟器跳帧数,默认跳2帧 #define INLINE static inline diff --git a/mkrtos_user/user/app/CMakeLists.txt b/mkrtos_user/user/app/CMakeLists.txt index 871b3856f..43e5e5957 100644 --- a/mkrtos_user/user/app/CMakeLists.txt +++ b/mkrtos_user/user/app/CMakeLists.txt @@ -1,13 +1,13 @@ cmake_minimum_required(VERSION 3.13) -add_subdirectory(coremark) -add_subdirectory(tinycc-arm-thumb) +# add_subdirectory(coremark) +# add_subdirectory(tinycc-arm-thumb) add_subdirectory(test) add_subdirectory(vi) add_subdirectory(binutils-2.33.1) -add_subdirectory(share_lib_test) -add_subdirectory(share_lib_test2) -add_subdirectory(shared_test) +# add_subdirectory(share_lib_test) +# add_subdirectory(share_lib_test2) +# add_subdirectory(shared_test) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${CONFIG_BOARD_NAME}) add_subdirectory(${CONFIG_BOARD_NAME}) endif() diff --git a/mkrtos_user/user/app/coremark/CMakeLists.txt b/mkrtos_user/user/app/coremark/CMakeLists.txt index 884018aa9..720563889 100644 --- a/mkrtos_user/user/app/coremark/CMakeLists.txt +++ b/mkrtos_user/user/app/coremark/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.13) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Ofast") +# message("coremark==>"${CMAKE_C_FLAGS}) file( GLOB deps coremark_src/*.c diff --git a/mkrtos_user/user/app/coremark/coremark_src/core_portme.h b/mkrtos_user/user/app/coremark/coremark_src/core_portme.h index e14648018..c9687d323 100644 --- a/mkrtos_user/user/app/coremark/coremark_src/core_portme.h +++ b/mkrtos_user/user/app/coremark/coremark_src/core_portme.h @@ -77,7 +77,7 @@ typedef clock_t CORE_TICKS; #endif #endif #ifndef COMPILER_FLAGS - #define COMPILER_FLAGS "" /* "Please put compiler flags here (e.g. -o3)" */ + #define COMPILER_FLAGS "-Ofast" /* "Please put compiler flags here (e.g. -o3)" */ #endif #ifndef MEM_LOCATION #define MEM_LOCATION "STACK" diff --git a/mkrtos_user/user/app/coremark/main.c b/mkrtos_user/user/app/coremark/main.c index 25fa04305..a890abf3f 100644 --- a/mkrtos_user/user/app/coremark/main.c +++ b/mkrtos_user/user/app/coremark/main.c @@ -12,7 +12,7 @@ int main(int args, char *argv[]) { extern int core_mark(int argc, char *argv[]) ; -#if 1 +#if 0 thread_run(-1, 3); #endif core_mark(args, argv); diff --git a/mkrtos_user/user/app/test/heap_stack.c b/mkrtos_user/user/app/test/heap_stack.c index 9d74cba03..d1ae0a3c1 100644 --- a/mkrtos_user/user/app/test/heap_stack.c +++ b/mkrtos_user/user/app/test/heap_stack.c @@ -1,5 +1,5 @@ -#define HEAP_SIZE (1024) +#define HEAP_SIZE (10*1024) #define STACK_SIZE (1024 * 2) #if defined(__CC_ARM) diff --git a/mkrtos_user/user/app/test/main.c b/mkrtos_user/user/app/test/main.c index 1c2180c2f..aecb1cfe2 100644 --- a/mkrtos_user/user/app/test/main.c +++ b/mkrtos_user/user/app/test/main.c @@ -9,12 +9,14 @@ #include "fs_test.h" #include "mm_test.h" #include +#include "net_test.h" int main(int argc, char *argv[]) { for (int i = 0; i < argc; i++) { printf("argv[%d]: %s\n", i, argv[i]); } + net_test(); fs_test3(); fs_test2(); fs_test(); diff --git a/mkrtos_user/user/app/test/net_test.c b/mkrtos_user/user/app/test/net_test.c new file mode 100644 index 000000000..ec63a0336 --- /dev/null +++ b/mkrtos_user/user/app/test/net_test.c @@ -0,0 +1,151 @@ +#include "pthread.h" +#include "unistd.h" +#include +#include +#include +#include +#include + +#define PORT 8080 +#define BUFFER_SIZE 128 + +static int tcp_server(void) +{ + int server_socket, client_socket; + struct sockaddr_in server_addr, client_addr; + char buffer[BUFFER_SIZE]; + + // 创建服务器套接字 + if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + perror("socket creation failed"); + exit(EXIT_FAILURE); + } + printf("create server socket is success:%d\n", server_socket); + // 设置服务器地址 + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = INADDR_ANY; + server_addr.sin_port = htons(PORT); + + // 绑定套接字到本地地址和端口 + if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) + { + perror("bind failed"); + close(server_socket); + exit(EXIT_FAILURE); + } + + // 监听连接请求 + if (listen(server_socket, 3) < 0) + { + perror("listen failed"); + close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Server is listening on port %d...\n", PORT); + + socklen_t acc_len; + // 接收客户端连接 + client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &acc_len); + if (client_socket < 0) + { + perror("accept failed"); + close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Client connected!\n"); + + // 发送数据 + const char *message = "Hello from server!"; + send(client_socket, message, strlen(message), 0); + + // 接收数据 + memset(buffer, 0, BUFFER_SIZE); + ssize_t bytes_received = recv(client_socket, buffer, BUFFER_SIZE - 1, 0); + if (bytes_received < 0) + { + perror("recv failed"); + close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Received message from client: %s\n", buffer); + + // 关闭套接字 + close(client_socket); + close(server_socket); + + return 0; +} +static void *net_server_func(void *arg) +{ + tcp_server(); + return NULL; +} + +static int tcp_client(void) +{ + int server_socket; + struct sockaddr_in server_addr; + char buffer[BUFFER_SIZE]; + + // 创建服务器套接字 + if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + perror("socket creation failed"); + exit(EXIT_FAILURE); + } + + // 设置服务器地址 + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = inet_addr("192.168.3.10"); // 使用本机IP地址 + server_addr.sin_port = htons(PORT); + + // 连接到服务器 + if (connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) + { + perror("connect failed"); + close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Connected to server!\n"); + + // 发送数据 + const char *message = "Hello from client!"; + send(server_socket, message, strlen(message), 0); + + // 接收数据 + memset(buffer, 0, BUFFER_SIZE); + ssize_t bytes_received = recv(server_socket, buffer, BUFFER_SIZE - 1, 0); + if (bytes_received < 0) + { + perror("recv failed"); + close(server_socket); + exit(EXIT_FAILURE); + } + + printf("Received message from server: %s\n", buffer); + + // 关闭套接字 + close(server_socket); + + return 0; +} +static pthread_t net_server_pt; +int net_test(void) +{ + if (pthread_create(&net_server_pt, NULL, net_server_func, NULL)) + { + printf("net server pthread create failed.\n"); + return -1; + } + sleep(1); + tcp_client(); + pthread_join(net_server_pt, NULL); + return 0; +} \ No newline at end of file diff --git a/mkrtos_user/user/app/test/net_test.h b/mkrtos_user/user/app/test/net_test.h new file mode 100644 index 000000000..1b840d93c --- /dev/null +++ b/mkrtos_user/user/app/test/net_test.h @@ -0,0 +1,3 @@ +#pragma once + +int net_test(void); diff --git a/mkrtos_user/user/drv/ATSURFF437/eth/CMakeLists.txt b/mkrtos_user/user/drv/ATSURFF437/eth/CMakeLists.txt index 985d5eff5..a0b616604 100644 --- a/mkrtos_user/user/drv/ATSURFF437/eth/CMakeLists.txt +++ b/mkrtos_user/user/drv/ATSURFF437/eth/CMakeLists.txt @@ -79,7 +79,7 @@ add_custom_target( COMMAND ${CMAKE_SIZE} eth.elf COMMAND - ${CMAKE_COMMAND} -E copy eth.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/eth + ${CMAKE_COMMAND} -E copy eth.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/a_eth COMMAND cp eth.elf ${CMAKE_SOURCE_DIR}/build/output/eth.elf ) diff --git a/mkrtos_user/user/drv/ATSURFF437/eth/main.c b/mkrtos_user/user/drv/ATSURFF437/eth/main.c index 07c6b24bd..467011c30 100644 --- a/mkrtos_user/user/drv/ATSURFF437/eth/main.c +++ b/mkrtos_user/user/drv/ATSURFF437/eth/main.c @@ -22,7 +22,7 @@ #include #include "at_surf_f437_board_emac.h" static blk_drv_t net_drv; //!< 网络驱动的协议 -#define STACK_COM_ITME_SIZE (1024+512) +#define STACK_COM_ITME_SIZE (2048) ATTR_ALIGN(8) uint8_t stack_coms[STACK_COM_ITME_SIZE]; uint8_t msg_buf_coms[MSG_BUG_LEN]; @@ -56,7 +56,12 @@ int blk_drv_read(obj_handler_t obj, int len, int inx) umword_t size = 0; msg_tag_t tag = share_mem_map(obj, vma_addr_create(VPAGE_PROT_RWX, 0, 0), &addr, &size); uint32_t _err; - + if (msg_tag_get_val(tag) < 0) + { + handler_free_umap(obj); + printf("net read error.\n"); + return msg_tag_get_val(tag); + } ret = emac_read_packet((uint8_t *)addr, size); handler_free_umap(obj); return ret;