diff --git a/.vscode/settings.json b/.vscode/settings.json index 4e59b2ee4..3ce97deb1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -68,7 +68,8 @@ "mm.h": "c", "atomic.h": "c", "slist.h": "c", - "exec.h": "c" + "exec.h": "c", + "bitset": "c" }, "cortex-debug.showRTOS": false } \ No newline at end of file diff --git a/mkrtos_real/device/early_console.c b/mkrtos_real/device/early_console.c index fa2487067..507d14a55 100644 --- a/mkrtos_real/device/early_console.c +++ b/mkrtos_real/device/early_console.c @@ -80,4 +80,4 @@ static int reg_early_console(void) console_reg(0); return 0; } -INIT_REG(reg_early_console, INIT_TEST_REG); +INIT_REG(reg_early_console, INIT_FUNC_REG); diff --git a/mkrtos_real/device/stm32f205rft6/bk_flash.c b/mkrtos_real/device/stm32f205rft6/bk_flash.c index 4982e1a73..bf5e82db7 100644 --- a/mkrtos_real/device/stm32f205rft6/bk_flash.c +++ b/mkrtos_real/device/stm32f205rft6/bk_flash.c @@ -50,7 +50,7 @@ static struct file_operations bk_ops = { .open = bk_file_open, .read = dev_t used_dev_no = BK_FLASH; #define DEV_NAME "flash" /** - * 注册设备驱动,注册成功返回设备驱动号 + * 娉ㄥ唽璁惧椹卞姩锛屾敞鍐屾垚鍔熻繑鍥炶澶囬┍鍔ㄥ彿 * @return */ int32_t bk_flash_init(void) { diff --git a/mkrtos_real/inc/config.h b/mkrtos_real/inc/config.h index 825cf515d..0becac214 100644 --- a/mkrtos_real/inc/config.h +++ b/mkrtos_real/inc/config.h @@ -10,7 +10,7 @@ #include #include - +typedef int (*init_func)(void); //!< 鍒濆鍖栧嚱鏁 #define SYS_NAME "mkrtos" #define SYS_VERSION "0.01" #define SYS_RELEASE "0.01" @@ -22,6 +22,7 @@ #define SECTION(x) __attribute__((section(x))) +//鑷姩鍒濆鍖栨帴鍙 #define INIT_LV0(name) const init_func mkrtos_init_func_##name SECTION(".mkrtos.init.0") = name #define INIT_LV1(name) const init_func mkrtos_init_func_##name SECTION(".mkrtos.init.1") = name #define INIT_LV2(name) const init_func mkrtos_init_func_##name SECTION(".mkrtos.init.2") = name @@ -30,9 +31,40 @@ #define INIT_REG(name, LVL)\ const init_func mkrtos_init_func_##name SECTION(".mkrtos.init."LVL) = name -#define INIT_TEST_REG "3" -#define INIT_TEST_LVL "4" +#define INIT_FUNC_REG "3" +#define INIT_PRE_BOOT "4" +/** + * @brief 鍒濆鍖栬皟鐢 + * + */ +static inline void mkrtos_init(void){ + extern ptr_t _mkrtos_init_start,_mkrtos_init_end; + ptr_t* func_start=(ptr_t*)(&_mkrtos_init_start); + ptr_t* func_stop=(ptr_t*)(&_mkrtos_init_end); + + for(;func_startpid); + //kprint("kill pid is %d.\n", get_current_task()->pid); if (get_current_task()->status == TASK_CLOSED) { return; } @@ -81,7 +81,7 @@ void do_exit(int32_t exitCode) { // #if MEM_TRACE // knl_mem_trace(); // #endif - get_sys_tasks_info()->wait_r++; + atomic_inc(&get_sys_tasks_info()->wait_r); restore_cpu_intr(t); } ///** diff --git a/mkrtos_real/knl/mkrtos.c b/mkrtos_real/knl/mkrtos.c index c54bc8ad0..bf437b26c 100644 --- a/mkrtos_real/knl/mkrtos.c +++ b/mkrtos_real/knl/mkrtos.c @@ -11,19 +11,7 @@ #include #include -extern ptr_t _mkrtos_init_start,_mkrtos_init_end; -/** - * @brief 鍒濆鍖栬皟鐢 - * - */ -static void mkrtos_init(void){ - ptr_t* func_start=(ptr_t*)(&_mkrtos_init_start); - ptr_t* func_stop=(ptr_t*)(&_mkrtos_init_end); - for(;func_start int main(void) { - //delay(); - extern int32_t bk_flash_init(void); - extern int32_t sp_mkfs(dev_t dev_no, int32_t inode_count); + static struct task_create_par tcp; + int32_t pid; + extern int32_t bk_flash_init(void); __enable_irq(); // //TODO:澧炲姞鏍8瀛楄妭瀵归綈 ((uint8_t *)(0xE000E008))[0] |= 0x6; @@ -47,14 +53,6 @@ int main(void) { //鍒濆鍖栭粯璁ょ殑纾佺洏璁惧 root_dev_no = bk_flash_init(); -// //鍦ㄨ繖閲屾牸寮忓寲鏂囦欢绯荤粺 -// if (sp_mkfs(root_dev_no, 30) < 0) { -// kfatal("鏍规枃浠剁郴缁熷垱寤哄け璐ワ紒\r\n"); -// } - - static struct task_create_par tcp; - int32_t pid; - init_sche(); tcp.task_fun = thread_main; diff --git a/mkrtos_real/stm32f205rft6_link.lds b/mkrtos_real/stm32f205rft6_link.lds index 33cc62203..a30cb3908 100644 --- a/mkrtos_real/stm32f205rft6_link.lds +++ b/mkrtos_real/stm32f205rft6_link.lds @@ -49,7 +49,11 @@ SECTIONS _mkrtos_init_start = .; KEEP (*(SORT(.mkrtos.init.*))) _mkrtos_init_end = .; - + + . = ALIGN(4); + _mkrtos_init_test_start = .; + KEEP (*(SORT(.mkrtos.test.*))) + _mkrtos_init_test_end = .; . = ALIGN(4); _etext = .; /* define a global symbols at end of code */ diff --git a/mkrtos_real/test/test_i_startup.c b/mkrtos_real/test/test_i_startup.c index c784133b3..56afdffb1 100644 --- a/mkrtos_real/test/test_i_startup.c +++ b/mkrtos_real/test/test_i_startup.c @@ -48,4 +48,4 @@ int test_mem(void) return 0; } -INIT_REG(test_mem, INIT_TEST_LVL); +INIT_TEST_REG(test_mem, INIT_TEST_LVL); diff --git a/mkrtos_real/test/test_sched.c b/mkrtos_real/test/test_sched.c index f17edd54d..4af8114d8 100644 --- a/mkrtos_real/test/test_sched.c +++ b/mkrtos_real/test/test_sched.c @@ -24,4 +24,4 @@ static int test_sched(void) return 0; } -INIT_REG(test_sched, INIT_TEST_LVL); +INIT_TEST_REG(test_sched, INIT_TEST_LVL); diff --git a/mkrtos_real/test/test_thread.c b/mkrtos_real/test/test_thread.c new file mode 100644 index 000000000..c0cd62d84 --- /dev/null +++ b/mkrtos_real/test/test_thread.c @@ -0,0 +1,78 @@ +#include +#include +#include "config.h" +#include "knl_service.h" +#include + +static void test_thread_entry(int arg0, int arg1) +{ + struct task *cur_task; + + cur_task = get_current_task(); + MKRTOS_ASSERT(arg0 == 1); + MKRTOS_ASSERT(arg1 == 2); + //kprint("pid:%d\n", cur_task->pid); +} +static void test_thread_prio(int arg0, int arg1) +{ + struct task *cur_task; + + cur_task = get_current_task(); + MKRTOS_ASSERT(arg0 == 1); + MKRTOS_ASSERT(arg1 == 2); + kprint("pid:%d prio:%d\n", cur_task->pid, cur_task->prio); +} +static int test_thread(void) +{ + pid_t pid; + static struct task_create_par tcp; + + kprint("=======start sched mem\n"); + for (int i = 0; i < 100; i++) { + tcp.task_fun = test_thread_entry; + tcp.arg0 = (void*) 1; + tcp.arg1 = 2; + tcp.prio = 6; + tcp.exec_id = -1; + tcp.user_stack_size = 0; + tcp.kernel_stack_size = 256; + tcp.task_name = "main"; + + pid = task_create(&tcp, TRUE); + if (pid < 0) { + sleep_ms(50); + continue; + } + } + while(atomic_read(&sys_tasks_info.wait_r)!=0) { + sleep_ms(500); + } + sleep_ms(500); + sche_lock(); + for (int i = 1; i <= 3; i++) { + tcp.task_fun = test_thread_prio; + tcp.arg0 = (void*) 1; + tcp.arg1 = 2; + tcp.prio = i; + tcp.exec_id = -1; + tcp.user_stack_size = 0; + tcp.kernel_stack_size = 256; + tcp.task_name = "main"; + + pid = task_create(&tcp, TRUE); + if (pid < 0) { + kprint("=======prio test fail.\n"); + break; + } + } + sche_unlock(); + while(atomic_read(&sys_tasks_info.wait_r)!=0) { + sleep_ms(500); + } + sleep_ms(500); + knl_mem_trace(); + kprint("=======end sched mem\n"); + return 0; +} + +INIT_TEST_REG(test_thread, INIT_TEST_LVL);