diff --git a/.vscode/launch.json b/.vscode/launch.json index 8ae29d750..6ab8b0076 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -71,8 +71,8 @@ // "miDebuggerPath": "/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gdb", // "miDebuggerPath": "/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb", // "miDebuggerPath": "/home/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb", - // "miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb", - "miDebuggerPath": "/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb", + "miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb", + // "miDebuggerPath": "/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb", "miDebuggerServerAddress": "127.0.0.1:33333", "MIMode": "gdb", "setupCommands": [ diff --git a/.vscode/settings.json b/.vscode/settings.json index 81b64b2b9..e8f7c2981 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -193,7 +193,7 @@ "mman.h": "c" }, "cortex-debug.showRTOS": false, - "cortex-debug.variableUseNaturalFormat": true, + "cortex-debug.variableUseNaturalFormat": false, "C_Cpp.default.systemIncludePath": [""], "C_Cpp.default.forcedInclude": ["${workspaceFolder}/build/autoconf.h"] } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index be3910046..8a27d6be0 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,8 @@ execute_process( ) execute_process( - COMMAND cd ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/appfs/src/build.sh && sh build.sh + COMMAND cd ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/appfs/src + COMMAND sh build.sh COMMAND_ECHO STDOUT ) diff --git a/mkrtos_bootstrap/main.c b/mkrtos_bootstrap/main.c index 2821bca11..8e4c06c1e 100755 --- a/mkrtos_bootstrap/main.c +++ b/mkrtos_bootstrap/main.c @@ -5,7 +5,7 @@ extern char cpio_start[]; extern char cpio_end[]; int main(void) -{ +{ jump2kernel((addr_t)cpio_start, (addr_t)cpio_end); while (1) ; diff --git a/mkrtos_configs/ATSURFF437.dts b/mkrtos_configs/ATSURFF437.dts index 2dbc2d4c3..d306d543a 100644 --- a/mkrtos_configs/ATSURFF437.dts +++ b/mkrtos_configs/ATSURFF437.dts @@ -4,6 +4,14 @@ compatible = "at32f43x,pin"; regs = < 0x40020000 0x2000 /*GPIO*/ + // 0x4002 1C00 - 0x4002 1FFF GPIO 端口 H + // 0x4002 1800 - 0x4002 1BFF GPIO 端口 G + // 0x4002 1400 - 0x4002 17FF GPIO 端口 F + // 0x4002 1000 - 0x4002 13FF GPIO 端口 E + // 0x4002 0C00 - 0x4002 0FFF GPIO 端口 D + // 0x4002 0800 - 0x4002 0BFF GPIO 端口 C + // 0x4002 0400 - 0x4002 07FF GPIO 端口 B + // 0x4002 0000 - 0x4002 03FF GPIO 端口 A 0x40013800 0x400 /*EXINT & SCFG*/ 0x40013C00 0x400 /*EXINT & SCFG*/ 0x40023800 0x400 /*CRM*/ diff --git a/mkrtos_knl/arch/cortex-m3/core_it.c b/mkrtos_knl/arch/cortex-m3/core_it.c index bdc02c445..49d4037fd 100755 --- a/mkrtos_knl/arch/cortex-m3/core_it.c +++ b/mkrtos_knl/arch/cortex-m3/core_it.c @@ -87,33 +87,60 @@ void MemManage_Handler(void) bool_t is_knl = is_run_knl(); addr_t fault_addr = (addr_t)(SCB->MMFAR); addr_t bus_addr = (addr_t)(SCB->BFAR); + SCB->MMFAR = 0; + SCB->BFAR = 0; task_t *cur_task = thread_get_current_task(); + bool_t reset_r9 = FALSE; - if ((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) + if (((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) && (SCB->CFSR & (1 << 7))) { + if (SCB->CFSR & 0x1) + { + SCB->CFSR |= 0x1; + } + if (SCB->CFSR & 0x2) + { + SCB->CFSR |= 0x2; + } // printk("instr || data 0x%x access is error.\n", fault_addr); if (task_vma_page_fault(&(thread_get_current_task()->mm_space.mem_vma), - ALIGN_DOWN(fault_addr, PAGE_SIZE), NULL) < 0) + fault_addr, NULL) < 0) { - printk("task:0x%x, mem_addr:0x%lx bus_addr:0x%lx semgement fault.\n", + printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n", thread_get_current_task(), fault_addr, bus_addr); - task_knl_kill(thread_get_current(), is_knl); + goto end; } return; } if ((SCB->CFSR & 8)) { + SCB->CFSR |= 8; printk("push stack is error.\n"); } if (SCB->CFSR & 16) { + SCB->CFSR |= 16; printk("pop stack is error.\n"); } if (SCB->CFSR & 32) { + SCB->CFSR |= 32; printk("Floating point lazy stack error.\n"); } - task_knl_kill(thread_get_current(), is_knl); +end: + reset_r9 = task_knl_kill(thread_get_current(), is_knl); + if (reset_r9) + { + do + { + __asm__ __volatile__( + "mov r9, %0\n\t" + : /* 无输出操作数 */ + : "r"(thread_get_current_task()->mm_space.mm_block) // 输入操作数,将value的值传递给R0寄存器 + : // 告诉编译器R9寄存器将被修改 + ); + } while (0); + } } /** diff --git a/mkrtos_knl/arch/cortex-m33/core_it.c b/mkrtos_knl/arch/cortex-m33/core_it.c index 688197b08..d2e530196 100755 --- a/mkrtos_knl/arch/cortex-m33/core_it.c +++ b/mkrtos_knl/arch/cortex-m33/core_it.c @@ -40,33 +40,60 @@ void MemManage_Handler(void) bool_t is_knl = is_run_knl(); addr_t fault_addr = (addr_t)(SCB->MMFAR); addr_t bus_addr = (addr_t)(SCB->BFAR); + SCB->MMFAR = 0; + SCB->BFAR = 0; task_t *cur_task = thread_get_current_task(); + bool_t reset_r9 = FALSE; - if ((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) + if (((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) && (SCB->CFSR & (1 << 7))) { + if (SCB->CFSR & 0x1) + { + SCB->CFSR |= 0x1; + } + if (SCB->CFSR & 0x2) + { + SCB->CFSR |= 0x2; + } // printk("instr || data 0x%x access is error.\n", fault_addr); if (task_vma_page_fault(&(thread_get_current_task()->mm_space.mem_vma), - ALIGN_DOWN(fault_addr, PAGE_SIZE), NULL) < 0) + fault_addr, NULL) < 0) { - printk("task:0x%x, mem_addr:0x%lx bus_addr:0x%lx semgement fault.\n", + printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n", thread_get_current_task(), fault_addr, bus_addr); - task_knl_kill(thread_get_current(), is_knl); + goto end; } return; } if ((SCB->CFSR & 8)) { + SCB->CFSR |= 8; printk("push stack is error.\n"); } if (SCB->CFSR & 16) { + SCB->CFSR |= 16; printk("pop stack is error.\n"); } if (SCB->CFSR & 32) { + SCB->CFSR |= 32; printk("Floating point lazy stack error.\n"); } - task_knl_kill(thread_get_current(), is_knl); +end: + reset_r9 = task_knl_kill(thread_get_current(), is_knl); + if (reset_r9) + { + do + { + __asm__ __volatile__( + "mov r9, %0\n\t" + : /* 无输出操作数 */ + : "r"(thread_get_current_task()->mm_space.mm_block) // 输入操作数,将value的值传递给R0寄存器 + : // 告诉编译器R9寄存器将被修改 + ); + } while (0); + } } /** diff --git a/mkrtos_knl/arch/cortex-m4/core_it.c b/mkrtos_knl/arch/cortex-m4/core_it.c index 24f9b535a..ba0624335 100755 --- a/mkrtos_knl/arch/cortex-m4/core_it.c +++ b/mkrtos_knl/arch/cortex-m4/core_it.c @@ -82,14 +82,24 @@ void MemManage_Handler(void) bool_t is_knl = is_run_knl(); addr_t fault_addr = (addr_t)(SCB->MMFAR); addr_t bus_addr = (addr_t)(SCB->BFAR); + SCB->MMFAR = 0; + SCB->BFAR = 0; task_t *cur_task = thread_get_current_task(); bool_t reset_r9 = FALSE; - if ((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) + if (((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) && (SCB->CFSR & (1 << 7))) { + if (SCB->CFSR & 0x1) + { + SCB->CFSR |= 0x1; + } + if (SCB->CFSR & 0x2) + { + SCB->CFSR |= 0x2; + } // printk("instr || data 0x%x access is error.\n", fault_addr); if (task_vma_page_fault(&(thread_get_current_task()->mm_space.mem_vma), - ALIGN_DOWN(fault_addr, PAGE_SIZE), NULL) < 0) + fault_addr, NULL) < 0) { printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n", thread_get_current_task(), fault_addr, bus_addr); @@ -99,14 +109,17 @@ void MemManage_Handler(void) } if ((SCB->CFSR & 8)) { + SCB->CFSR |= 8; printk("push stack is error.\n"); } if (SCB->CFSR & 16) { + SCB->CFSR |= 16; printk("pop stack is error.\n"); } if (SCB->CFSR & 32) { + SCB->CFSR |= 32; printk("Floating point lazy stack error.\n"); } end: @@ -119,7 +132,7 @@ end: "mov r9, %0\n\t" : /* 无输出操作数 */ : "r"(thread_get_current_task()->mm_space.mm_block) // 输入操作数,将value的值传递给R0寄存器 - : // 告诉编译器R9寄存器将被修改 + : // 告诉编译器R9寄存器将被修改 ); } while (0); } diff --git a/mkrtos_knl/inc/knl/thread.h b/mkrtos_knl/inc/knl/thread.h index f625d6609..b2148450b 100755 --- a/mkrtos_knl/inc/knl/thread.h +++ b/mkrtos_knl/inc/knl/thread.h @@ -214,7 +214,8 @@ static inline pf_t *thread_get_pf(thread_t *th) static inline thread_t *thread_get_current(void) { umword_t sp = arch_get_sp(); - thread_t *th = (thread_t *)(ALIGN_DOWN(sp, CONFIG_THREAD_BLOCK_SIZE)); + // thread_t *th = (thread_t *)(ALIGN_DOWN(sp, CONFIG_THREAD_BLOCK_SIZE)); + thread_t *th = (thread_t *)((sp / CONFIG_THREAD_BLOCK_SIZE) * CONFIG_THREAD_BLOCK_SIZE); return th; } 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_script/build_f2.sh b/mkrtos_script/build_f2.sh index 90e3fd657..3388a26d5 100755 --- a/mkrtos_script/build_f2.sh +++ b/mkrtos_script/build_f2.sh @@ -1,10 +1,10 @@ #!/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 -# 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/v7-m/nofp +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/v7-m/nofp # export TOOLCHAIN=/d/GNUArmEmbeddedToolchain/102021.10/bin/ # export TOOLCHAIN_LIB=/d/GNUArmEmbeddedToolchain/102021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp diff --git a/mkrtos_user/server/fs/appfs/CMakeLists.txt b/mkrtos_user/server/fs/appfs/CMakeLists.txt index 48f36e034..e502499fc 100644 --- a/mkrtos_user/server/fs/appfs/CMakeLists.txt +++ b/mkrtos_user/server/fs/appfs/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) -# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ") +# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 ") #appfs lib file(GLOB appfs_src src/appfs.c src/appfs_open.c) diff --git a/mkrtos_user/user/app/ATSURFF437/3d_test/main.c b/mkrtos_user/user/app/ATSURFF437/3d_test/main.c index aace96960..97f1eac04 100644 --- a/mkrtos_user/user/app/ATSURFF437/3d_test/main.c +++ b/mkrtos_user/user/app/ATSURFF437/3d_test/main.c @@ -14,21 +14,21 @@ static int drv_iomem_init(void) { addr_t addr; msg_tag_t tag; - tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), + tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0), XMC_MEM_BASE - PERIPH_BASE, PERIPH_BASE, &addr); if (msg_tag_get_val(tag) < 0) { printf("periph mem alloc failed..\n"); return -1; } - tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), + tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0), 0x4000000, XMC_MEM_BASE, &addr); if (msg_tag_get_val(tag) < 0) { printf("periph mem alloc failed..\n"); return -1; } - tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), + tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0), 0x10000, XMC_REG_BASE, &addr); if (msg_tag_get_val(tag) < 0) { diff --git a/mkrtos_user/user/app/ATSURFF437/drv_test/main.c b/mkrtos_user/user/app/ATSURFF437/drv_test/main.c index 4bfe1b424..d92ab7d20 100644 --- a/mkrtos_user/user/app/ATSURFF437/drv_test/main.c +++ b/mkrtos_user/user/app/ATSURFF437/drv_test/main.c @@ -79,7 +79,7 @@ static int display_test(void) printf("display addr:0x%x\n", info.display_addr); msg_tag_t tag; addr_t addr; - tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), + tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0), 512, info.display_addr, &addr); if (msg_tag_get_val(tag) < 0) { diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt b/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt index abd9ed864..8a6b2c2ad 100644 --- a/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt +++ b/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt @@ -81,7 +81,7 @@ add_custom_target( COMMAND cp nes.elf ${CMAKE_SOURCE_DIR}/build/output/nes.elf COMMAND - cp ${CMAKE_CURRENT_SOURCE_DIR}/nes_rom/sm.nes ${CMAKE_SOURCE_DIR}/build/output/cpio/ + cp ${CMAKE_CURRENT_SOURCE_DIR}/nes_rom/*.nes ${CMAKE_SOURCE_DIR}/build/output/cpio/ ) add_dependencies(nes_dump nes.elf) diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c b/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c index 36c07a416..41ff202f8 100644 --- a/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c +++ b/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c @@ -121,7 +121,7 @@ again: } msg_tag_t tag; addr_t addr; - tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), + tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0), 512, info.display_addr, &addr); if (msg_tag_get_val(tag) < 0) { diff --git a/mkrtos_user/user/drv/lib/mk_drv/mk_dtb_parse.c b/mkrtos_user/user/drv/lib/mk_drv/mk_dtb_parse.c index 5bd09a2b5..ede18d480 100644 --- a/mkrtos_user/user/drv/lib/mk_drv/mk_dtb_parse.c +++ b/mkrtos_user/user/drv/lib/mk_drv/mk_dtb_parse.c @@ -65,7 +65,7 @@ int dev_regs_map(mk_dev_t *dev, void *fdt) reg[1] = fdt32_to_cpu((fdt32_t)reg_raw[i + 1]); printf("reg:0x%x size:0x%x\n", reg[0], reg[1]); - tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), + tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0), reg[1], reg[0], &vaddr); if (msg_tag_get_val(tag) < 0) {