diff --git a/.vscode/launch.json b/.vscode/launch.json index cf91fde4f..ed9c1857e 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -48,7 +48,7 @@ // "miDebuggerPath": "/opt/homebrew/bin/arm-none-eabi-gdb", "miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb", // "miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb", - "miDebuggerServerAddress": "127.0.0.1:2331", + "miDebuggerServerAddress": "127.0.0.1:3333", "MIMode": "gdb", "setupCommands": [ { diff --git a/configs/STM32F103ZET6_defconfig b/configs/STM32F103ZET6_defconfig index 65ed32f14..d8eca1405 100644 --- a/configs/STM32F103ZET6_defconfig +++ b/configs/STM32F103ZET6_defconfig @@ -10,7 +10,7 @@ CONFIG_KNL_DATA_SIZE=0x10000 CONFIG_KNL_OFFSET=0x2000 CONFIG_INIT_TASK_OFFSET=0x10000 CONFIG_BOOTFS_OFFSET=0x22000 -CONFIG_MK_MPU_CFG=y +CONFIG_MK_MPU_CFG=n CONFIG_FT_ADDR_NR=16 CONFIG_SYS_SCHE_HZ=1000 CONFIG_USER_ISR_START_NO=16 diff --git a/mkrtos_knl/arch/armv7m/stm32f1/mpu.c b/mkrtos_knl/arch/armv7m/stm32f1/mpu.c index 766d3a0b1..a4bb48417 100755 --- a/mkrtos_knl/arch/armv7m/stm32f1/mpu.c +++ b/mkrtos_knl/arch/armv7m/stm32f1/mpu.c @@ -4,13 +4,13 @@ * Created on: ATShining * Author: Administrator */ - #include "types.h" #include "mpu.h" #include #include #include "thread.h" #include "task.h" +#if CONFIG_MK_MPU_CFG static volatile umword_t *MPUCR = (umword_t *)0xE000ED94; void mpu_init(void) @@ -64,3 +64,11 @@ void mpu_switch_to(void) mpu_switch_to_task(tk); } +#else +void mpu_switch_to(void) +{ +} +void mpu_switch_to_task(struct task *tk) +{ +} +#endif diff --git a/mkrtos_knl/arch/armv7m/swm34s/mpu.c b/mkrtos_knl/arch/armv7m/swm34s/mpu.c index 540e4429a..370839d90 100755 --- a/mkrtos_knl/arch/armv7m/swm34s/mpu.c +++ b/mkrtos_knl/arch/armv7m/swm34s/mpu.c @@ -12,7 +12,6 @@ #include #include "thread.h" #include "task.h" -static volatile umword_t *MPUCR = (umword_t *)0xE000ED94; void mpu_init(void) { @@ -31,8 +30,9 @@ void mpu_calc_regs(region_info_t *region, umword_t addr, umword_t ffs_val, uint8 assert((addr & (MPU_ALIGN_SIZE - 1)) == 0); assert((ffs_val & (MPU_ALIGN_SIZE - 1)) == 0); region->rbar = ARM_MPU_RBAR(addr, ARM_MPU_SH_NON, - attrs == REGION_RO ? 1 : 0, 1, 1); + 0, 0, attrs == REGION_RWX ? 0 : 1); region->rasr = ARM_MPU_RLAR(addr + ffs_val, region->region_inx); + ARM_MPU_SetMemAttr(region->region_inx, ARM_MPU_ATTR_NON_CACHEABLE); } void mpu_region_set(int inx, umword_t rbar, umword_t rasr) { diff --git a/mkrtos_knl/inc/knl/mm_space.h b/mkrtos_knl/inc/knl/mm_space.h index 490331413..88f1abfe0 100644 --- a/mkrtos_knl/inc/knl/mm_space.h +++ b/mkrtos_knl/inc/knl/mm_space.h @@ -3,8 +3,10 @@ #include "types.h" #include "mm_page.h" #include + typedef struct region_info { +#if CONFIG_MK_MPU_CFG umword_t start_addr; //!< 内存申请的开始地址 umword_t block_start_addr; //!< 块申请的开始地址 umword_t block_size; //!< 保护的块大小 @@ -13,22 +15,25 @@ typedef struct region_info umword_t rasr; //!< mpu保护寄存器信息 int16_t region_inx; uint8_t region; //!< 区域禁止信息 +#endif } region_info_t; typedef struct mm_space { +#if CONFIG_MK_MPU_CFG region_info_t pt_regions[CONFIG_REGION_NUM]; //!< mpu内存保护块 +#endif // mm_pages_t mm_pages; //!< 模拟分页内存 void *mm_block; //!< task 的私有内存块 size_t mm_block_size; //!< 私有内存块的大小 } mm_space_t; - enum region_rights { REGION_PRIV = 1, REGION_RO = 2, REGION_RWX = 3, }; +#if CONFIG_MK_MPU_CFG region_info_t *mm_space_alloc_pt_region(mm_space_t *m_space); void mm_space_free_pt_region(mm_space_t *m_space, region_info_t *ri); @@ -36,7 +41,19 @@ void mm_space_free_pt_region(mm_space_t *m_space, region_info_t *ri); void mm_space_init(mm_space_t *mm_space, int is_knl); bool_t mm_space_add(mm_space_t *m_space, umword_t addr, umword_t size, uint8_t attrs); void mm_space_del(mm_space_t *m_space, umword_t addr); +#else +static inline void mm_space_init(mm_space_t *mm_space, int is_knl) +{ +} +static inline bool_t mm_space_add(mm_space_t *m_space, umword_t addr, umword_t size, uint8_t attrs) +{ + return TRUE; +} +static inline void mm_space_del(mm_space_t *m_space, umword_t addr) +{ +} +#endif static inline void mm_space_set_ram_block(mm_space_t *mm_space, void *mem, size_t size) { mm_space->mm_block = mem; @@ -48,4 +65,4 @@ static inline void mm_space_get_ram_block(mm_space_t *mm_space, void **mem, size assert(size); *mem = mm_space->mm_block; *size = mm_space->mm_block_size; -} \ No newline at end of file +} diff --git a/mkrtos_knl/inc/knl/mpu.h b/mkrtos_knl/inc/knl/mpu.h index 9e1da7759..c68832957 100644 --- a/mkrtos_knl/inc/knl/mpu.h +++ b/mkrtos_knl/inc/knl/mpu.h @@ -2,6 +2,7 @@ #include "mm_space.h" #include "task.h" +#if CONFIG_MK_MPU_CFG #if CONFIG_MPU_VERSION == 2 #define MPU_ALIGN_SIZE 32 #endif @@ -14,4 +15,28 @@ void mpu_region_clr(int inx); void mpu_calc_regs(region_info_t *region, umword_t addr, umword_t ffs_val, uint8_t attrs, uint8_t regions_bits); void mpu_switch_to(void); -void mpu_switch_to_task(struct task *tk); \ No newline at end of file +void mpu_switch_to_task(struct task *tk); +#else +static inline void mpu_init(void) +{ +} +static inline void mpu_disable(void) +{ +} +static inline void mpu_enable(void) +{ +} +static inline void mpu_calc_regs(region_info_t *region, umword_t addr, umword_t ffs_val, + uint8_t attrs, uint8_t regions_bits) +{ +} +static inline void mpu_region_set(int inx, umword_t rbar, umword_t rasr) +{ +} + +static inline void mpu_region_clr(int inx) +{ +} +void mpu_switch_to(void); +void mpu_switch_to_task(struct task *tk); +#endif diff --git a/mkrtos_knl/knl/misc.c b/mkrtos_knl/knl/misc.c index d7b175376..f4d3072f5 100644 --- a/mkrtos_knl/knl/misc.c +++ b/mkrtos_knl/knl/misc.c @@ -15,6 +15,8 @@ #include "util.h" #include "mpu.h" #include "printk.h" + +#if CONFIG_MK_MPU_CFG static bool_t mpu_calc( mm_space_t *ms, umword_t mem_start_addr, @@ -204,3 +206,11 @@ again_alloc: return ram; #endif } +#else +void *mpu_ram_alloc(mm_space_t *ms, ram_limit_t *r_limit, size_t ram_size) +{ + void *ram = mm_limit_alloc(r_limit, ram_size); + + return ram; +} +#endif diff --git a/mkrtos_knl/knl/mm_man.c b/mkrtos_knl/knl/mm_man.c index 3c727d014..67fc18280 100644 --- a/mkrtos_knl/knl/mm_man.c +++ b/mkrtos_knl/knl/mm_man.c @@ -84,6 +84,7 @@ static void mm_man_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t break; case MM_ALIGN_ALLOC: { +#if CONFIG_MK_MPU_CFG region_info_t *regi_info = mm_space_alloc_pt_region(&cur_task->mm_space); if (regi_info) @@ -112,6 +113,9 @@ static void mm_man_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t { tag = msg_tag_init4(0, 0, 0, -ENOMEM); } +#else + tag = msg_tag_init4(0, 0, 0, -ENOSYS); +#endif } break; case MM_MOD_ATTRS: diff --git a/mkrtos_knl/knl/mm_page.c b/mkrtos_knl/knl/mm_page.c index b020031c2..a9d60a56b 100644 --- a/mkrtos_knl/knl/mm_page.c +++ b/mkrtos_knl/knl/mm_page.c @@ -16,6 +16,7 @@ #include "mm_page.h" #include "mm_space.h" #include "mpu.h" +#if CONFIG_MK_MPU_CFG static mm_entry_t *mm_pages_entry_alloc(mm_pages_t *mm, addr_t new_addr) { for (int i = 0; i < PAGE_NR; i++) @@ -127,4 +128,5 @@ void *mm_page_alloc_fault(mm_pages_t *mm, addr_t addr) } return NULL; -} \ No newline at end of file +} +#endif diff --git a/mkrtos_knl/knl/mm_space.c b/mkrtos_knl/knl/mm_space.c index 8284cb779..1945b897a 100644 --- a/mkrtos_knl/knl/mm_space.c +++ b/mkrtos_knl/knl/mm_space.c @@ -13,21 +13,13 @@ #include "mm_space.h" #include "mpu.h" #include "assert.h" - +#if CONFIG_MK_MPU_CFG void mm_space_init(mm_space_t *mm_space, int is_knl) { - // region_info_t *regi_info; - for (int i = 0; i < CONFIG_REGION_NUM; i++) { mm_space->pt_regions[i].region_inx = -1; } - if (!is_knl) - { - // regi_info = mm_space_alloc_pt_region(mm_space); - // assert(regi_info); - // mm_pages_init(&mm_space->mm_pages, regi_info); - } } region_info_t *mm_space_alloc_pt_region(mm_space_t *m_space) { @@ -90,3 +82,4 @@ void mm_space_del(mm_space_t *m_space, umword_t addr) } } } +#endif diff --git a/mkrtos_knl/knl/share_mem.c b/mkrtos_knl/knl/share_mem.c index c6f937ff6..765acadf7 100644 --- a/mkrtos_knl/knl/share_mem.c +++ b/mkrtos_knl/knl/share_mem.c @@ -235,13 +235,16 @@ static void share_mem_init(share_mem_t *sm, umword_t max) */ static share_mem_t *share_mem_create(ram_limit_t *lim, size_t max) { + int align_size = max; +#if CONFIG_MK_MPU_CFG #if CONFIG_MPU_VERSION == 1 if (max < PAGE_SIZE || !is_power_of_2(max)) { //!< 大小必须是2的整数倍 return NULL; } + align_size = max; #elif CONFIG_MPU_VERSION == 2 if (max < MPU_ALIGN_SIZE || (max & (MPU_ALIGN_SIZE - 1))) { @@ -249,15 +252,18 @@ static share_mem_t *share_mem_create(ram_limit_t *lim, size_t max) return NULL; } max += MPU_ALIGN_SIZE; + align_size = MPU_ALIGN_SIZE; +#endif +#else + align_size = sizeof(void *); #endif - share_mem_t *mem = mm_limit_alloc(lim, sizeof(share_mem_t)); if (!mem) { return NULL; } - mem->mem = mm_limit_alloc_align(lim, max, CONFIG_MPU_VERSION == 2 ? MPU_ALIGN_SIZE : max); + mem->mem = mm_limit_alloc_align(lim, max, align_size); if (!mem->mem) { mm_limit_free(lim, mem); diff --git a/mkrtos_knl/knl/task.c b/mkrtos_knl/knl/task.c index 33ca9467c..5d5100ef9 100755 --- a/mkrtos_knl/knl/task.c +++ b/mkrtos_knl/knl/task.c @@ -313,7 +313,11 @@ static void task_release_stage2(kobject_t *kobj) // task_t *cur_tk = thread_get_current_task(); obj_space_release(&tk->obj_space, tk->lim); +#if CONFIG_MK_MPU_CFG mm_limit_free_align(tk->lim, tk->mm_space.mm_block, tk->mm_space.mm_block_size); +#else + mm_limit_free(tk->lim, tk->mm_space.mm_block); +#endif mm_limit_free(tk->lim, tk); // if (cur_tk == tk) // { diff --git a/mkrtos_knl/link.lds b/mkrtos_knl/link.lds index b357b2cfa..fc2fcd83c 100644 --- a/mkrtos_knl/link.lds +++ b/mkrtos_knl/link.lds @@ -2,7 +2,7 @@ ENTRY(Reset_Handler) MEMORY { RAM (arw) : ORIGIN = 0x20000000, LENGTH = 0x10000 - FLASH (arx) : ORIGIN = 0x00000000 + 0x2000, LENGTH = 0x10000 - 0x2000 + FLASH (arx) : ORIGIN = 0x8000000 + 0x2000, LENGTH = 0x10000 - 0x2000 } SECTIONS { diff --git a/mkrtos_user/server/init/src/main.c b/mkrtos_user/server/init/src/main.c index d6ecc2842..4f6123e91 100644 --- a/mkrtos_user/server/init/src/main.c +++ b/mkrtos_user/server/init/src/main.c @@ -36,6 +36,7 @@ static void test(void) { #if 0 + mpu_test(); sharea_mem_test(); printf_test(); ulog_test(); @@ -45,7 +46,6 @@ static void test(void) mm_test(); app_test(); - mpu_test(); thread_press_test(); kobj_create_press_test(); u_sleep_ms(1000); diff --git a/mkrtos_user/server/init/src/test/mpu_test.c b/mkrtos_user/server/init/src/test/mpu_test.c index 755f0b712..f03a215fe 100644 --- a/mkrtos_user/server/init/src/test/mpu_test.c +++ b/mkrtos_user/server/init/src/test/mpu_test.c @@ -5,7 +5,7 @@ void mpu_test(void) #if 1 // mpu保护测试 - int *test = ((int *)0x8000000); + int *test = ((int *)80000000); *test = 1; printf("test is %d\n", *test); #endif