From 55c0a9f27900d19556d52110be6397f3ee15a6c3 Mon Sep 17 00:00:00 2001 From: tmmdh <921889738@qq.com> Date: Sun, 25 Oct 2020 11:54:06 +0800 Subject: fix the conflicting file. --- examples/kernel/SConscript | 1 + examples/kernel/mutex_priority.c | 425 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 426 insertions(+) mode change 100644 => 100755 examples/kernel/SConscript create mode 100755 examples/kernel/mutex_priority.c (limited to 'examples/kernel') diff --git a/examples/kernel/SConscript b/examples/kernel/SConscript old mode 100644 new mode 100755 index 4cffe1c38c..5f58f0fcc0 --- a/examples/kernel/SConscript +++ b/examples/kernel/SConscript @@ -19,6 +19,7 @@ semaphore_priority.c semaphore_buffer_worker.c semaphore_producer_consumer.c mutex_simple.c +mutex_priority.c event_simple.c mbox_simple.c mbox_send_wait.c diff --git a/examples/kernel/mutex_priority.c b/examples/kernel/mutex_priority.c new file mode 100755 index 0000000000..f647fc4039 --- /dev/null +++ b/examples/kernel/mutex_priority.c @@ -0,0 +1,425 @@ +/* + * 创建7个进程,tid20、tid21、tid22、tid23、tid24、tid25、tid26、tid27、tid28、tid29 + * 各任务优先级分别为20、21、22、23、24、25、26、27、28、29, + * 其中tid26最先获得锁,tid22不需要使用到互斥锁,其他所有进程均需要使用互斥锁, + * 通过各个进程的打印信息,观察各个进程获取到互斥锁后,优先级变化情况 + */ +#include +#include "tc_comm.h" + +static rt_thread_t tid20 = RT_NULL; +static rt_thread_t tid21 = RT_NULL; +static rt_thread_t tid22 = RT_NULL; +static rt_thread_t tid23 = RT_NULL; +static rt_thread_t tid24 = RT_NULL; +static rt_thread_t tid25 = RT_NULL; +static rt_thread_t tid26 = RT_NULL; +static rt_thread_t tid27 = RT_NULL; +static rt_thread_t tid28 = RT_NULL; +static rt_thread_t tid29 = RT_NULL; + +static rt_mutex_t mutex = RT_NULL; + +static void thread20_entry(void* parameter) +{ + rt_err_t result; + rt_tick_t tick; + + rt_kprintf("[%d] thread20 run!\n", rt_tick_get()); + rt_thread_delay(30); + rt_kprintf("[%d] thread20 wake!\n", rt_tick_get()); + + result = rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (result != RT_EOK) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + } + rt_kprintf("[%d] thread20 take!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 5) + { + rt_kprintf("[%d] thread20, init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid20->init_priority, tid20->current_priority); + } + rt_mutex_release(mutex); + rt_kprintf("[%d] thread20 exit!\n", rt_tick_get()); +} + +static void thread21_entry(void* parameter) +{ + rt_err_t result; + rt_tick_t tick; + rt_kprintf("[%d] thread21 run!\n", rt_tick_get()); + rt_thread_delay(25); + rt_kprintf("[%d] thread21 wake!\n", rt_tick_get()); + + result = rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (result != RT_EOK) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + } + rt_kprintf("[%d] thread21 take!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 5) + { + rt_kprintf("[%d] thread21, init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid21->init_priority, tid21->current_priority); + } + rt_mutex_release(mutex); + rt_kprintf("[%d] thread21 exit!\n", rt_tick_get()); + +} + +static void thread22_entry(void* parameter) +{ + rt_tick_t tick; + + rt_kprintf("[%d] thread22 run!\n", rt_tick_get()); + rt_thread_delay(20); + rt_kprintf("[%d] thread22 wake!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 100) + { + rt_kprintf("[%d] thread22 running..., init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid22->init_priority, tid22->current_priority); + rt_thread_delay(2); + } + rt_kprintf("[%d] thread22 exit!\n", rt_tick_get()); +} + +static void thread23_entry(void* parameter) +{ + rt_err_t result; + rt_tick_t tick; + rt_kprintf("[%d] thread23 run!\n", rt_tick_get()); + rt_thread_delay(15); + rt_kprintf("[%d] thread23 wake!\n", rt_tick_get()); + + result = rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (result != RT_EOK) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + } + rt_kprintf("[%d] thread23 take!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 5) + { + rt_kprintf("[%d] thread23, init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid23->init_priority, tid23->current_priority); + } + rt_mutex_release(mutex); + rt_kprintf("[%d] thread23 exit!\n", rt_tick_get()); +} + +static void thread24_entry(void* parameter) +{ + rt_err_t result; + rt_tick_t tick; + + rt_kprintf("[%d] thread24 run!\n", rt_tick_get()); + rt_thread_delay(10); + rt_kprintf("[%d] thread24 wake!\n", rt_tick_get()); + + result = rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (result != RT_EOK) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + } + rt_kprintf("[%d] thread24 take!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 5) + { + rt_kprintf("[%d] thread24, init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid24->init_priority, tid24->current_priority); + } + rt_mutex_release(mutex); + rt_kprintf("[%d] thread24 exit!\n", rt_tick_get()); +} + +static void thread25_entry(void* parameter) +{ + rt_err_t result; + rt_tick_t tick; + rt_kprintf("[%d] thread25 run!\n", rt_tick_get()); + rt_thread_delay(5); + rt_kprintf("[%d] thread25 wake!\n", rt_tick_get()); + + result = rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (result != RT_EOK) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + } + rt_kprintf("[%d] thread25 take!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 5) + { + rt_kprintf("[%d] thread25, init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid25->init_priority, tid25->current_priority); + } + rt_mutex_release(mutex); + rt_kprintf("[%d] thread25 exit!\n", rt_tick_get()); +} + +static void thread26_entry(void* parameter) +{ + rt_tick_t tick; + rt_err_t result; + + rt_kprintf("[%d] thread26 run!\n", rt_tick_get()); + + result = rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (result != RT_EOK) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + } + rt_kprintf("[%d] thread26 take!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 50) + { + rt_kprintf("[%d] thread26, init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid26->init_priority, tid26->current_priority); + rt_thread_delay(1); + } + rt_mutex_release(mutex); + rt_kprintf("[%d] thread26 exit!\n", rt_tick_get()); +} + +static void thread27_entry(void* parameter) +{ + rt_tick_t tick; + rt_err_t result; + + rt_kprintf("[%d] thread27 run!\n", rt_tick_get()); + rt_thread_delay(35); + rt_kprintf("[%d] thread27 wake!\n", rt_tick_get()); + + result = rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (result != RT_EOK) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + } + rt_kprintf("[%d] thread27 take!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 5) + { + rt_kprintf("[%d] thread27, init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid27->init_priority, tid27->current_priority); + } + rt_mutex_release(mutex); + rt_kprintf("[%d] thread27 exit!\n", rt_tick_get()); +} + +static void thread28_entry(void* parameter) +{ + rt_tick_t tick; + rt_err_t result; + + rt_kprintf("[%d] thread28 run!\n", rt_tick_get()); + rt_thread_delay(40); + rt_kprintf("[%d] thread28 wake!\n", rt_tick_get()); + + result = rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (result != RT_EOK) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + } + rt_kprintf("[%d] thread28 take!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 5) + { + rt_kprintf("[%d] thread28, init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid28->init_priority, tid28->current_priority); + } + rt_mutex_release(mutex); + rt_kprintf("[%d] thread28 exit!\n", rt_tick_get()); +} + +static void thread29_entry(void* parameter) +{ + rt_tick_t tick; + rt_err_t result; + + rt_kprintf("[%d] thread29 run!\n", rt_tick_get()); + rt_thread_delay(45); + rt_kprintf("[%d] thread29 wake!\n", rt_tick_get()); + + result = rt_mutex_take(mutex, RT_WAITING_FOREVER); + if (result != RT_EOK) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + } + rt_kprintf("[%d] thread29 take!\n", rt_tick_get()); + + tick = rt_tick_get(); + while (rt_tick_get() - tick < 5) + { + rt_kprintf("[%d] thread29, init_priority=%d, current_priority=%d\n", + rt_tick_get(), tid29->init_priority, tid29->current_priority); + } + rt_mutex_release(mutex); + rt_kprintf("[%d] thread29 exit!\n", rt_tick_get()); +} + +static int mutex_simple_init() +{ + /* 创建互斥锁 */ + mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO); + if (mutex == RT_NULL) + { + tc_stat(TC_STAT_END | TC_STAT_FAILED); + return 0; + } + + tid29 = rt_thread_create("t29", + thread29_entry, RT_NULL, + THREAD_STACK_SIZE, 29, THREAD_TIMESLICE); + if (tid29 != RT_NULL) + rt_thread_startup(tid29); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + tid28 = rt_thread_create("t28", + thread28_entry, RT_NULL, + THREAD_STACK_SIZE, 28, THREAD_TIMESLICE); + if (tid28 != RT_NULL) + rt_thread_startup(tid28); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + tid27 = rt_thread_create("t27", + thread27_entry, RT_NULL, + THREAD_STACK_SIZE, 27, THREAD_TIMESLICE); + if (tid27 != RT_NULL) + rt_thread_startup(tid27); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + tid26 = rt_thread_create("t26", + thread26_entry, RT_NULL, + THREAD_STACK_SIZE, 26, THREAD_TIMESLICE); + if (tid26 != RT_NULL) + rt_thread_startup(tid26); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + tid25 = rt_thread_create("t25", + thread25_entry, RT_NULL, + THREAD_STACK_SIZE, 25, THREAD_TIMESLICE); + if (tid25 != RT_NULL) + rt_thread_startup(tid25); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + tid24 = rt_thread_create("t24", + thread24_entry, RT_NULL, + THREAD_STACK_SIZE, 24, THREAD_TIMESLICE); + if (tid24 != RT_NULL) + rt_thread_startup(tid24); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + tid23 = rt_thread_create("t23", + thread23_entry, RT_NULL, + THREAD_STACK_SIZE, 23, THREAD_TIMESLICE); + if (tid23 != RT_NULL) + rt_thread_startup(tid23); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + tid22 = rt_thread_create("t22", + thread22_entry, RT_NULL, + THREAD_STACK_SIZE, 22, THREAD_TIMESLICE); + if (tid22 != RT_NULL) + rt_thread_startup(tid22); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + tid21 = rt_thread_create("t21", + thread21_entry, RT_NULL, + THREAD_STACK_SIZE, 21, THREAD_TIMESLICE); + if (tid21 != RT_NULL) + rt_thread_startup(tid21); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + tid20 = rt_thread_create("t20", + thread20_entry, RT_NULL, + THREAD_STACK_SIZE, 20, THREAD_TIMESLICE); + if (tid20 != RT_NULL) + rt_thread_startup(tid20); + else + tc_stat(TC_STAT_END | TC_STAT_FAILED); + + return 0; +} + +#ifdef RT_USING_TC +static void _tc_cleanup() +{ + /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ + rt_enter_critical(); + + /* 删除线程 */ + if (tid20 != RT_NULL && tid20->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid20); + if (tid21 != RT_NULL && tid21->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid21); + if (tid22 != RT_NULL && tid22->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid22); + if (tid23 != RT_NULL && tid23->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid23); + if (tid24 != RT_NULL && tid24->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid24); + if (tid25 != RT_NULL && tid25->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid25); + if (tid26 != RT_NULL && tid26->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid26); + if (tid27 != RT_NULL && tid27->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid27); + if (tid28 != RT_NULL && tid28->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid28); + if (tid29 != RT_NULL && tid29->stat != RT_THREAD_CLOSE) + rt_thread_delete(tid29); + + if (mutex != RT_NULL) + { + rt_mutex_delete(mutex); + } + rt_kprintf("test_done!\n"); + + /* 调度器解锁 */ + rt_exit_critical(); + + /* 设置TestCase状态 */ + tc_done(TC_STAT_PASSED); +} + +int _tc_mutex_priority() +{ + /* 设置TestCase清理回调函数 */ + tc_cleanup(_tc_cleanup); + mutex_simple_init(); + + /* 返回TestCase运行的最长时间 */ + return 100; +} +/* 输出函数命令到finsh shell中 */ +FINSH_FUNCTION_EXPORT(_tc_mutex_priority, a priority rollover example of mutex); +#else +/* 用户应用入口 */ +int rt_application_init() +{ + mutex_simple_init(); + + return 0; +} +#endif -- cgit v1.3.1 From 08af426f01cf0321719c937d29a1d9315a0feab8 Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Sun, 7 Mar 2021 08:34:04 +0800 Subject: [example] 格式化整理 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/file/listdir.c | 2 +- examples/file/readspeed.c | 6 +- examples/file/readwrite.c | 208 ++++----- examples/file/seekdir.c | 52 +-- examples/file/writespeed.c | 2 +- examples/kernel/tc_comm.h | 2 +- examples/kernel/timer_control.c | 2 +- examples/kernel/timer_timeout.c | 68 +-- examples/libc/dirent.c | 82 ++-- examples/libc/env.c | 8 +- examples/libc/ex1.c | 34 +- examples/libc/ex6.c | 38 +- examples/libc/ex7.c | 146 +++--- examples/libc/file.c | 968 +++++++++++++++++++-------------------- examples/libc/memory.c | 54 +-- examples/libc/mq.c | 162 +++---- examples/libc/printf.c | 58 +-- examples/libc/rand.c | 56 +-- examples/libc/sem.c | 82 ++-- examples/libc/time.c | 14 +- examples/network/tcpsendpacket.c | 4 +- examples/pm/timer_app.c | 2 +- examples/pm/wakeup_app.c | 2 +- examples/test/dhry.h | 46 +- examples/test/dhry_1.c | 42 +- examples/test/dhry_2.c | 12 +- examples/test/hwtimer_test.c | 22 +- examples/test/net_test.c | 50 +- examples/test/rtc_test.c | 38 +- examples/ulog/ulog_example.c | 2 +- 30 files changed, 1132 insertions(+), 1132 deletions(-) (limited to 'examples/kernel') diff --git a/examples/file/listdir.c b/examples/file/listdir.c index d8ea7af82a..98fbc5ea2c 100644 --- a/examples/file/listdir.c +++ b/examples/file/listdir.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2020, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/examples/file/readspeed.c b/examples/file/readspeed.c index e5073856b4..ffc19635cf 100644 --- a/examples/file/readspeed.c +++ b/examples/file/readspeed.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2020, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -46,9 +46,9 @@ void readspeed(const char* filename, int block_size) } tick = rt_tick_get() - tick; - /* close file and release memory */ + /* close file and release memory */ close(fd); - rt_free(buff_ptr); + rt_free(buff_ptr); /* calculate read speed */ rt_kprintf("File read speed: %d byte/s\n", total_length /tick * RT_TICK_PER_SECOND); diff --git a/examples/file/readwrite.c b/examples/file/readwrite.c index 5738323805..56f3b7e16c 100644 --- a/examples/file/readwrite.c +++ b/examples/file/readwrite.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2020, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -17,21 +17,21 @@ /* file read write test */ void readwrite(const char* filename) { - int fd; - int index, length; - char* test_data; - char* buffer; - int block_size = TEST_DATA_LEN; - - /* open with write only & create */ - fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0); - if (fd < 0) - { - rt_kprintf("open file for write failed\n"); - return; - } - - test_data = rt_malloc(block_size); + int fd; + int index, length; + char* test_data; + char* buffer; + int block_size = TEST_DATA_LEN; + + /* open with write only & create */ + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0); + if (fd < 0) + { + rt_kprintf("open file for write failed\n"); + return; + } + + test_data = rt_malloc(block_size); if (test_data == RT_NULL) { rt_kprintf("no memory\n"); @@ -48,94 +48,94 @@ void readwrite(const char* filename) return; } - /* prepare some data */ - for (index = 0; index < block_size; index ++) - { - test_data[index] = index + 27; - } - - /* write to file */ - length = write(fd, test_data, block_size); - if (length != block_size) - { - rt_kprintf("write data failed\n"); - close(fd); - goto __exit; - } - - /* close file */ - close(fd); - - /* reopen the file with append to the end */ - fd = open(filename, O_WRONLY | O_CREAT | O_APPEND, 0); - if (fd < 0) - { - rt_kprintf("open file for append write failed\n"); - goto __exit;; - } - - length = write(fd, test_data, block_size); - if (length != block_size) - { - rt_kprintf("append write data failed\n"); - close(fd); - goto __exit; - } - /* close the file */ - close(fd); - - /* open the file for data validation. */ - fd = open(filename, O_RDONLY, 0); - if (fd < 0) - { - rt_kprintf("check: open file for read failed\n"); - goto __exit; - } - - /* read the data (should be the data written by the first time ) */ - length = read(fd, buffer, block_size); - if (length != block_size) - { - rt_kprintf("check: read file failed\n"); - close(fd); - goto __exit; - } - - /* validate */ - for (index = 0; index < block_size; index ++) - { - if (test_data[index] != buffer[index]) - { - rt_kprintf("check: check data failed at %d\n", index); - close(fd); - goto __exit; - } - } - - /* read the data (should be the second time data) */ - length = read(fd, buffer, block_size); - if (length != block_size) - { - rt_kprintf("check: read file failed\n"); - close(fd); - goto __exit; - } - - /* validate */ - for (index = 0; index < block_size; index ++) - { - if (test_data[index] != buffer[index]) - { - rt_kprintf("check: check data failed at %d\n", index); - close(fd); - goto __exit; - } - } - - /* close the file */ - close(fd); - /* print result */ - rt_kprintf("read/write test successful!\n"); + /* prepare some data */ + for (index = 0; index < block_size; index ++) + { + test_data[index] = index + 27; + } + + /* write to file */ + length = write(fd, test_data, block_size); + if (length != block_size) + { + rt_kprintf("write data failed\n"); + close(fd); + goto __exit; + } + + /* close file */ + close(fd); + + /* reopen the file with append to the end */ + fd = open(filename, O_WRONLY | O_CREAT | O_APPEND, 0); + if (fd < 0) + { + rt_kprintf("open file for append write failed\n"); + goto __exit;; + } + + length = write(fd, test_data, block_size); + if (length != block_size) + { + rt_kprintf("append write data failed\n"); + close(fd); + goto __exit; + } + /* close the file */ + close(fd); + + /* open the file for data validation. */ + fd = open(filename, O_RDONLY, 0); + if (fd < 0) + { + rt_kprintf("check: open file for read failed\n"); + goto __exit; + } + + /* read the data (should be the data written by the first time ) */ + length = read(fd, buffer, block_size); + if (length != block_size) + { + rt_kprintf("check: read file failed\n"); + close(fd); + goto __exit; + } + + /* validate */ + for (index = 0; index < block_size; index ++) + { + if (test_data[index] != buffer[index]) + { + rt_kprintf("check: check data failed at %d\n", index); + close(fd); + goto __exit; + } + } + + /* read the data (should be the second time data) */ + length = read(fd, buffer, block_size); + if (length != block_size) + { + rt_kprintf("check: read file failed\n"); + close(fd); + goto __exit; + } + + /* validate */ + for (index = 0; index < block_size; index ++) + { + if (test_data[index] != buffer[index]) + { + rt_kprintf("check: check data failed at %d\n", index); + close(fd); + goto __exit; + } + } + + /* close the file */ + close(fd); + /* print result */ + rt_kprintf("read/write test successful!\n"); __exit: rt_free(test_data); diff --git a/examples/file/seekdir.c b/examples/file/seekdir.c index d6a33426b4..efadd3a1c8 100644 --- a/examples/file/seekdir.c +++ b/examples/file/seekdir.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2020, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -12,35 +12,35 @@ void seekdir_test(void) { - DIR * dirp; - long save3 = 0; - int i = 0; - struct dirent *dp; + DIR * dirp; + long save3 = 0; + int i = 0; + struct dirent *dp; - dirp = opendir ("/"); - save3 = telldir(dirp); - for (dp = readdir(dirp); dp != RT_NULL; dp = readdir(dirp)) - { - rt_kprintf("direntry: %s\n", dp->d_name); + dirp = opendir ("/"); + save3 = telldir(dirp); + for (dp = readdir(dirp); dp != RT_NULL; dp = readdir(dirp)) + { + rt_kprintf("direntry: %s\n", dp->d_name); - /* save the pointer of the third directory */ - if (i++ == 3) - { - save3 = telldir(dirp); - } - } + /* save the pointer of the third directory */ + if (i++ == 3) + { + save3 = telldir(dirp); + } + } - /* get back to the third directory */ - seekdir (dirp, save3); - rt_kprintf("seek dientry to: %d\n", save3); - for (dp = readdir(dirp); dp != RT_NULL; dp = readdir(dirp)) - { - rt_kprintf("direntry: %s\n", dp->d_name); - } + /* get back to the third directory */ + seekdir (dirp, save3); + rt_kprintf("seek dientry to: %d\n", save3); + for (dp = readdir(dirp); dp != RT_NULL; dp = readdir(dirp)) + { + rt_kprintf("direntry: %s\n", dp->d_name); + } - /* close the directory */ - closedir (dirp); -} + /* close the directory */ + closedir (dirp); +} #ifdef RT_USING_FINSH #include diff --git a/examples/file/writespeed.c b/examples/file/writespeed.c index 60dd900a68..680761583c 100644 --- a/examples/file/writespeed.c +++ b/examples/file/writespeed.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2020, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/examples/kernel/tc_comm.h b/examples/kernel/tc_comm.h index aee1fec2d2..c72c91ad53 100644 --- a/examples/kernel/tc_comm.h +++ b/examples/kernel/tc_comm.h @@ -1,7 +1,7 @@ #ifndef __TC_COMM_H__ #define __TC_COMM_H__ -/* +/* * RT-Thread TestCase * */ diff --git a/examples/kernel/timer_control.c b/examples/kernel/timer_control.c index 9fcb0d4c4d..d1f782fcce 100644 --- a/examples/kernel/timer_control.c +++ b/examples/kernel/timer_control.c @@ -14,7 +14,7 @@ static rt_uint8_t count; static void timeout1(void* parameter) { rt_tick_t timeout = 50; - + rt_kprintf("periodic timer is timeout\n"); count ++; diff --git a/examples/kernel/timer_timeout.c b/examples/kernel/timer_timeout.c index d1a7099e2e..4d9a4fcc1d 100644 --- a/examples/kernel/timer_timeout.c +++ b/examples/kernel/timer_timeout.c @@ -1,21 +1,21 @@ /* - * ³ÌÐòÇ嵥£ºÏûϢ¶ÓÁÐÀý³Ì + * 程序清单:消息队列例程 * - * Õâ¸ö³ÌÐò»ᴴ½¨3¸ö¶¯̬Ị̈߳¬һ¸öÏ̻߳á´ÓÏûϢ¶ÓÁÐÖÐÊÕȡÏûϢ£»һ¸öÏ̻߳ᶨʱ¸øÏû - * Ϣ¶ÓÁз¢ËÍÏûϢ£»һ¸öÏ̻߳ᶨʱ¸øÏûϢ¶ÓÁз¢Ëͽô¼±ÏûϢ¡£ + * 这个程序会创建3个动态线程,一个线程会从消息队列中收取消息;一个线程会定时给消 + * 息队列发送消息;一个线程会定时给消息队列发送紧急消息。 */ #include #include "tc_comm.h" -/* ָÏòÏ߳̿ØÖƿéµÄָÕë */ +/* 指向线程控制块的指针 */ static rt_thread_t tid = RT_NULL; -/* ÏûϢ¶ÓÁпØÖƿé */ +/* 消息队列控制块 */ static struct rt_messagequeue mq; -/* ÏûϢ¶ÓÁÐÖÐÓõ½µķÅÖÃÏûϢµÄÄڴæ³Ø */ +/* 消息队列中用到的放置消息的内存池 */ static char msg_pool[2048]; -/* ¶¨ʱÆ÷µĿØÖƿé */ +/* 定时器的控制块 */ static struct rt_timer timer; static rt_uint16_t no = 0; static void timer_timeout(void* parameter) @@ -27,24 +27,24 @@ static void timer_timeout(void* parameter) rt_mq_send(&mq, &buf[0], length); } -/* Ï߳ÌÈë¿ں¯Êý */ +/* 线程入口函数 */ static void thread_entry(void* parameter) { char buf[64]; rt_err_t result; - /* ³õʼ»¯¶¨ʱÆ÷ */ - rt_timer_init(&timer, "timer", /* ¶¨ʱÆ÷Ãû×ÖÊÇ timer1 */ - timer_timeout, /* ³¬ʱʱ»ص÷µĴ¦Àíº¯Êý */ - RT_NULL, /* ³¬ʱº¯ÊýµÄÈë¿ڲÎÊý */ - 1, /* ¶¨ʱ³¤¶ȣ¬ÒÔOS TickΪµ¥λ£¬¼´1¸öOS Tick */ - RT_TIMER_FLAG_PERIODIC); /* ÖÜÆÚÐԶ¨ʱÆ÷ */ + /* 初始化定时器 */ + rt_timer_init(&timer, "timer", /* 定时器名字是 timer1 */ + timer_timeout, /* 超时时回调的处理函数 */ + RT_NULL, /* 超时函数的入口参数 */ + 1, /* 定时长度,以OS Tick为单位,即1个OS Tick */ + RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */ while (1) { rt_memset(&buf[0], 0, sizeof(buf)); - /* ´ÓÏûϢ¶ÓÁÐÖнÓÊÕÏûϢ */ + /* 从消息队列中接收消息 */ result = rt_mq_recv(&mq, &buf[0], sizeof(buf), 1); if (result == RT_EOK) { @@ -59,16 +59,16 @@ static void thread_entry(void* parameter) int timer_timeout_init() { - /* ³õʼ»¯ÏûϢ¶ÓÁÐ */ - rt_mq_init(&mq, "mqt", - &msg_pool[0], /* Äڴæ³ØָÏòmsg_pool */ - 128 - sizeof(void*), /* ÿ¸öÏûϢµĴóСÊÇ 128 - void* */ - sizeof(msg_pool), /* Äڴæ³صĴóСÊÇmsg_poolµĴóС */ - RT_IPC_FLAG_FIFO); /* Èç¹ûÓжà¸öÏ̵߳ȴý£¬°´ÕÕÏÈÀ´Ïȵõ½µķ½·¨·ÖÅäÏûϢ */ - - /* ´´½¨Ï߳Ì */ + /* 初始化消息队列 */ + rt_mq_init(&mq, "mqt", + &msg_pool[0], /* 内存池指向msg_pool */ + 128 - sizeof(void*), /* 每个消息的大小是 128 - void* */ + sizeof(msg_pool), /* 内存池的大小是msg_pool的大小 */ + RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ + + /* 创建线程 */ tid = rt_thread_create("t", - thread_entry, RT_NULL, /* Ï߳ÌÈë¿ÚÊÇthread_entry, Èë¿ڲÎÊýÊÇRT_NULL */ + thread_entry, RT_NULL, /* 线程入口是thread_entry, 入口参数是RT_NULL */ THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid != RT_NULL) rt_thread_startup(tid); @@ -81,38 +81,38 @@ int timer_timeout_init() #ifdef RT_USING_TC static void _tc_cleanup() { - /* µ÷¶ÈÆ÷ÉÏËø£¬ÉÏËøº󣬽«²»ÔÙÇл»µ½ÆäËûỊ̈߳¬½öÏìӦÖжÏ */ + /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ rt_enter_critical(); - /* ɾ³ýÏ߳Ì */ + /* 删除线程 */ if (tid != RT_NULL && tid->stat != RT_THREAD_CLOSE) rt_thread_delete(tid); - /* ִÐÐÏûϢ¶ÓÁжÔÏóÍÑÀë */ + /* 执行消息队列对象脱离 */ rt_mq_detach(&mq); - /* ִÐж¨ʱÆ÷ÍÑÀë */ + /* 执行定时器脱离 */ rt_timer_detach(&timer); - /* µ÷¶ÈÆ÷½âËø */ + /* 调度器解锁 */ rt_exit_critical(); - /* ÉèÖÃTestCase״̬ */ + /* 设置TestCase状态 */ tc_done(TC_STAT_PASSED); } int _tc_timer_timeout() { - /* ÉèÖÃTestCaseÇåÀí»ص÷º¯Êý */ + /* 设置TestCase清理回调函数 */ tc_cleanup(_tc_cleanup); timer_timeout_init(); - /* ·µ»ØTestCaseÔËÐеÄ×ʱ¼ä */ + /* 返回TestCase运行的最长时间 */ return 100; } -/* Êä³öº¯ÊýÃüÁfinsh shellÖÐ */ +/* 输出函数命令到finsh shell中 */ FINSH_FUNCTION_EXPORT(_tc_timer_timeout, a thread timer testcase); #else -/* Óû§ӦÓÃÈë¿Ú */ +/* 用户应用入口 */ int rt_application_init() { timer_timeout_init(); diff --git a/examples/libc/dirent.c b/examples/libc/dirent.c index 75604f6067..06b72110e3 100644 --- a/examples/libc/dirent.c +++ b/examples/libc/dirent.c @@ -11,46 +11,46 @@ #include int libc_dirent() { - DIR * dirp; - long int save3 = 0; - long int cur; - int i = 0; - int result = 0; - struct dirent *dp; - - dirp = opendir("/"); - for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) - { - /* save position 3 (after fourth entry) */ - if (i++ == 3) - save3 = telldir(dirp); - - printf("%s\n", dp->d_name); - - /* stop at 400 (just to make sure dirp->__offset and dirp->__size are - scrambled */ - if (i == 400) - break; - } - - printf("going back past 4-th entry...\n"); - - /* go back to saved entry */ - seekdir(dirp, save3); - - /* Check whether telldir equals to save3 now. */ - cur = telldir(dirp); - if (cur != save3) - { - printf("seekdir (d, %ld); telldir (d) == %ld\n", save3, cur); - result = 1; - } - - /* print remaining files (3-last) */ - for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) - printf("%s\n", dp->d_name); - - closedir(dirp); - return result; + DIR * dirp; + long int save3 = 0; + long int cur; + int i = 0; + int result = 0; + struct dirent *dp; + + dirp = opendir("/"); + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) + { + /* save position 3 (after fourth entry) */ + if (i++ == 3) + save3 = telldir(dirp); + + printf("%s\n", dp->d_name); + + /* stop at 400 (just to make sure dirp->__offset and dirp->__size are + scrambled */ + if (i == 400) + break; + } + + printf("going back past 4-th entry...\n"); + + /* go back to saved entry */ + seekdir(dirp, save3); + + /* Check whether telldir equals to save3 now. */ + cur = telldir(dirp); + if (cur != save3) + { + printf("seekdir (d, %ld); telldir (d) == %ld\n", save3, cur); + result = 1; + } + + /* print remaining files (3-last) */ + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) + printf("%s\n", dp->d_name); + + closedir(dirp); + return result; } FINSH_FUNCTION_EXPORT(libc_dirent, dirent test for libc); diff --git a/examples/libc/env.c b/examples/libc/env.c index ca67ac2e2a..6bc8ba4d7e 100644 --- a/examples/libc/env.c +++ b/examples/libc/env.c @@ -10,9 +10,9 @@ int libc_env() { - printf("PATH=%s\n", getenv("PATH")); - putenv("foo=bar"); - printf("foo=%s\n", getenv("foo")); - return 0; + printf("PATH=%s\n", getenv("PATH")); + putenv("foo=bar"); + printf("foo=%s\n", getenv("foo")); + return 0; } FINSH_FUNCTION_EXPORT(libc_env, get/set_env test); diff --git a/examples/libc/ex1.c b/examples/libc/ex1.c index 2acbfc3a39..f03fefbc00 100644 --- a/examples/libc/ex1.c +++ b/examples/libc/ex1.c @@ -9,29 +9,29 @@ static void *process(void * arg) { - int i; - printf("Starting process %s\n", (char *)arg); - for (i = 0; i < 10000; i++) - write(1, (char *) arg, 1); - return NULL; + int i; + printf("Starting process %s\n", (char *)arg); + for (i = 0; i < 10000; i++) + write(1, (char *) arg, 1); + return NULL; } #define sucfail(r) (r != 0 ? "failed" : "succeeded") int libc_ex1(void) { - int pret, ret = 0; - pthread_t th_a, th_b; - void *retval; + int pret, ret = 0; + pthread_t th_a, th_b; + void *retval; - ret += (pret = pthread_create(&th_a, NULL, process, (void *)"a")); - printf("create a %s %d\n", sucfail(pret), pret); - ret += (pret = pthread_create(&th_b, NULL, process, (void *)"b")); - printf("create b %s %d\n", sucfail(pret), pret); - ret += (pret = pthread_join(th_a, &retval)); - printf("join a %s %d\n", sucfail(pret), pret); - ret += (pret = pthread_join(th_b, &retval)); - printf("join b %s %d\n", sucfail(pret), pret); - return ret; + ret += (pret = pthread_create(&th_a, NULL, process, (void *)"a")); + printf("create a %s %d\n", sucfail(pret), pret); + ret += (pret = pthread_create(&th_b, NULL, process, (void *)"b")); + printf("create b %s %d\n", sucfail(pret), pret); + ret += (pret = pthread_join(th_a, &retval)); + printf("join a %s %d\n", sucfail(pret), pret); + ret += (pret = pthread_join(th_b, &retval)); + printf("join b %s %d\n", sucfail(pret), pret); + return ret; } #include FINSH_FUNCTION_EXPORT(libc_ex1, example 1 for libc); diff --git a/examples/libc/ex6.c b/examples/libc/ex6.c index dea6ead8cb..ecf813fef8 100644 --- a/examples/libc/ex6.c +++ b/examples/libc/ex6.c @@ -7,31 +7,31 @@ #define usleep rt_thread_sleep static void *test_thread(void *v_param) { - return NULL; + return NULL; } int libc_ex6(void) { - unsigned long count; + unsigned long count; - setvbuf(stdout, NULL, _IONBF, 0); + setvbuf(stdout, NULL, _IONBF, 0); - for (count = 0; count < 2000; ++count) { - pthread_t thread; - int status; + for (count = 0; count < 2000; ++count) { + pthread_t thread; + int status; - status = pthread_create(&thread, NULL, test_thread, NULL); - if (status != 0) { - printf("status = %d, count = %lu: %s\n", status, count, strerror( - errno)); - return 1; - } else { - printf("count = %lu\n", count); - } - /* pthread_detach (thread); */ - pthread_join(thread, NULL); - usleep(10); - } - return 0; + status = pthread_create(&thread, NULL, test_thread, NULL); + if (status != 0) { + printf("status = %d, count = %lu: %s\n", status, count, strerror( + errno)); + return 1; + } else { + printf("count = %lu\n", count); + } + /* pthread_detach (thread); */ + pthread_join(thread, NULL); + usleep(10); + } + return 0; } #include FINSH_FUNCTION_EXPORT(libc_ex6, example 6 for libc); diff --git a/examples/libc/ex7.c b/examples/libc/ex7.c index 859d18e7bd..e6473d48c2 100644 --- a/examples/libc/ex7.c +++ b/examples/libc/ex7.c @@ -14,88 +14,88 @@ /* Our event variable using a condition variable contruct. */ typedef struct { - pthread_mutex_t mutex; - pthread_cond_t cond; - int flag; + pthread_mutex_t mutex; + pthread_cond_t cond; + int flag; } event_t; /* Global event to signal main thread the timeout of the child thread. */ event_t main_event; static void *test_thread(void *ms_param) { - int status = 0; - event_t foo; - struct timespec time; - struct timeval now; - long ms = (long) ms_param; - - /* initialize cond var */ - pthread_cond_init(&foo.cond, NULL); - pthread_mutex_init(&foo.mutex, NULL); - foo.flag = 0; - - /* set the time out value */ - printf("waiting %ld ms ...\n", ms); - gettimeofday(&now, NULL); - time.tv_sec = now.tv_sec + ms / 1000 + (now.tv_usec + (ms % 1000) * 1000) - / 1000000; - time.tv_nsec = ((now.tv_usec + (ms % 1000) * 1000) % 1000000) * 1000; - - /* Just use this to test the time out. The cond var is never signaled. */ - pthread_mutex_lock(&foo.mutex); - while (foo.flag == 0 && status != ETIMEDOUT) { - status = pthread_cond_timedwait(&foo.cond, &foo.mutex, &time); - } - pthread_mutex_unlock(&foo.mutex); - - /* post the main event */ - pthread_mutex_lock(&main_event.mutex); - main_event.flag = 1; - pthread_cond_signal(&main_event.cond); - pthread_mutex_unlock(&main_event.mutex); - - /* that's it, bye */ - return (void*) status; + int status = 0; + event_t foo; + struct timespec time; + struct timeval now; + long ms = (long) ms_param; + + /* initialize cond var */ + pthread_cond_init(&foo.cond, NULL); + pthread_mutex_init(&foo.mutex, NULL); + foo.flag = 0; + + /* set the time out value */ + printf("waiting %ld ms ...\n", ms); + gettimeofday(&now, NULL); + time.tv_sec = now.tv_sec + ms / 1000 + (now.tv_usec + (ms % 1000) * 1000) + / 1000000; + time.tv_nsec = ((now.tv_usec + (ms % 1000) * 1000) % 1000000) * 1000; + + /* Just use this to test the time out. The cond var is never signaled. */ + pthread_mutex_lock(&foo.mutex); + while (foo.flag == 0 && status != ETIMEDOUT) { + status = pthread_cond_timedwait(&foo.cond, &foo.mutex, &time); + } + pthread_mutex_unlock(&foo.mutex); + + /* post the main event */ + pthread_mutex_lock(&main_event.mutex); + main_event.flag = 1; + pthread_cond_signal(&main_event.cond); + pthread_mutex_unlock(&main_event.mutex); + + /* that's it, bye */ + return (void*) status; } int libc_ex7(void) { - unsigned long count; - - setvbuf(stdout, NULL, _IONBF, 0); - - /* initialize main event cond var */ - pthread_cond_init(&main_event.cond, NULL); - pthread_mutex_init(&main_event.mutex, NULL); - main_event.flag = 0; - - for (count = 0; count < 20; ++count) { - pthread_t thread; - int status; - - /* pass down the milli-second timeout in the void* param */ - status = pthread_create(&thread, NULL, test_thread, (void*) (count - * 100)); - if (status != 0) { - printf("status = %d, count = %lu: %s\n", status, count, strerror( - errno)); - return 1; - } else { - - /* wait for the event posted by the child thread */ - pthread_mutex_lock(&main_event.mutex); - while (main_event.flag == 0) { - pthread_cond_wait(&main_event.cond, &main_event.mutex); - } - main_event.flag = 0; - pthread_mutex_unlock(&main_event.mutex); - - printf("count = %lu\n", count); - } - - usleep(10); - } - - return 0; + unsigned long count; + + setvbuf(stdout, NULL, _IONBF, 0); + + /* initialize main event cond var */ + pthread_cond_init(&main_event.cond, NULL); + pthread_mutex_init(&main_event.mutex, NULL); + main_event.flag = 0; + + for (count = 0; count < 20; ++count) { + pthread_t thread; + int status; + + /* pass down the milli-second timeout in the void* param */ + status = pthread_create(&thread, NULL, test_thread, (void*) (count + * 100)); + if (status != 0) { + printf("status = %d, count = %lu: %s\n", status, count, strerror( + errno)); + return 1; + } else { + + /* wait for the event posted by the child thread */ + pthread_mutex_lock(&main_event.mutex); + while (main_event.flag == 0) { + pthread_cond_wait(&main_event.cond, &main_event.mutex); + } + main_event.flag = 0; + pthread_mutex_unlock(&main_event.mutex); + + printf("count = %lu\n", count); + } + + usleep(10); + } + + return 0; } #include FINSH_FUNCTION_EXPORT(libc_ex7, example 7 for libc); diff --git a/examples/libc/file.c b/examples/libc/file.c index f366e04702..ea50e61628 100644 --- a/examples/libc/file.c +++ b/examples/libc/file.c @@ -14,503 +14,503 @@ const char* text = "this is a test string\n"; void libc_fstat() { - int fd; - struct stat s; - - fd = open("/tmp/tt.txt", O_WRONLY | O_CREAT, 0); - if (fd < 0) - { - printf("open failed\n"); - return; - } - - write(fd, text, strlen(text) + 1); - printf("begin: %d\n", lseek(fd, 0, SEEK_SET)); - printf("end: %d\n", lseek(fd, 0, SEEK_END)); - - printf("fstat result: %d\n", fstat(fd, &s)); - close(fd); + int fd; + struct stat s; + + fd = open("/tmp/tt.txt", O_WRONLY | O_CREAT, 0); + if (fd < 0) + { + printf("open failed\n"); + return; + } + + write(fd, text, strlen(text) + 1); + printf("begin: %d\n", lseek(fd, 0, SEEK_SET)); + printf("end: %d\n", lseek(fd, 0, SEEK_END)); + + printf("fstat result: %d\n", fstat(fd, &s)); + close(fd); } FINSH_FUNCTION_EXPORT(libc_fstat, fstat test for libc); void libc_lseek() { - int fd; - - fd = open("/tmp/tt.txt", O_WRONLY | O_CREAT, 0); - if (fd < 0) - { - printf("open failed\n"); - return; - } - - write(fd, text, strlen(text) + 1); - printf("begin: %d\n", lseek(fd, 0, SEEK_SET)); - printf("end: %d\n", lseek(fd, 0, SEEK_END)); - close(fd); + int fd; + + fd = open("/tmp/tt.txt", O_WRONLY | O_CREAT, 0); + if (fd < 0) + { + printf("open failed\n"); + return; + } + + write(fd, text, strlen(text) + 1); + printf("begin: %d\n", lseek(fd, 0, SEEK_SET)); + printf("end: %d\n", lseek(fd, 0, SEEK_END)); + close(fd); } FINSH_FUNCTION_EXPORT(libc_lseek, lseek test for libc); void sleep(int tick) { - rt_thread_sleep(tick); + rt_thread_sleep(tick); } int libc_fseek(void) { - const char *tmpdir; - char *fname; - int fd; - FILE *fp; - const char outstr[] = "hello world!\n"; - char strbuf[sizeof outstr]; - char buf[200]; - struct stat st1; - struct stat st2; - int result = 0; - - tmpdir = getenv("TMPDIR"); - if (tmpdir == NULL || tmpdir[0] == '\0') - tmpdir = "/tmp"; - - asprintf(&fname, "%s/tst-fseek.XXXXXX", tmpdir); - if (fname == NULL) - { - fprintf(stderr, "cannot generate name for temporary file: %s\n", - strerror(errno)); - return 1; - } - - /* Create a temporary file. */ - fd = mkstemp(fname); - if (fd == -1) - { - fprintf(stderr, "cannot open temporary file: %s\n", strerror(errno)); - return 1; - } - - fp = fdopen(fd, "w+"); - if (fp == NULL) - { - fprintf(stderr, "cannot get FILE for temporary file: %s\n", strerror( - errno)); - return 1; - } - setbuffer(fp, strbuf, sizeof(outstr) - 1); - - if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: write error\n", __LINE__); - result = 1; - goto out; - } - - /* The EOF flag must be reset. */ - if (fgetc(fp) != EOF) - { - printf("%d: managed to read at end of file\n", __LINE__); - result = 1; - } - else if (!feof(fp)) - { - printf("%d: EOF flag not set\n", __LINE__); - result = 1; - } - if (fseek(fp, 0, SEEK_CUR) != 0) - { - printf("%d: fseek(fp, 0, SEEK_CUR) failed\n", __LINE__); - result = 1; - } - else if (feof(fp)) - { - printf("%d: fseek() didn't reset EOF flag\n", __LINE__); - result = 1; - } - - /* Do the same for fseeko(). */ - if (fgetc(fp) != EOF) - { - printf("%d: managed to read at end of file\n", __LINE__); - result = 1; - } - else if (!feof(fp)) - { - printf("%d: EOF flag not set\n", __LINE__); - result = 1; - } - if (fseeko(fp, 0, SEEK_CUR) != 0) - { - printf("%d: fseek(fp, 0, SEEK_CUR) failed\n", __LINE__); - result = 1; - } - else if (feof(fp)) - { - printf("%d: fseek() didn't reset EOF flag\n", __LINE__); - result = 1; - } - - /* Go back to the beginning of the file: absolute. */ - if (fseek(fp, 0, SEEK_SET) != 0) - { - printf("%d: fseek(fp, 0, SEEK_SET) failed\n", __LINE__); - result = 1; - } - else if (fflush(fp) != 0) - { - printf("%d: fflush() failed\n", __LINE__); - result = 1; - } - else if (lseek(fd, 0, SEEK_CUR) != 0) - { - int pos = lseek(fd, 0, SEEK_CUR); - printf("%d: lseek() returned different position, pos %d\n", __LINE__, - pos); - result = 1; - } - else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: fread() failed\n", __LINE__); - result = 1; - } - else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) - { - printf("%d: content after fseek(,,SEEK_SET) wrong\n", __LINE__); - result = 1; - } - - /* Now with fseeko. */ - if (fseeko(fp, 0, SEEK_SET) != 0) - { - printf("%d: fseeko(fp, 0, SEEK_SET) failed\n", __LINE__); - result = 1; - } - else if (fflush(fp) != 0) - { - printf("%d: fflush() failed\n", __LINE__); - result = 1; - } - else if (lseek(fd, 0, SEEK_CUR) != 0) - { - printf("%d: lseek() returned different position\n", __LINE__); - result = 1; - } - else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: fread() failed\n", __LINE__); - result = 1; - } - else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) - { - printf("%d: content after fseeko(,,SEEK_SET) wrong\n", __LINE__); - result = 1; - } - - /* Go back to the beginning of the file: relative. */ - if (fseek(fp, -((int) sizeof(outstr) - 1), SEEK_CUR) != 0) - { - printf("%d: fseek(fp, 0, SEEK_SET) failed\n", __LINE__); - result = 1; - } - else if (fflush(fp) != 0) - { - printf("%d: fflush() failed\n", __LINE__); - result = 1; - } - else if (lseek(fd, 0, SEEK_CUR) != 0) - { - printf("%d: lseek() returned different position\n", __LINE__); - result = 1; - } - else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: fread() failed\n", __LINE__); - result = 1; - } - else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) - { - printf("%d: content after fseek(,,SEEK_SET) wrong\n", __LINE__); - result = 1; - } - - /* Now with fseeko. */ - if (fseeko(fp, -((int) sizeof(outstr) - 1), SEEK_CUR) != 0) - { - printf("%d: fseeko(fp, 0, SEEK_SET) failed\n", __LINE__); - result = 1; - } - else if (fflush(fp) != 0) - { - printf("%d: fflush() failed\n", __LINE__); - result = 1; - } - else if (lseek(fd, 0, SEEK_CUR) != 0) - { - printf("%d: lseek() returned different position\n", __LINE__); - result = 1; - } - else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: fread() failed\n", __LINE__); - result = 1; - } - else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) - { - printf("%d: content after fseeko(,,SEEK_SET) wrong\n", __LINE__); - result = 1; - } - - /* Go back to the beginning of the file: from the end. */ - if (fseek(fp, -((int) sizeof(outstr) - 1), SEEK_END) != 0) - { - printf("%d: fseek(fp, 0, SEEK_SET) failed\n", __LINE__); - result = 1; - } - else if (fflush(fp) != 0) - { - printf("%d: fflush() failed\n", __LINE__); - result = 1; - } - else if (lseek(fd, 0, SEEK_CUR) != 0) - { - printf("%d: lseek() returned different position\n", __LINE__); - result = 1; - } - else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: fread() failed\n", __LINE__); - result = 1; - } - else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) - { - printf("%d: content after fseek(,,SEEK_SET) wrong\n", __LINE__); - result = 1; - } - - /* Now with fseeko. */ - if (fseeko(fp, -((int) sizeof(outstr) - 1), SEEK_END) != 0) - { - printf("%d: fseeko(fp, 0, SEEK_SET) failed\n", __LINE__); - result = 1; - } - else if (fflush(fp) != 0) - { - printf("%d: fflush() failed\n", __LINE__); - result = 1; - } - else if (lseek(fd, 0, SEEK_CUR) != 0) - { - printf("%d: lseek() returned different position\n", __LINE__); - result = 1; - } - else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: fread() failed\n", __LINE__); - result = 1; - } - else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) - { - printf("%d: content after fseeko(,,SEEK_SET) wrong\n", __LINE__); - result = 1; - } - - if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: write error 2\n", __LINE__); - result = 1; - goto out; - } - - if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: write error 3\n", __LINE__); - result = 1; - goto out; - } - - if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: write error 4\n", __LINE__); - result = 1; - goto out; - } - - if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) - { - printf("%d: write error 5\n", __LINE__); - result = 1; - goto out; - } - - if (fputc('1', fp) == EOF || fputc('2', fp) == EOF) - { - printf("%d: cannot add characters at the end\n", __LINE__); - result = 1; - goto out; - } - - /* Check the access time. */ - if (fstat(fd, &st1) < 0) - { - printf("%d: fstat64() before fseeko() failed\n\n", __LINE__); - result = 1; - } - else - { - sleep(1); - - if (fseek(fp, -(2 + 2 * (sizeof(outstr) - 1)), SEEK_CUR) != 0) - { - printf("%d: fseek() after write characters failed\n", __LINE__); - result = 1; - goto out; - } - else - { - - time_t t; - /* Make sure the timestamp actually can be different. */ - sleep(1); - t = time(NULL); - - if (fstat(fd, &st2) < 0) - { - printf("%d: fstat64() after fseeko() failed\n\n", __LINE__); - result = 1; - } - if (st1.st_ctime >= t) - { - printf("%d: st_ctime not updated\n", __LINE__); - result = 1; - } - if (st1.st_mtime >= t) - { - printf("%d: st_mtime not updated\n", __LINE__); - result = 1; - } - if (st1.st_ctime >= st2.st_ctime) - { - printf("%d: st_ctime not changed\n", __LINE__); - result = 1; - } - if (st1.st_mtime >= st2.st_mtime) - { - printf("%d: st_mtime not changed\n", __LINE__); - result = 1; - } - } - } - - if (fread(buf, 1, 2 + 2 * (sizeof(outstr) - 1), fp) != 2 + 2 - * (sizeof(outstr) - 1)) - { - printf("%d: reading 2 records plus bits failed\n", __LINE__); - result = 1; - } - else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0 || memcmp( - &buf[sizeof(outstr) - 1], outstr, sizeof(outstr) - 1) != 0 || buf[2 - * (sizeof(outstr) - 1)] != '1' || buf[2 * (sizeof(outstr) - 1) + 1] - != '2') - { - printf("%d: reading records failed\n", __LINE__); - result = 1; - } - else if (ungetc('9', fp) == EOF) - { - printf("%d: ungetc() failed\n", __LINE__); - result = 1; - } - else if (fseek(fp, -(2 + 2 * (sizeof(outstr) - 1)), SEEK_END) != 0) - { - printf("%d: fseek after ungetc failed\n", __LINE__); - result = 1; - } - else if (fread(buf, 1, 2 + 2 * (sizeof(outstr) - 1), fp) != 2 + 2 - * (sizeof(outstr) - 1)) - { - printf("%d: reading 2 records plus bits failed\n", __LINE__); - result = 1; - } - else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0 || memcmp( - &buf[sizeof(outstr) - 1], outstr, sizeof(outstr) - 1) != 0 || buf[2 - * (sizeof(outstr) - 1)] != '1') - { - printf("%d: reading records for the second time failed\n", __LINE__); - result = 1; - } - else if (buf[2 * (sizeof(outstr) - 1) + 1] == '9') - { - printf("%d: unget character not ignored\n", __LINE__); - result = 1; - } - else if (buf[2 * (sizeof(outstr) - 1) + 1] != '2') - { - printf("%d: unget somehow changed character\n", __LINE__); - result = 1; - } - - fclose(fp); - - fp = fopen(fname, "r"); - if (fp == NULL) - { - printf("%d: fopen() failed\n\n", __LINE__); - result = 1; - } - else if (fstat(fileno(fp), &st1) < 0) - { - printf("%d: fstat64() before fseeko() failed\n\n", __LINE__); - result = 1; - } - else if (fseeko(fp, 0, SEEK_END) != 0) - { - printf("%d: fseeko(fp, 0, SEEK_END) failed\n", __LINE__); - result = 1; - } - else if (ftello(fp) != st1.st_size) - { - printf("%d: fstat64 st_size %zd ftello %zd\n", __LINE__, - (size_t) st1.st_size, (size_t) ftello(fp)); - result = 1; - } - else - printf("%d: SEEK_END works\n", __LINE__); - if (fp != NULL) - fclose(fp); - - fp = fopen(fname, "r"); - if (fp == NULL) - { - printf("%d: fopen() failed\n\n", __LINE__); - result = 1; - } - else if (fstat(fileno(fp), &st1) < 0) - { - printf("%d: fstat64() before fgetc() failed\n\n", __LINE__); - result = 1; - } - else if (fgetc(fp) == EOF) - { - printf("%d: fgetc() before fseeko() failed\n\n", __LINE__); - result = 1; - } - else if (fseeko(fp, 0, SEEK_END) != 0) - { - printf("%d: fseeko(fp, 0, SEEK_END) failed\n", __LINE__); - result = 1; - } - else if (ftello(fp) != st1.st_size) - { - printf("%d: fstat64 st_size %zd ftello %zd\n", __LINE__, - (size_t) st1.st_size, (size_t) ftello(fp)); - result = 1; - } - else - printf("%d: SEEK_END works\n", __LINE__); - if (fp != NULL) - fclose(fp); - - out: unlink(fname); - - return result; + const char *tmpdir; + char *fname; + int fd; + FILE *fp; + const char outstr[] = "hello world!\n"; + char strbuf[sizeof outstr]; + char buf[200]; + struct stat st1; + struct stat st2; + int result = 0; + + tmpdir = getenv("TMPDIR"); + if (tmpdir == NULL || tmpdir[0] == '\0') + tmpdir = "/tmp"; + + asprintf(&fname, "%s/tst-fseek.XXXXXX", tmpdir); + if (fname == NULL) + { + fprintf(stderr, "cannot generate name for temporary file: %s\n", + strerror(errno)); + return 1; + } + + /* Create a temporary file. */ + fd = mkstemp(fname); + if (fd == -1) + { + fprintf(stderr, "cannot open temporary file: %s\n", strerror(errno)); + return 1; + } + + fp = fdopen(fd, "w+"); + if (fp == NULL) + { + fprintf(stderr, "cannot get FILE for temporary file: %s\n", strerror( + errno)); + return 1; + } + setbuffer(fp, strbuf, sizeof(outstr) - 1); + + if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: write error\n", __LINE__); + result = 1; + goto out; + } + + /* The EOF flag must be reset. */ + if (fgetc(fp) != EOF) + { + printf("%d: managed to read at end of file\n", __LINE__); + result = 1; + } + else if (!feof(fp)) + { + printf("%d: EOF flag not set\n", __LINE__); + result = 1; + } + if (fseek(fp, 0, SEEK_CUR) != 0) + { + printf("%d: fseek(fp, 0, SEEK_CUR) failed\n", __LINE__); + result = 1; + } + else if (feof(fp)) + { + printf("%d: fseek() didn't reset EOF flag\n", __LINE__); + result = 1; + } + + /* Do the same for fseeko(). */ + if (fgetc(fp) != EOF) + { + printf("%d: managed to read at end of file\n", __LINE__); + result = 1; + } + else if (!feof(fp)) + { + printf("%d: EOF flag not set\n", __LINE__); + result = 1; + } + if (fseeko(fp, 0, SEEK_CUR) != 0) + { + printf("%d: fseek(fp, 0, SEEK_CUR) failed\n", __LINE__); + result = 1; + } + else if (feof(fp)) + { + printf("%d: fseek() didn't reset EOF flag\n", __LINE__); + result = 1; + } + + /* Go back to the beginning of the file: absolute. */ + if (fseek(fp, 0, SEEK_SET) != 0) + { + printf("%d: fseek(fp, 0, SEEK_SET) failed\n", __LINE__); + result = 1; + } + else if (fflush(fp) != 0) + { + printf("%d: fflush() failed\n", __LINE__); + result = 1; + } + else if (lseek(fd, 0, SEEK_CUR) != 0) + { + int pos = lseek(fd, 0, SEEK_CUR); + printf("%d: lseek() returned different position, pos %d\n", __LINE__, + pos); + result = 1; + } + else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: fread() failed\n", __LINE__); + result = 1; + } + else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) + { + printf("%d: content after fseek(,,SEEK_SET) wrong\n", __LINE__); + result = 1; + } + + /* Now with fseeko. */ + if (fseeko(fp, 0, SEEK_SET) != 0) + { + printf("%d: fseeko(fp, 0, SEEK_SET) failed\n", __LINE__); + result = 1; + } + else if (fflush(fp) != 0) + { + printf("%d: fflush() failed\n", __LINE__); + result = 1; + } + else if (lseek(fd, 0, SEEK_CUR) != 0) + { + printf("%d: lseek() returned different position\n", __LINE__); + result = 1; + } + else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: fread() failed\n", __LINE__); + result = 1; + } + else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) + { + printf("%d: content after fseeko(,,SEEK_SET) wrong\n", __LINE__); + result = 1; + } + + /* Go back to the beginning of the file: relative. */ + if (fseek(fp, -((int) sizeof(outstr) - 1), SEEK_CUR) != 0) + { + printf("%d: fseek(fp, 0, SEEK_SET) failed\n", __LINE__); + result = 1; + } + else if (fflush(fp) != 0) + { + printf("%d: fflush() failed\n", __LINE__); + result = 1; + } + else if (lseek(fd, 0, SEEK_CUR) != 0) + { + printf("%d: lseek() returned different position\n", __LINE__); + result = 1; + } + else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: fread() failed\n", __LINE__); + result = 1; + } + else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) + { + printf("%d: content after fseek(,,SEEK_SET) wrong\n", __LINE__); + result = 1; + } + + /* Now with fseeko. */ + if (fseeko(fp, -((int) sizeof(outstr) - 1), SEEK_CUR) != 0) + { + printf("%d: fseeko(fp, 0, SEEK_SET) failed\n", __LINE__); + result = 1; + } + else if (fflush(fp) != 0) + { + printf("%d: fflush() failed\n", __LINE__); + result = 1; + } + else if (lseek(fd, 0, SEEK_CUR) != 0) + { + printf("%d: lseek() returned different position\n", __LINE__); + result = 1; + } + else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: fread() failed\n", __LINE__); + result = 1; + } + else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) + { + printf("%d: content after fseeko(,,SEEK_SET) wrong\n", __LINE__); + result = 1; + } + + /* Go back to the beginning of the file: from the end. */ + if (fseek(fp, -((int) sizeof(outstr) - 1), SEEK_END) != 0) + { + printf("%d: fseek(fp, 0, SEEK_SET) failed\n", __LINE__); + result = 1; + } + else if (fflush(fp) != 0) + { + printf("%d: fflush() failed\n", __LINE__); + result = 1; + } + else if (lseek(fd, 0, SEEK_CUR) != 0) + { + printf("%d: lseek() returned different position\n", __LINE__); + result = 1; + } + else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: fread() failed\n", __LINE__); + result = 1; + } + else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) + { + printf("%d: content after fseek(,,SEEK_SET) wrong\n", __LINE__); + result = 1; + } + + /* Now with fseeko. */ + if (fseeko(fp, -((int) sizeof(outstr) - 1), SEEK_END) != 0) + { + printf("%d: fseeko(fp, 0, SEEK_SET) failed\n", __LINE__); + result = 1; + } + else if (fflush(fp) != 0) + { + printf("%d: fflush() failed\n", __LINE__); + result = 1; + } + else if (lseek(fd, 0, SEEK_CUR) != 0) + { + printf("%d: lseek() returned different position\n", __LINE__); + result = 1; + } + else if (fread(buf, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: fread() failed\n", __LINE__); + result = 1; + } + else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0) + { + printf("%d: content after fseeko(,,SEEK_SET) wrong\n", __LINE__); + result = 1; + } + + if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: write error 2\n", __LINE__); + result = 1; + goto out; + } + + if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: write error 3\n", __LINE__); + result = 1; + goto out; + } + + if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: write error 4\n", __LINE__); + result = 1; + goto out; + } + + if (fwrite(outstr, sizeof(outstr) - 1, 1, fp) != 1) + { + printf("%d: write error 5\n", __LINE__); + result = 1; + goto out; + } + + if (fputc('1', fp) == EOF || fputc('2', fp) == EOF) + { + printf("%d: cannot add characters at the end\n", __LINE__); + result = 1; + goto out; + } + + /* Check the access time. */ + if (fstat(fd, &st1) < 0) + { + printf("%d: fstat64() before fseeko() failed\n\n", __LINE__); + result = 1; + } + else + { + sleep(1); + + if (fseek(fp, -(2 + 2 * (sizeof(outstr) - 1)), SEEK_CUR) != 0) + { + printf("%d: fseek() after write characters failed\n", __LINE__); + result = 1; + goto out; + } + else + { + + time_t t; + /* Make sure the timestamp actually can be different. */ + sleep(1); + t = time(NULL); + + if (fstat(fd, &st2) < 0) + { + printf("%d: fstat64() after fseeko() failed\n\n", __LINE__); + result = 1; + } + if (st1.st_ctime >= t) + { + printf("%d: st_ctime not updated\n", __LINE__); + result = 1; + } + if (st1.st_mtime >= t) + { + printf("%d: st_mtime not updated\n", __LINE__); + result = 1; + } + if (st1.st_ctime >= st2.st_ctime) + { + printf("%d: st_ctime not changed\n", __LINE__); + result = 1; + } + if (st1.st_mtime >= st2.st_mtime) + { + printf("%d: st_mtime not changed\n", __LINE__); + result = 1; + } + } + } + + if (fread(buf, 1, 2 + 2 * (sizeof(outstr) - 1), fp) != 2 + 2 + * (sizeof(outstr) - 1)) + { + printf("%d: reading 2 records plus bits failed\n", __LINE__); + result = 1; + } + else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0 || memcmp( + &buf[sizeof(outstr) - 1], outstr, sizeof(outstr) - 1) != 0 || buf[2 + * (sizeof(outstr) - 1)] != '1' || buf[2 * (sizeof(outstr) - 1) + 1] + != '2') + { + printf("%d: reading records failed\n", __LINE__); + result = 1; + } + else if (ungetc('9', fp) == EOF) + { + printf("%d: ungetc() failed\n", __LINE__); + result = 1; + } + else if (fseek(fp, -(2 + 2 * (sizeof(outstr) - 1)), SEEK_END) != 0) + { + printf("%d: fseek after ungetc failed\n", __LINE__); + result = 1; + } + else if (fread(buf, 1, 2 + 2 * (sizeof(outstr) - 1), fp) != 2 + 2 + * (sizeof(outstr) - 1)) + { + printf("%d: reading 2 records plus bits failed\n", __LINE__); + result = 1; + } + else if (memcmp(buf, outstr, sizeof(outstr) - 1) != 0 || memcmp( + &buf[sizeof(outstr) - 1], outstr, sizeof(outstr) - 1) != 0 || buf[2 + * (sizeof(outstr) - 1)] != '1') + { + printf("%d: reading records for the second time failed\n", __LINE__); + result = 1; + } + else if (buf[2 * (sizeof(outstr) - 1) + 1] == '9') + { + printf("%d: unget character not ignored\n", __LINE__); + result = 1; + } + else if (buf[2 * (sizeof(outstr) - 1) + 1] != '2') + { + printf("%d: unget somehow changed character\n", __LINE__); + result = 1; + } + + fclose(fp); + + fp = fopen(fname, "r"); + if (fp == NULL) + { + printf("%d: fopen() failed\n\n", __LINE__); + result = 1; + } + else if (fstat(fileno(fp), &st1) < 0) + { + printf("%d: fstat64() before fseeko() failed\n\n", __LINE__); + result = 1; + } + else if (fseeko(fp, 0, SEEK_END) != 0) + { + printf("%d: fseeko(fp, 0, SEEK_END) failed\n", __LINE__); + result = 1; + } + else if (ftello(fp) != st1.st_size) + { + printf("%d: fstat64 st_size %zd ftello %zd\n", __LINE__, + (size_t) st1.st_size, (size_t) ftello(fp)); + result = 1; + } + else + printf("%d: SEEK_END works\n", __LINE__); + if (fp != NULL) + fclose(fp); + + fp = fopen(fname, "r"); + if (fp == NULL) + { + printf("%d: fopen() failed\n\n", __LINE__); + result = 1; + } + else if (fstat(fileno(fp), &st1) < 0) + { + printf("%d: fstat64() before fgetc() failed\n\n", __LINE__); + result = 1; + } + else if (fgetc(fp) == EOF) + { + printf("%d: fgetc() before fseeko() failed\n\n", __LINE__); + result = 1; + } + else if (fseeko(fp, 0, SEEK_END) != 0) + { + printf("%d: fseeko(fp, 0, SEEK_END) failed\n", __LINE__); + result = 1; + } + else if (ftello(fp) != st1.st_size) + { + printf("%d: fstat64 st_size %zd ftello %zd\n", __LINE__, + (size_t) st1.st_size, (size_t) ftello(fp)); + result = 1; + } + else + printf("%d: SEEK_END works\n", __LINE__); + if (fp != NULL) + fclose(fp); + + out: unlink(fname); + + return result; } FINSH_FUNCTION_EXPORT(libc_fseek, lseek test for libc); diff --git a/examples/libc/memory.c b/examples/libc/memory.c index ee524fa43d..d4f8e8dbde 100644 --- a/examples/libc/memory.c +++ b/examples/libc/memory.c @@ -12,45 +12,45 @@ static int errors = 0; static void merror(const char *msg) { - ++errors; - printf("Error: %s\n", msg); + ++errors; + printf("Error: %s\n", msg); } int libc_mem(void) { - void *p; - int save; + void *p; + int save; - errno = 0; + errno = 0; - p = malloc(-1); - save = errno; + p = malloc(-1); + save = errno; - if (p != NULL) - merror("malloc (-1) succeeded."); + if (p != NULL) + merror("malloc (-1) succeeded."); - if (p == NULL && save != ENOMEM) - merror("errno is not set correctly"); + if (p == NULL && save != ENOMEM) + merror("errno is not set correctly"); - p = malloc(10); - if (p == NULL) - merror("malloc (10) failed."); + p = malloc(10); + if (p == NULL) + merror("malloc (10) failed."); - /* realloc (p, 0) == free (p). */ - p = realloc(p, 0); - if (p != NULL) - merror("realloc (p, 0) failed."); + /* realloc (p, 0) == free (p). */ + p = realloc(p, 0); + if (p != NULL) + merror("realloc (p, 0) failed."); - p = malloc(0); - if (p == NULL) - { - printf("malloc(0) returns NULL\n"); - } + p = malloc(0); + if (p == NULL) + { + printf("malloc(0) returns NULL\n"); + } - p = realloc(p, 0); - if (p != NULL) - merror("realloc (p, 0) failed."); + p = realloc(p, 0); + if (p != NULL) + merror("realloc (p, 0) failed."); - return errors != 0; + return errors != 0; } FINSH_FUNCTION_EXPORT(libc_mem, memory test for libc); diff --git a/examples/libc/mq.c b/examples/libc/mq.c index 3163e27975..81ec6e35e8 100644 --- a/examples/libc/mq.c +++ b/examples/libc/mq.c @@ -7,113 +7,113 @@ #define MQ_NAME_1 "testmsg1" #define MQ_NAME_2 "testmsg2" -#define MSG_SIZE 128 -#define MAX_MSG 3 +#define MSG_SIZE 128 +#define MAX_MSG 3 const char *s_msg_ptr[] = {"msg test 1", "msg test 2", "msg test 3"}; char r_msg_ptr_1[MAX_MSG][MSG_SIZE]; char r_msg_ptr_2[MAX_MSG][MSG_SIZE]; pthread_t send1, send2, rev1, rev2; -int * send_1(void * mq) +int * send_1(void * mq) { - int i; - mqd_t mq1 = *(mqd_t *)mq; + int i; + mqd_t mq1 = *(mqd_t *)mq; - printf("Enter into send_1 \n"); - for (i = 0; i < MAX_MSG; i++ ) { - if ( -1 == mq_send(mq1, s_msg_ptr[i], MSG_SIZE, i)) { - perror("mq_send doesn't return success \n"); - pthread_exit((void *)1); - } - printf("[%d] send '%s' in thread send_1. \n", i+1, s_msg_ptr[i]); - } - pthread_exit((void *)0); + printf("Enter into send_1 \n"); + for (i = 0; i < MAX_MSG; i++ ) { + if ( -1 == mq_send(mq1, s_msg_ptr[i], MSG_SIZE, i)) { + perror("mq_send doesn't return success \n"); + pthread_exit((void *)1); + } + printf("[%d] send '%s' in thread send_1. \n", i+1, s_msg_ptr[i]); + } + pthread_exit((void *)0); } -int * send_2(void * mq) +int * send_2(void * mq) { - int i; - mqd_t mq2 = *(mqd_t *)mq; + int i; + mqd_t mq2 = *(mqd_t *)mq; - printf("Enter into send_2 \n"); - for (i = 0; i < MAX_MSG; i++ ) { - if ( -1 == mq_send(mq2, s_msg_ptr[i], MSG_SIZE, i)) { - perror("mq_send doesn't return success \n"); - pthread_exit((void *)1); - } - printf("[%d] send '%s' in thread send_2. \n", i+1, s_msg_ptr[i]); - } - pthread_exit((void *)0); + printf("Enter into send_2 \n"); + for (i = 0; i < MAX_MSG; i++ ) { + if ( -1 == mq_send(mq2, s_msg_ptr[i], MSG_SIZE, i)) { + perror("mq_send doesn't return success \n"); + pthread_exit((void *)1); + } + printf("[%d] send '%s' in thread send_2. \n", i+1, s_msg_ptr[i]); + } + pthread_exit((void *)0); } -int * receive_1(void * mq) +int * receive_1(void * mq) { - int i; - mqd_t mq1 = *(mqd_t *)mq; + int i; + mqd_t mq1 = *(mqd_t *)mq; - printf("Enter into receive_1 \n"); - for (i = 0; i< MAX_MSG; i++) { - if ( -1 == mq_receive(mq1, r_msg_ptr_1[i], MSG_SIZE, NULL) ) { - perror("mq_receive doesn't return success \n"); - pthread_exit((void *)1); - } - printf("[%d] receive '%s' in thread receive_1. \n", i+1, r_msg_ptr_1[i]); - } - pthread_exit((void *)0); + printf("Enter into receive_1 \n"); + for (i = 0; i< MAX_MSG; i++) { + if ( -1 == mq_receive(mq1, r_msg_ptr_1[i], MSG_SIZE, NULL) ) { + perror("mq_receive doesn't return success \n"); + pthread_exit((void *)1); + } + printf("[%d] receive '%s' in thread receive_1. \n", i+1, r_msg_ptr_1[i]); + } + pthread_exit((void *)0); } -int * receive_2(void * mq) +int * receive_2(void * mq) { - int i; - mqd_t mq2 = *(mqd_t *)mq; + int i; + mqd_t mq2 = *(mqd_t *)mq; - printf("Enter into receive_2 \n"); - for (i = 0; i< MAX_MSG; i++) { - if ( -1 == mq_receive(mq2, r_msg_ptr_2[i], MSG_SIZE, NULL) ) { - perror("mq_receive doesn't return success \n"); - pthread_exit((void *)1); - } - printf("[%d] receive '%s' in thread receive_2. \n", i+1, r_msg_ptr_2[i]); - } - pthread_exit((void *)0); + printf("Enter into receive_2 \n"); + for (i = 0; i< MAX_MSG; i++) { + if ( -1 == mq_receive(mq2, r_msg_ptr_2[i], MSG_SIZE, NULL) ) { + perror("mq_receive doesn't return success \n"); + pthread_exit((void *)1); + } + printf("[%d] receive '%s' in thread receive_2. \n", i+1, r_msg_ptr_2[i]); + } + pthread_exit((void *)0); } int libc_mq() { - mqd_t mq1 = 0, mq2 = 0; - struct mq_attr mqstat; - int oflag = O_CREAT|O_RDWR; + mqd_t mq1 = 0, mq2 = 0; + struct mq_attr mqstat; + int oflag = O_CREAT|O_RDWR; - memset(&mqstat, 0, sizeof(mqstat)); - mqstat.mq_maxmsg = MAX_MSG; - mqstat.mq_msgsize = MSG_SIZE; - mqstat.mq_flags = 0; - - if( ((mqd_t) -1) == (mq1 = mq_open(MQ_NAME_1,oflag,0777, &mqstat)) ) { - printf("mq_open doesn't return success \n"); - return -1; - } - if( ((mqd_t) -1) == (mq2 = mq_open(MQ_NAME_2,oflag,0777, &mqstat)) ) { - printf("mq_open doesn't return success \n"); - return -1; - } - pthread_create(&send1, NULL, (void *)send_1, (void *)&mq1); - pthread_create(&send2, NULL, (void *)send_2, (void *)&mq2); - pthread_create(&rev1, NULL, (void *)receive_1, (void *)&mq1); - pthread_create(&rev2, NULL, (void *)receive_2, (void *)&mq2); - pthread_join(send1, NULL); - pthread_join(send2, NULL); - pthread_join(rev1, NULL); - pthread_join(rev2, NULL); - - mq_close(mq1); - mq_close(mq2); - mq_unlink(MQ_NAME_1); - mq_unlink(MQ_NAME_2); + memset(&mqstat, 0, sizeof(mqstat)); + mqstat.mq_maxmsg = MAX_MSG; + mqstat.mq_msgsize = MSG_SIZE; + mqstat.mq_flags = 0; - printf("PASSED\n"); - return 0; + if( ((mqd_t) -1) == (mq1 = mq_open(MQ_NAME_1,oflag,0777, &mqstat)) ) { + printf("mq_open doesn't return success \n"); + return -1; + } + if( ((mqd_t) -1) == (mq2 = mq_open(MQ_NAME_2,oflag,0777, &mqstat)) ) { + printf("mq_open doesn't return success \n"); + return -1; + } + pthread_create(&send1, NULL, (void *)send_1, (void *)&mq1); + pthread_create(&send2, NULL, (void *)send_2, (void *)&mq2); + pthread_create(&rev1, NULL, (void *)receive_1, (void *)&mq1); + pthread_create(&rev2, NULL, (void *)receive_2, (void *)&mq2); + pthread_join(send1, NULL); + pthread_join(send2, NULL); + pthread_join(rev1, NULL); + pthread_join(rev2, NULL); + + mq_close(mq1); + mq_close(mq2); + mq_unlink(MQ_NAME_1); + mq_unlink(MQ_NAME_2); + + printf("PASSED\n"); + return 0; } #include FINSH_FUNCTION_EXPORT(libc_mq, posix mqueue test); diff --git a/examples/libc/printf.c b/examples/libc/printf.c index 2d2d8a7763..85e33671d6 100644 --- a/examples/libc/printf.c +++ b/examples/libc/printf.c @@ -142,59 +142,59 @@ int printf_test() int i; printf ("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n", - snprintf (buf, sizeof (buf), "%30s", "foo"), (int) sizeof (buf), - buf); + snprintf (buf, sizeof (buf), "%30s", "foo"), (int) sizeof (buf), + buf); memset(buf2,0,sizeof(buf)); i=snprintf(buf2, 256, "%.9999u", 10); printf("%i %i\n",i,strlen(buf2)); printf ("snprintf (\"%%.999999u\", 10) == %d\n", - snprintf(buf2, sizeof(buf2), "%.999999u", 10)); + snprintf(buf2, sizeof(buf2), "%.999999u", 10)); } return 0; } void libc_printf() { - printf("stdout test!!\n"); - fprintf(stdout, "fprintf test!!\n"); - fprintf(stderr, "fprintf test!!\n"); - puts("puts test!!\n"); + printf("stdout test!!\n"); + fprintf(stdout, "fprintf test!!\n"); + fprintf(stderr, "fprintf test!!\n"); + puts("puts test!!\n"); - putc('1', stderr); - putc('2', stderr); - putc('\n', stderr); + putc('1', stderr); + putc('2', stderr); + putc('\n', stderr); - printf_test(); + printf_test(); } FINSH_FUNCTION_EXPORT(libc_printf, printf test in libc); void libc_dprintf() { - int fd; - - fd = open("/dev/console", O_WRONLY, 0); - if (fd >0) - { - dprintf(fd, "fd:%d printf test!!\n", fd); - close(fd); - } + int fd; + + fd = open("/dev/console", O_WRONLY, 0); + if (fd >0) + { + dprintf(fd, "fd:%d printf test!!\n", fd); + close(fd); + } } FINSH_FUNCTION_EXPORT(libc_dprintf, dprintf test); void libc_fdopen() { - int fd; - FILE* fp; - - fd = open("/dev/console", O_WRONLY, 0); - if (fd >0) - { - fp = fdopen(fd, "w"); - fprintf(fp, "fdopen test, fd %d!!\n", fileno(fp)); - fclose(fp); - } + int fd; + FILE* fp; + + fd = open("/dev/console", O_WRONLY, 0); + if (fd >0) + { + fp = fdopen(fd, "w"); + fprintf(fp, "fdopen test, fd %d!!\n", fileno(fp)); + fclose(fp); + } } FINSH_FUNCTION_EXPORT(libc_fdopen, fdopen test); diff --git a/examples/libc/rand.c b/examples/libc/rand.c index 8f52ad28bb..240519703b 100644 --- a/examples/libc/rand.c +++ b/examples/libc/rand.c @@ -10,34 +10,34 @@ int libc_rand(void) { - int i1, i2; - int j1, j2; + int i1, i2; + int j1, j2; - /* The C standard says that "If rand is called before any calls to - srand have been made, the same sequence shall be generated as - when srand is first called with a seed value of 1." */ - i1 = rand(); - i2 = rand(); - srand(1); - j1 = rand(); - j2 = rand(); - if (i1 < 0 || i2 < 0 || j1 < 0 || j2 < 0) - { - puts("Test FAILED!"); - } - if (j1 == i1 && j2 == i2) - { - puts("Test succeeded."); - return 0; - } - else - { - if (j1 != i1) - printf("%d != %d\n", j1, i1); - if (j2 != i2) - printf("%d != %d\n", j2, i2); - puts("Test FAILED!"); - return 1; - } + /* The C standard says that "If rand is called before any calls to + srand have been made, the same sequence shall be generated as + when srand is first called with a seed value of 1." */ + i1 = rand(); + i2 = rand(); + srand(1); + j1 = rand(); + j2 = rand(); + if (i1 < 0 || i2 < 0 || j1 < 0 || j2 < 0) + { + puts("Test FAILED!"); + } + if (j1 == i1 && j2 == i2) + { + puts("Test succeeded."); + return 0; + } + else + { + if (j1 != i1) + printf("%d != %d\n", j1, i1); + if (j2 != i2) + printf("%d != %d\n", j2, i2); + puts("Test FAILED!"); + return 1; + } } FINSH_FUNCTION_EXPORT(libc_rand, rand test for libc); diff --git a/examples/libc/sem.c b/examples/libc/sem.c index d081d246e9..438a76b7f1 100644 --- a/examples/libc/sem.c +++ b/examples/libc/sem.c @@ -5,61 +5,61 @@ static sem_t sema; static void* other_thread() { - printf("other_thread here!\n"); + printf("other_thread here!\n"); - sleep(1); + sleep(1); - while (1) - { - printf("other_thread: sem_post...\n"); - if(sem_post(&sema) == -1) - printf("sem_post failed\n"); - sleep(1); - } - - printf("other_thread dies!\n"); - pthread_exit(0); + while (1) + { + printf("other_thread: sem_post...\n"); + if(sem_post(&sema) == -1) + printf("sem_post failed\n"); + sleep(1); + } + + printf("other_thread dies!\n"); + pthread_exit(0); } static void test_thread(void* parameter) { - pthread_t tid; + pthread_t tid; + + printf("main thread here!\n"); + printf("sleep 5 seconds..."); + sleep(5); + printf("done\n"); - printf("main thread here!\n"); - printf("sleep 5 seconds..."); - sleep(5); - printf("done\n"); + sem_init(&sema, 0, 0); - sem_init(&sema, 0, 0); - - /* create the "other" thread */ - if(pthread_create(&tid, 0, &other_thread, 0)!=0) - /* error */ - printf("pthread_create OtherThread failed.\n"); - else - printf("created OtherThread=%x\n", tid); + /* create the "other" thread */ + if(pthread_create(&tid, 0, &other_thread, 0)!=0) + /* error */ + printf("pthread_create OtherThread failed.\n"); + else + printf("created OtherThread=%x\n", tid); - /* let the other thread run */ - while (1) - { - printf("Main: sem_wait...\n"); - if(sem_wait(&sema) == -1) - printf("sem_wait failed\n"); - printf("Main back.\n\n"); - } + /* let the other thread run */ + while (1) + { + printf("Main: sem_wait...\n"); + if(sem_wait(&sema) == -1) + printf("sem_wait failed\n"); + printf("Main back.\n\n"); + } - pthread_exit(0); + pthread_exit(0); } #include void libc_sem() { - rt_thread_t tid; + rt_thread_t tid; - tid = rt_thread_create("semtest", test_thread, RT_NULL, - 2048, 20, 5); - if (tid != RT_NULL) - { - rt_thread_startup(tid); - } + tid = rt_thread_create("semtest", test_thread, RT_NULL, + 2048, 20, 5); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } } FINSH_FUNCTION_EXPORT(libc_sem, posix semaphore test); diff --git a/examples/libc/time.c b/examples/libc/time.c index fa6dee74c8..d9a6cb5b8e 100644 --- a/examples/libc/time.c +++ b/examples/libc/time.c @@ -11,14 +11,14 @@ int speed() { - int i; - time_t t; + int i; + time_t t; - printf("%d\n", time(0)); - for (i = 0; i < 10000000; ++i) - t = time(0); + printf("%d\n", time(0)); + for (i = 0; i < 10000000; ++i) + t = time(0); - printf("%d\n", time(0)); - return 0; + printf("%d\n", time(0)); + return 0; } FINSH_FUNCTION_EXPORT(speed, speed test); diff --git a/examples/network/tcpsendpacket.c b/examples/network/tcpsendpacket.c index 47bb562506..438423206f 100644 --- a/examples/network/tcpsendpacket.c +++ b/examples/network/tcpsendpacket.c @@ -26,9 +26,9 @@ void tcp_senddata(const char *url, int port, int length) { /* 申请内存失败 */ rt_kprintf("No memory\n"); - return; + return; } - + /* 构造发送数据 */ for (index = 0; index < length; index ++) buffer_ptr[index] = index & 0xff; diff --git a/examples/pm/timer_app.c b/examples/pm/timer_app.c index b7ff675b39..5797693149 100644 --- a/examples/pm/timer_app.c +++ b/examples/pm/timer_app.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2018, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/examples/pm/wakeup_app.c b/examples/pm/wakeup_app.c index 0d4c42a997..d287bf74ec 100644 --- a/examples/pm/wakeup_app.c +++ b/examples/pm/wakeup_app.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2018, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/examples/test/dhry.h b/examples/test/dhry.h index 8f47233802..dc42492417 100644 --- a/examples/test/dhry.h +++ b/examples/test/dhry.h @@ -3,9 +3,9 @@ * * "DHRYSTONE" Benchmark Program * ----------------------------- - * + * * Version: C, Version 2.1 - * + * * File: dhry.h (part 1 of 3) * * Date: May 25, 1988 @@ -33,12 +33,12 @@ * * Collection of Results: * Reinhold Weicker (address see above) and - * + * * Rick Richardson * PC Research. Inc. * 94 Apple Orchard Drive * Tinton Falls, NJ 07724 - * Phone: (201) 389-8963 (9-17 EST) + * Phone: (201) 389-8963 (9-17 EST) * Usenet: ...!uunet!pcrat!rick * * Please send results to Rick Richardson and/or Reinhold Weicker. @@ -91,7 +91,7 @@ * version previously distributed by Reinhold Weicker. * * At several places in the benchmark, code has been added, - * but within the measurement loop only in branches that + * but within the measurement loop only in branches that * are not executed. The intention is that optimizing compilers * should be prevented from moving code out of the measurement * loop, or from removing code altogether. Since the statements @@ -101,7 +101,7 @@ * still hold. Except for sophisticated optimizing compilers, * execution times for this version should be the same as * for previous versions. - * + * * Since it has proven difficult to subtract the time for the * measurement loop overhead in a correct way, the loop check * has been made a part of the benchmark. This does have @@ -151,7 +151,7 @@ * -DTIME * The "times" function of UNIX (returning process times) * or the "time" function (returning wallclock time) - * is used for measurement. + * is used for measurement. * For single user machines, "time ()" is adequate. For * multi-user machines where you cannot get single-user * access, use the "times ()" function. If you have @@ -198,23 +198,23 @@ * different from the Ada version.] * * The following program contains statements of a high level programming - * language (here: C) in a distribution considered representative: + * language (here: C) in a distribution considered representative: * * assignments 52 (51.0 %) * control statements 33 (32.4 %) * procedure, function calls 17 (16.7 %) * * 103 statements are dynamically executed. The program is balanced with - * respect to the three aspects: + * respect to the three aspects: * * - statement type * - operand type * - operand locality - * operand global, local, parameter, or constant. + * operand global, local, parameter, or constant. * - * The combination of these three aspects is balanced only approximately. + * The combination of these three aspects is balanced only approximately. * - * 1. Statement Type: + * 1. Statement Type: * ----------------- number * * V1 = V2 9 @@ -258,9 +258,9 @@ * library procedure 1 * X = F (...) * function call 6 - * user function 5 - * library function 1 - * -- + * user function 5 + * library function 1 + * -- * 17 17 * --- * 103 @@ -274,10 +274,10 @@ * number approximate * percentage * - * Arithmetic 32 50.8 + * Arithmetic 32 50.8 * - * + 21 33.3 - * - 7 11.1 + * + 21 33.3 + * - 7 11.1 * * 3 4.8 * / (int div) 1 1.6 * @@ -295,7 +295,7 @@ * && (AND-THEN) 1 1.6 * | (OR) 1 1.6 * ! (NOT) 2 3.2 - * + * * -- ----- * 63 100.1 * @@ -315,10 +315,10 @@ * 242 100.0 % * * When there is an access path leading to the final operand (e.g. a record - * component), only the final data type on the access path is counted. + * component), only the final data type on the access path is counted. * * - * 4. Operand Locality: + * 4. Operand Locality: * ------------------- * number approximate * percentage @@ -375,7 +375,7 @@ /* for strcpy, strcmp */ #include -#define Null 0 +#define Null 0 /* Value of a Null pointer */ #define true 1 #define false 0 @@ -388,7 +388,7 @@ typedef char Str_30 [31]; typedef int Arr_1_Dim [50]; typedef int Arr_2_Dim [50] [50]; -typedef struct record +typedef struct record { struct record *Ptr_Comp; Enumeration Discr; diff --git a/examples/test/dhry_1.c b/examples/test/dhry_1.c index b45b9ddafa..44283649f6 100644 --- a/examples/test/dhry_1.c +++ b/examples/test/dhry_1.c @@ -3,9 +3,9 @@ * * "DHRYSTONE" Benchmark Program * ----------------------------- - * + * * Version: C, Version 2.1 - * + * * File: dhry_1.c (part 2 of 3) * * Date: May 25, 1988 @@ -14,8 +14,8 @@ * **************************************************************************** */ - -#define NUMBER_OF_RUNS 1000000 + +#define NUMBER_OF_RUNS 1000000 #include "dhry.h" #define printf rt_kprintf @@ -34,7 +34,7 @@ int Arr_2_Glob [50] [50]; Enumeration Func_1 (); /* forward declaration necessary since Enumeration may not simply be int */ - + #ifndef REG Boolean Reg = false; #define REG @@ -71,7 +71,7 @@ void dhry_test(void) REG int Number_Of_Runs; /* Initializations */ - + Next_Ptr_Glob = (Rec_Pointer) rt_malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) rt_malloc (sizeof (Rec_Type)); @@ -79,7 +79,7 @@ void dhry_test(void) Ptr_Glob->Discr = Ident_1; Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; Ptr_Glob->variant.var_1.Int_Comp = 40; - rt_strncpy (Ptr_Glob->variant.var_1.Str_Comp, + rt_strncpy (Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING", sizeof(Ptr_Glob->variant.var_1.Str_Comp)); rt_strncpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING", sizeof(Str_1_Loc)); @@ -114,9 +114,9 @@ void dhry_test(void) /***************/ /* Start timer */ /***************/ - + // Add your timer initializing code here - + Begin_Time = rt_tick_get(); /* get start tick */ for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) @@ -169,8 +169,8 @@ void dhry_test(void) /* Stop timer */ /**************/ - End_Time = rt_tick_get(); // Get end tick - + End_Time = rt_tick_get(); // Get end tick + printf ("Execution ends\n"); printf ("\n"); printf ("Final values of the variables used in the benchmark:\n"); @@ -226,7 +226,7 @@ void dhry_test(void) User_Time = (End_Time - Begin_Time) / RT_TICK_PER_SECOND; - Microseconds = (float) User_Time * Mic_secs_Per_Second + Microseconds = (float) User_Time * Mic_secs_Per_Second / (float) Number_Of_Runs; Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time; @@ -237,7 +237,7 @@ void dhry_test(void) printf ("Dhrystones MIPS: "); printf ("%6d \n", (int)(Dhrystones_Per_Second / 1757.0)); printf ("\n"); - + } Proc_1 (Ptr_Val_Par) @@ -246,27 +246,27 @@ Proc_1 (Ptr_Val_Par) REG Rec_Pointer Ptr_Val_Par; /* executed once */ { - REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; + REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; /* == Ptr_Glob_Next */ /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ /* corresponds to "rename" in Ada, "with" in Pascal */ - - structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); + + structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); Ptr_Val_Par->variant.var_1.Int_Comp = 5; - Next_Record->variant.var_1.Int_Comp + Next_Record->variant.var_1.Int_Comp = Ptr_Val_Par->variant.var_1.Int_Comp; Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; Proc_3 (&Next_Record->Ptr_Comp); - /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp + /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp == Ptr_Glob->Ptr_Comp */ if (Next_Record->Discr == Ident_1) /* then, executed */ { Next_Record->variant.var_1.Int_Comp = 6; - Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, + Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, &Next_Record->variant.var_1.Enum_Comp); Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; - Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, + Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, &Next_Record->variant.var_1.Int_Comp); } else /* not executed */ @@ -281,7 +281,7 @@ Proc_2 (Int_Par_Ref) One_Fifty *Int_Par_Ref; { - One_Fifty Int_Loc; + One_Fifty Int_Loc; Enumeration Enum_Loc; Int_Loc = *Int_Par_Ref + 10; diff --git a/examples/test/dhry_2.c b/examples/test/dhry_2.c index 63a3d3ea03..ac5be3baf4 100644 --- a/examples/test/dhry_2.c +++ b/examples/test/dhry_2.c @@ -3,9 +3,9 @@ * * "DHRYSTONE" Benchmark Program * ----------------------------- - * + * * Version: C, Version 2.1 - * + * * File: dhry_2.c (part 3 of 3) * * Date: May 25, 1988 @@ -41,10 +41,10 @@ Enumeration *Enum_Ref_Par; *Enum_Ref_Par = Ident_4; switch (Enum_Val_Par) { - case Ident_1: + case Ident_1: *Enum_Ref_Par = Ident_1; break; - case Ident_2: + case Ident_2: if (Int_Glob > 100) /* then */ *Enum_Ref_Par = Ident_1; @@ -54,7 +54,7 @@ Enumeration *Enum_Ref_Par; *Enum_Ref_Par = Ident_2; break; case Ident_4: break; - case Ident_5: + case Ident_5: *Enum_Ref_Par = Ident_3; break; } /* switch */ @@ -63,7 +63,7 @@ Enumeration *Enum_Ref_Par; Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref) /**********************************************/ - /* executed three times */ + /* executed three times */ /* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */ /* Int_Par_Ref becomes 7 */ /* second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, */ diff --git a/examples/test/hwtimer_test.c b/examples/test/hwtimer_test.c index 428373dde0..b488c305b2 100644 --- a/examples/test/hwtimer_test.c +++ b/examples/test/hwtimer_test.c @@ -35,8 +35,8 @@ int hwtimer(void) return -1; } - /* ʱ¼ä²âÁ¿ */ - /* ¼ÆÊýʱÖÓÉèÖÃ(ĬÈÏ1Mhz»ò֧³ֵÄ×îС¼ÆÊýƵÂÊ) */ + /* 时间测量 */ + /* 计数时钟设置(默认1Mhz或支持的最小计数频率) */ err = rt_device_control(dev, HWTIMER_CTRL_FREQ_SET, &freq); if (err != RT_EOK) { @@ -44,13 +44,13 @@ int hwtimer(void) goto EXIT; } - /* ÖÜÆÚģʽ */ + /* 周期模式 */ mode = HWTIMER_MODE_PERIOD; err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode); tick = rt_tick_get(); rt_kprintf("Start Timer> Tick: %d\n", tick); - /* ÉèÖö¨ʱÆ÷³¬ʱֵ²¢Æô¶¯¶¨ʱÆ÷ */ + /* 设置定时器超时值并启动定时器 */ val.sec = t; val.usec = 0; rt_kprintf("SetTime: Sec %d, Usec %d\n", val.sec, val.usec); @@ -62,22 +62,22 @@ int hwtimer(void) rt_kprintf("Sleep %d sec\n", t); rt_thread_delay(t*RT_TICK_PER_SECOND); - /* ֹͣ¶¨ʱÆ÷ */ + /* 停止定时器 */ err = rt_device_control(dev, HWTIMER_CTRL_STOP, RT_NULL); rt_kprintf("Timer Stoped\n"); - /* ¶Áȡ¼ÆÊý */ + /* 读取计数 */ rt_device_read(dev, 0, &val, sizeof(val)); rt_kprintf("Read: Sec = %d, Usec = %d\n", val.sec, val.usec); - /* ¶¨ʱִÐлص÷º¯Êý -- µ¥´Îģʽ */ - /* ÉèÖó¬ʱ»ص÷º¯Êý */ + /* 定时执行回调函数 -- 单次模式 */ + /* 设置超时回调函数 */ rt_device_set_rx_indicate(dev, timer_timeout_cb); - /* µ¥´Îģʽ */ + /* 单次模式 */ mode = HWTIMER_MODE_PERIOD; err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode); - /* ÉèÖö¨ʱÆ÷³¬ʱֵ²¢Æô¶¯¶¨ʱÆ÷ */ + /* 设置定时器超时值并启动定时器 */ val.sec = t; val.usec = 0; rt_kprintf("SetTime: Sec %d, Usec %d\n", val.sec, val.usec); @@ -87,7 +87,7 @@ int hwtimer(void) goto EXIT; } - /* µȴý»ص÷º¯ÊýִÐÐ */ + /* 等待回调函数执行 */ rt_thread_delay((t + 1)*RT_TICK_PER_SECOND); EXIT: diff --git a/examples/test/net_test.c b/examples/test/net_test.c index ec5d50197d..de143147d1 100644 --- a/examples/test/net_test.c +++ b/examples/test/net_test.c @@ -7,7 +7,7 @@ #include #include -/* +/* * UDP echo server */ #define UDP_ECHO_PORT 7 @@ -30,12 +30,12 @@ void udpecho_entry(void *parameter) while(1) { /* received data to buffer */ -#if LWIP_VERSION_MINOR==3U +#if LWIP_VERSION_MINOR==3U buf = netconn_recv(conn); #else netconn_recv(conn, &buf); #endif - if(buf == NULL) + if(buf == NULL) { break; } @@ -46,25 +46,25 @@ void udpecho_entry(void *parameter) netconn_connect(conn, addr, port); /* reset address, and send to client */ -#if LWIP_VERSION_MINOR==3U +#if LWIP_VERSION_MINOR==3U buf->addr = RT_NULL; #else buf->addr = *IP_ADDR_ANY; #endif - + netconn_send(conn, buf); - + /* release buffer */ netbuf_delete(buf); } - + netconn_delete(conn); } /* * UDP socket echo server */ -#define UDP_SOCKET_ECHO_PORT 700 -#define UDP_SOCKET_BUFFER_SIZE 4096 +#define UDP_SOCKET_ECHO_PORT 700 +#define UDP_SOCKET_BUFFER_SIZE 4096 rt_thread_t udpecho_socket_tid = RT_NULL; void udpecho_socket_entry(void *parameter) { @@ -110,7 +110,7 @@ void udpecho_socket_entry(void *parameter) /* try to receive from UDP socket */ bytes_read = recvfrom(sock, recv_data, UDP_SOCKET_BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len); - + /* send back */ sendto(sock, recv_data, bytes_read, 0, (struct sockaddr *)&client_addr, addr_len); @@ -148,7 +148,7 @@ void tcpecho_entry(void *parameter) while(1) { /* Grab new connection. */ -#if LWIP_VERSION_MINOR==3U +#if LWIP_VERSION_MINOR==3U newconn = netconn_accept(conn); if(newconn != NULL) #else @@ -172,25 +172,25 @@ void tcpecho_entry(void *parameter) err = netconn_write(newconn, data, len, NETCONN_COPY); if(err != ERR_OK) { - break; + break; } }while(netbuf_next(buf) >= 0); - + netbuf_delete(buf); } /* Close connection and discard connection identifier. */ netconn_delete(newconn); } } - + netconn_delete(conn); } /* * TCP socket echo server */ -#define TCP_SOCKET_ECHO_PORT 700 -#define TCP_SOCKET_BUFFER_SIZE 4096 +#define TCP_SOCKET_ECHO_PORT 700 +#define TCP_SOCKET_BUFFER_SIZE 4096 rt_thread_t tcpecho_socket_tid = RT_NULL; void tcpecho_socket_entry(void *parameter) { @@ -241,7 +241,7 @@ void tcpecho_socket_entry(void *parameter) if (connected > 0) { int timeout; - + /* set timeout option */ timeout = 5000; /* 5second */ setsockopt(connected, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); @@ -285,8 +285,8 @@ void net_test(void) { udpecho_tid = rt_thread_create("uecho", udpecho_entry, - RT_NULL, - 512, + RT_NULL, + 512, RT_THREAD_PRIORITY_MAX/2, 5); if (udpecho_tid != RT_NULL) { @@ -299,7 +299,7 @@ void net_test(void) udpecho_socket_tid = rt_thread_create("uecho_s", udpecho_socket_entry, RT_NULL, - 512, + 512, RT_THREAD_PRIORITY_MAX/2 + 1, 5); if (udpecho_socket_tid != RT_NULL) { @@ -310,22 +310,22 @@ void net_test(void) if (tcpecho_tid == RT_NULL) { tcpecho_tid = rt_thread_create("techo", - tcpecho_entry, + tcpecho_entry, RT_NULL, - 512, + 512, RT_THREAD_PRIORITY_MAX/2 + 2, 5); if (tcpecho_tid != RT_NULL) { rt_thread_startup(tcpecho_tid); } } - + if (tcpecho_socket_tid == RT_NULL) { tcpecho_socket_tid = rt_thread_create("techo_s", - tcpecho_socket_entry, + tcpecho_socket_entry, RT_NULL, - 512, + 512, RT_THREAD_PRIORITY_MAX/2 + 3, 5); if (tcpecho_socket_tid != RT_NULL) { diff --git a/examples/test/rtc_test.c b/examples/test/rtc_test.c index 992eb08d3d..48129ca36c 100644 --- a/examples/test/rtc_test.c +++ b/examples/test/rtc_test.c @@ -21,48 +21,48 @@ * Date Author Notes * 2018-01-15 Liu2guang the first version. */ -#include -#include +#include +#include int rtc_test(void) -{ +{ uint8_t i; time_t now; - rt_err_t ret = RT_EOK; - + rt_err_t ret = RT_EOK; + rt_kprintf("[RTC Test]RTC Test Start...\n"); rt_thread_delay(RT_TICK_PER_SECOND); - rt_kprintf("[RTC Test]Set RTC 2017-04-01 12:30:46\n\n"); + rt_kprintf("[RTC Test]Set RTC 2017-04-01 12:30:46\n\n"); rt_thread_delay(RT_TICK_PER_SECOND); - - ret = set_date(2017, 4, 1); + + ret = set_date(2017, 4, 1); if(ret != RT_EOK) { - rt_kprintf("[RTC Test]Set RTC Date failed\n"); + rt_kprintf("[RTC Test]Set RTC Date failed\n"); return RT_ERROR; } - + rt_thread_delay(RT_TICK_PER_SECOND); - - ret = set_time(12, 30, 46); + + ret = set_time(12, 30, 46); if(ret != RT_EOK) { - rt_kprintf("[RTC Test]Set RTC Time failed\n"); + rt_kprintf("[RTC Test]Set RTC Time failed\n"); return RT_ERROR; } - + rt_thread_delay(RT_TICK_PER_SECOND); - + for(i = 0; i < 10; i++) { - rt_kprintf("[RTC Test]Read RTC Date and Time: "); + rt_kprintf("[RTC Test]Read RTC Date and Time: "); now = time(RT_NULL); rt_kprintf("%s", ctime(&now)); - + rt_thread_delay(RT_TICK_PER_SECOND); } - + rt_kprintf("\n"); return RT_EOK; @@ -70,5 +70,5 @@ int rtc_test(void) #ifdef RT_USING_FINSH #include FINSH_FUNCTION_EXPORT(rtc_test, rtc drive test. e.g: rtc_test()); -MSH_CMD_EXPORT(rtc_test, rtc drive test. e.g: rtc_test()); +MSH_CMD_EXPORT(rtc_test, rtc drive test. e.g: rtc_test()); #endif diff --git a/examples/ulog/ulog_example.c b/examples/ulog/ulog_example.c index 88572f5152..f7ee068799 100644 --- a/examples/ulog/ulog_example.c +++ b/examples/ulog/ulog_example.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2018, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * -- cgit v1.3.1 From f0cc3e861aca1c0e9c6ca7d2cf647a293a4d4c4b Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Mon, 8 Mar 2021 07:18:51 +0800 Subject: [example] 对版权信息进行人工扫描并添加确实的版权信息 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/kernel/cpuusage.c | 8 ++++++++ examples/kernel/event_simple.c | 8 ++++++++ examples/kernel/heap_malloc.c | 9 +++++++++ examples/kernel/heap_realloc.c | 9 +++++++++ examples/kernel/mbox_send_wait.c | 9 +++++++++ examples/kernel/mbox_simple.c | 9 +++++++++ examples/kernel/memp_simple.c | 9 +++++++++ examples/kernel/messageq_simple.c | 9 +++++++++ examples/kernel/mutex_priority.c | 9 +++++++++ examples/kernel/mutex_simple.c | 7 ++++++- examples/kernel/semaphore_buffer_worker.c | 9 +++++++++ examples/kernel/semaphore_dynamic.c | 9 +++++++++ examples/kernel/semaphore_priority.c | 9 +++++++++ examples/kernel/semaphore_producer_consumer.c | 9 +++++++++ examples/kernel/semaphore_static.c | 9 +++++++++ examples/kernel/tc_comm.c | 9 +++++++++ examples/kernel/tc_comm.h | 9 +++++++++ examples/kernel/tc_sample.c | 9 +++++++++ examples/kernel/thread_delay.c | 9 +++++++++ examples/kernel/thread_delete.c | 9 +++++++++ examples/kernel/thread_detach.c | 9 +++++++++ examples/kernel/thread_dynamic.c | 9 +++++++++ examples/kernel/thread_dynamic_simple.c | 9 +++++++++ examples/kernel/thread_priority.c | 9 +++++++++ examples/kernel/thread_resume.c | 9 +++++++++ examples/kernel/thread_same_priority.c | 9 +++++++++ examples/kernel/thread_static.c | 9 +++++++++ examples/kernel/thread_static_simple.c | 9 +++++++++ examples/kernel/thread_suspend.c | 9 +++++++++ examples/kernel/thread_yield.c | 8 +++++++- examples/kernel/timer_control.c | 9 +++++++++ examples/kernel/timer_dynamic.c | 9 +++++++++ examples/kernel/timer_static.c | 9 +++++++++ examples/kernel/timer_stop_self.c | 9 +++++++++ examples/kernel/timer_timeout.c | 9 +++++++++ examples/libc/dirent.c | 9 ++++++--- examples/libc/env.c | 10 +++++++--- examples/libc/ex1.c | 8 ++++++++ examples/libc/ex2.c | 8 ++++++++ examples/libc/ex3.c | 8 ++++++++ examples/libc/ex4.c | 8 ++++++++ examples/libc/ex5.c | 8 ++++++++ examples/libc/ex6.c | 8 ++++++++ examples/libc/ex7.c | 8 ++++++++ examples/libc/file.c | 10 +++++++--- examples/libc/memory.c | 10 +++++++--- examples/libc/mq.c | 10 ++++++++++ examples/libc/printf.c | 10 ++++++++++ examples/libc/rand.c | 10 +++++++--- examples/libc/sem.c | 9 +++++++++ examples/libc/termios_test.c | 9 ++++++--- examples/libc/time.c | 9 ++++++--- examples/network/chargen.c | 9 +++++++++ examples/network/tcpclient.c | 9 +++++++++ examples/network/tcpsendpacket.c | 9 +++++++++ examples/network/tcpserver.c | 9 +++++++++ examples/network/udpclient.c | 9 +++++++++ examples/network/udpserver.c | 9 +++++++++ examples/test/device_test.c | 8 ++------ examples/test/fs_test.c | 8 ++------ examples/test/hwtimer_test.c | 9 +++++++++ examples/test/mem_test.c | 9 +++++++++ examples/test/net_test.c | 9 +++++++++ examples/test/rbb_test.c | 18 ++---------------- examples/test/rtc_test.c | 19 +++---------------- examples/ymodem/echo.c | 9 +++++++++ examples/ymodem/null.c | 9 +++++++++ examples/ymodem/tofile.c | 9 +++++++++ 68 files changed, 556 insertions(+), 67 deletions(-) (limited to 'examples/kernel') diff --git a/examples/kernel/cpuusage.c b/examples/kernel/cpuusage.c index 490061ddb7..5f9d480139 100644 --- a/examples/kernel/cpuusage.c +++ b/examples/kernel/cpuusage.c @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ #include #include diff --git a/examples/kernel/event_simple.c b/examples/kernel/event_simple.c index e377e721bb..d2a2948fc7 100644 --- a/examples/kernel/event_simple.c +++ b/examples/kernel/event_simple.c @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ /* * 程序清单:事件例程 * diff --git a/examples/kernel/heap_malloc.c b/examples/kernel/heap_malloc.c index 271202ad8f..e2fa4511e7 100644 --- a/examples/kernel/heap_malloc.c +++ b/examples/kernel/heap_malloc.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include #include "tc_comm.h" diff --git a/examples/kernel/heap_realloc.c b/examples/kernel/heap_realloc.c index bc7b56a999..ab603c5d8d 100644 --- a/examples/kernel/heap_realloc.c +++ b/examples/kernel/heap_realloc.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include #include "tc_comm.h" diff --git a/examples/kernel/mbox_send_wait.c b/examples/kernel/mbox_send_wait.c index 86513fcb13..67f358ecea 100644 --- a/examples/kernel/mbox_send_wait.c +++ b/examples/kernel/mbox_send_wait.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:邮箱例程_发送阻塞 * diff --git a/examples/kernel/mbox_simple.c b/examples/kernel/mbox_simple.c index 5d588decb3..3f39bc0016 100644 --- a/examples/kernel/mbox_simple.c +++ b/examples/kernel/mbox_simple.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:邮箱例程 * diff --git a/examples/kernel/memp_simple.c b/examples/kernel/memp_simple.c index ab8f3b94ed..055db41912 100644 --- a/examples/kernel/memp_simple.c +++ b/examples/kernel/memp_simple.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:内存池例程 * diff --git a/examples/kernel/messageq_simple.c b/examples/kernel/messageq_simple.c index 51b371f59c..62504bebb7 100644 --- a/examples/kernel/messageq_simple.c +++ b/examples/kernel/messageq_simple.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:消息队列例程 * diff --git a/examples/kernel/mutex_priority.c b/examples/kernel/mutex_priority.c index f647fc4039..c1db934157 100755 --- a/examples/kernel/mutex_priority.c +++ b/examples/kernel/mutex_priority.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 创建7个进程,tid20、tid21、tid22、tid23、tid24、tid25、tid26、tid27、tid28、tid29 * 各任务优先级分别为20、21、22、23、24、25、26、27、28、29, diff --git a/examples/kernel/mutex_simple.c b/examples/kernel/mutex_simple.c index afbab3a3e1..4f6c5d7d28 100644 --- a/examples/kernel/mutex_simple.c +++ b/examples/kernel/mutex_simple.c @@ -1,5 +1,10 @@ /* - * 程序清单: + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * */ #include #include "tc_comm.h" diff --git a/examples/kernel/semaphore_buffer_worker.c b/examples/kernel/semaphore_buffer_worker.c index db3285c74b..5e4723b417 100644 --- a/examples/kernel/semaphore_buffer_worker.c +++ b/examples/kernel/semaphore_buffer_worker.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:信号量实现生产者消费者间的互斥 * diff --git a/examples/kernel/semaphore_dynamic.c b/examples/kernel/semaphore_dynamic.c index dc088e6e44..564d73c496 100644 --- a/examples/kernel/semaphore_dynamic.c +++ b/examples/kernel/semaphore_dynamic.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:动态信号量 * diff --git a/examples/kernel/semaphore_priority.c b/examples/kernel/semaphore_priority.c index d6e3ce3914..7e37a826cb 100644 --- a/examples/kernel/semaphore_priority.c +++ b/examples/kernel/semaphore_priority.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include #include "tc_comm.h" diff --git a/examples/kernel/semaphore_producer_consumer.c b/examples/kernel/semaphore_producer_consumer.c index a240cfa8b2..b6f996ff57 100644 --- a/examples/kernel/semaphore_producer_consumer.c +++ b/examples/kernel/semaphore_producer_consumer.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:生产者消费者例子 * diff --git a/examples/kernel/semaphore_static.c b/examples/kernel/semaphore_static.c index cb199886a4..641b0bc7c9 100644 --- a/examples/kernel/semaphore_static.c +++ b/examples/kernel/semaphore_static.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:静态信号量 * diff --git a/examples/kernel/tc_comm.c b/examples/kernel/tc_comm.c index f6493389a6..7153412aa0 100644 --- a/examples/kernel/tc_comm.c +++ b/examples/kernel/tc_comm.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include "tc_comm.h" #ifdef RT_USING_FINSH #include diff --git a/examples/kernel/tc_comm.h b/examples/kernel/tc_comm.h index c72c91ad53..17dd8eb924 100644 --- a/examples/kernel/tc_comm.h +++ b/examples/kernel/tc_comm.h @@ -1,3 +1,12 @@ + +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ #ifndef __TC_COMM_H__ #define __TC_COMM_H__ diff --git a/examples/kernel/tc_sample.c b/examples/kernel/tc_sample.c index 212875b716..272edc0e39 100644 --- a/examples/kernel/tc_sample.c +++ b/examples/kernel/tc_sample.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include #include "tc_comm.h" diff --git a/examples/kernel/thread_delay.c b/examples/kernel/thread_delay.c index f9404d704c..50740e2c8f 100644 --- a/examples/kernel/thread_delay.c +++ b/examples/kernel/thread_delay.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include #include "tc_comm.h" diff --git a/examples/kernel/thread_delete.c b/examples/kernel/thread_delete.c index 72eb4ec008..924a823f35 100644 --- a/examples/kernel/thread_delete.c +++ b/examples/kernel/thread_delete.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:删除线程 * diff --git a/examples/kernel/thread_detach.c b/examples/kernel/thread_detach.c index 9370f212e1..d0d72d017b 100644 --- a/examples/kernel/thread_detach.c +++ b/examples/kernel/thread_detach.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:线程脱离 * diff --git a/examples/kernel/thread_dynamic.c b/examples/kernel/thread_dynamic.c index 0afb7f8f84..35c67c02fc 100644 --- a/examples/kernel/thread_dynamic.c +++ b/examples/kernel/thread_dynamic.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include #include "tc_comm.h" diff --git a/examples/kernel/thread_dynamic_simple.c b/examples/kernel/thread_dynamic_simple.c index 28944b1f34..dc378a6696 100644 --- a/examples/kernel/thread_dynamic_simple.c +++ b/examples/kernel/thread_dynamic_simple.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:动态线程 * diff --git a/examples/kernel/thread_priority.c b/examples/kernel/thread_priority.c index 0045b0e578..abf45bbe07 100644 --- a/examples/kernel/thread_priority.c +++ b/examples/kernel/thread_priority.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include #include "tc_comm.h" diff --git a/examples/kernel/thread_resume.c b/examples/kernel/thread_resume.c index cea814616f..e776466326 100644 --- a/examples/kernel/thread_resume.c +++ b/examples/kernel/thread_resume.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:唤醒线程 * diff --git a/examples/kernel/thread_same_priority.c b/examples/kernel/thread_same_priority.c index c7da2087a0..a238e24932 100644 --- a/examples/kernel/thread_same_priority.c +++ b/examples/kernel/thread_same_priority.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include #include "tc_comm.h" diff --git a/examples/kernel/thread_static.c b/examples/kernel/thread_static.c index 3033f2cda1..9234255679 100644 --- a/examples/kernel/thread_static.c +++ b/examples/kernel/thread_static.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + #include #include "tc_comm.h" diff --git a/examples/kernel/thread_static_simple.c b/examples/kernel/thread_static_simple.c index d9e3ff6f61..e0021d2c5f 100644 --- a/examples/kernel/thread_static_simple.c +++ b/examples/kernel/thread_static_simple.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:静态线程 * diff --git a/examples/kernel/thread_suspend.c b/examples/kernel/thread_suspend.c index 947cc3cbf6..2219c7b8d6 100644 --- a/examples/kernel/thread_suspend.c +++ b/examples/kernel/thread_suspend.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:挂起线程 * diff --git a/examples/kernel/thread_yield.c b/examples/kernel/thread_yield.c index 4ed6b90e2a..97e57ba841 100644 --- a/examples/kernel/thread_yield.c +++ b/examples/kernel/thread_yield.c @@ -1,6 +1,12 @@ /* - * 程序清单: + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * */ + #include #include "tc_comm.h" diff --git a/examples/kernel/timer_control.c b/examples/kernel/timer_control.c index d1f782fcce..c92d558d5c 100644 --- a/examples/kernel/timer_control.c +++ b/examples/kernel/timer_control.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:动态定时器例程 * diff --git a/examples/kernel/timer_dynamic.c b/examples/kernel/timer_dynamic.c index 1260d50c09..35d7b845dd 100644 --- a/examples/kernel/timer_dynamic.c +++ b/examples/kernel/timer_dynamic.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:动态定时器例程 * diff --git a/examples/kernel/timer_static.c b/examples/kernel/timer_static.c index 884927bbc3..1523869b9a 100644 --- a/examples/kernel/timer_static.c +++ b/examples/kernel/timer_static.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:定时器例程 * diff --git a/examples/kernel/timer_stop_self.c b/examples/kernel/timer_stop_self.c index 38ec9c441b..584bc4128e 100644 --- a/examples/kernel/timer_stop_self.c +++ b/examples/kernel/timer_stop_self.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:动态定时器例程 * diff --git a/examples/kernel/timer_timeout.c b/examples/kernel/timer_timeout.c index 4d9a4fcc1d..40bbbf2831 100644 --- a/examples/kernel/timer_timeout.c +++ b/examples/kernel/timer_timeout.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * + */ + /* * 程序清单:消息队列例程 * diff --git a/examples/libc/dirent.c b/examples/libc/dirent.c index 06b72110e3..03fa94151d 100644 --- a/examples/libc/dirent.c +++ b/examples/libc/dirent.c @@ -1,8 +1,11 @@ /* - * dirent.c + * Copyright (c) 2006-2021, RT-Thread Development Team * - * Created on: 2010-11-17 - * Author: bernard + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2010-11-17 Bernard first version */ #include #include diff --git a/examples/libc/env.c b/examples/libc/env.c index 6bc8ba4d7e..05005c2d1f 100644 --- a/examples/libc/env.c +++ b/examples/libc/env.c @@ -1,9 +1,13 @@ /* - * env.c + * Copyright (c) 2006-2021, RT-Thread Development Team * - * Created on: 2010-11-17 - * Author: bernard + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2010-11-17 Bernard first version */ + #include #include #include diff --git a/examples/libc/ex1.c b/examples/libc/ex1.c index f03fefbc00..8f0ccfff1c 100644 --- a/examples/libc/ex1.c +++ b/examples/libc/ex1.c @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ /* Creates two threads, one printing 10000 "a"s, the other printing 10000 "b"s. Illustrates: thread creation, thread joining. */ diff --git a/examples/libc/ex2.c b/examples/libc/ex2.c index 925f4e1f23..df8f9a26a3 100644 --- a/examples/libc/ex2.c +++ b/examples/libc/ex2.c @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ /* The classic producer-consumer example. Illustrates mutexes and conditions. All integers between 0 and 9999 should be printed exactly twice, diff --git a/examples/libc/ex3.c b/examples/libc/ex3.c index e4e3405d20..1697e7145b 100644 --- a/examples/libc/ex3.c +++ b/examples/libc/ex3.c @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ /* Multi-thread searching. Illustrates: thread cancellation, cleanup handlers. */ diff --git a/examples/libc/ex4.c b/examples/libc/ex4.c index eb79840372..ec1c533a98 100644 --- a/examples/libc/ex4.c +++ b/examples/libc/ex4.c @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ /* Making a library function that uses static variables thread-safe. Illustrates: thread-specific data, pthread_once(). */ diff --git a/examples/libc/ex5.c b/examples/libc/ex5.c index aa94c34063..cce5306894 100644 --- a/examples/libc/ex5.c +++ b/examples/libc/ex5.c @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ /* The classic producer-consumer example, implemented with semaphores. All integers between 0 and 9999 should be printed exactly twice, once to the right of the arrow and once to the left. */ diff --git a/examples/libc/ex6.c b/examples/libc/ex6.c index ecf813fef8..ac6319d74c 100644 --- a/examples/libc/ex6.c +++ b/examples/libc/ex6.c @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ #include #include #include diff --git a/examples/libc/ex7.c b/examples/libc/ex7.c index e6473d48c2..e885f79c57 100644 --- a/examples/libc/ex7.c +++ b/examples/libc/ex7.c @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ /* ex7 * * Test case that illustrates a timed wait on a condition variable. diff --git a/examples/libc/file.c b/examples/libc/file.c index ea50e61628..79cdce3092 100644 --- a/examples/libc/file.c +++ b/examples/libc/file.c @@ -1,9 +1,13 @@ /* - * fstat.c + * Copyright (c) 2006-2021, RT-Thread Development Team * - * Created on: 2010-11-17 - * Author: bernard + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2010-11-17 Bernard first version */ + #include #include #include diff --git a/examples/libc/memory.c b/examples/libc/memory.c index d4f8e8dbde..063d90cfdc 100644 --- a/examples/libc/memory.c +++ b/examples/libc/memory.c @@ -1,9 +1,13 @@ /* - * memory.c + * Copyright (c) 2006-2021, RT-Thread Development Team * - * Created on: 2010-11-17 - * Author: bernard + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2010-11-17 Bernard first version */ + #include #include #include diff --git a/examples/libc/mq.c b/examples/libc/mq.c index 81ec6e35e8..a7f3f924dc 100644 --- a/examples/libc/mq.c +++ b/examples/libc/mq.c @@ -1,3 +1,13 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2010-11-17 Bernard first version + */ + #include #include #include diff --git a/examples/libc/printf.c b/examples/libc/printf.c index 85e33671d6..c7968b9a0b 100644 --- a/examples/libc/printf.c +++ b/examples/libc/printf.c @@ -1,3 +1,13 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2010-11-17 Bernard first version + */ + #include #include #include diff --git a/examples/libc/rand.c b/examples/libc/rand.c index 240519703b..96f5628bb8 100644 --- a/examples/libc/rand.c +++ b/examples/libc/rand.c @@ -1,9 +1,13 @@ /* - * rand.c + * Copyright (c) 2006-2021, RT-Thread Development Team * - * Created on: 2010-11-17 - * Author: bernard + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2010-11-17 Bernard first version */ + #include #include #include diff --git a/examples/libc/sem.c b/examples/libc/sem.c index 438a76b7f1..55b85114b8 100644 --- a/examples/libc/sem.c +++ b/examples/libc/sem.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include #include diff --git a/examples/libc/termios_test.c b/examples/libc/termios_test.c index 192021b9ab..f65bff1a9f 100644 --- a/examples/libc/termios_test.c +++ b/examples/libc/termios_test.c @@ -1,8 +1,11 @@ /* - * termios_test.c + * Copyright (c) 2006-2021, RT-Thread Development Team * - * Created on: 2017-12-06 - * Author: JasonJia + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017-12-06 JasonJia first version */ #include diff --git a/examples/libc/time.c b/examples/libc/time.c index d9a6cb5b8e..5e91c1df80 100644 --- a/examples/libc/time.c +++ b/examples/libc/time.c @@ -1,8 +1,11 @@ /* - * time.c + * Copyright (c) 2006-2021, RT-Thread Development Team * - * Created on: 2010-11-17 - * Author: bernard + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2010-11-17 Bernard first version */ #include diff --git a/examples/network/chargen.c b/examples/network/chargen.c index 218449b845..3b4feaca9e 100644 --- a/examples/network/chargen.c +++ b/examples/network/chargen.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include diff --git a/examples/network/tcpclient.c b/examples/network/tcpclient.c index cc67645868..8f88985b10 100644 --- a/examples/network/tcpclient.c +++ b/examples/network/tcpclient.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include diff --git a/examples/network/tcpsendpacket.c b/examples/network/tcpsendpacket.c index 438423206f..da8bc4f524 100644 --- a/examples/network/tcpsendpacket.c +++ b/examples/network/tcpsendpacket.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include /* 为了解析主机名,需要包含netdb.h头文件 */ diff --git a/examples/network/tcpserver.c b/examples/network/tcpserver.c index 8c7382dcbb..e7438eb6f3 100644 --- a/examples/network/tcpserver.c +++ b/examples/network/tcpserver.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include diff --git a/examples/network/udpclient.c b/examples/network/udpclient.c index f8c42f3a12..1a3f0268af 100644 --- a/examples/network/udpclient.c +++ b/examples/network/udpclient.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include /* 使用BSD socket,需要包含sockets.h头文件 */ diff --git a/examples/network/udpserver.c b/examples/network/udpserver.c index a249475e04..a33a27da10 100644 --- a/examples/network/udpserver.c +++ b/examples/network/udpserver.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include diff --git a/examples/test/device_test.c b/examples/test/device_test.c index d62c2168ff..f9a7591478 100644 --- a/examples/test/device_test.c +++ b/examples/test/device_test.c @@ -1,11 +1,7 @@ /* - * File : device_test.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2011, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://openlab.rt-thread.com/license/LICENSE. + * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes diff --git a/examples/test/fs_test.c b/examples/test/fs_test.c index 2404b82e59..a86bbd6ac2 100644 --- a/examples/test/fs_test.c +++ b/examples/test/fs_test.c @@ -1,11 +1,7 @@ /* - * File : fs_test.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2011, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://openlab.rt-thread.com/license/LICENSE. + * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes diff --git a/examples/test/hwtimer_test.c b/examples/test/hwtimer_test.c index b488c305b2..15d7aa830f 100644 --- a/examples/test/hwtimer_test.c +++ b/examples/test/hwtimer_test.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include #include diff --git a/examples/test/mem_test.c b/examples/test/mem_test.c index 549be80ab4..cd7d1b3552 100644 --- a/examples/test/mem_test.c +++ b/examples/test/mem_test.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include diff --git a/examples/test/net_test.c b/examples/test/net_test.c index de143147d1..656686f091 100644 --- a/examples/test/net_test.c +++ b/examples/test/net_test.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + /* * Net Test Utilities for RT-Thread */ diff --git a/examples/test/rbb_test.c b/examples/test/rbb_test.c index f276c993da..c4236bca44 100644 --- a/examples/test/rbb_test.c +++ b/examples/test/rbb_test.c @@ -1,21 +1,7 @@ /* - * File : rbb_test.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes diff --git a/examples/test/rtc_test.c b/examples/test/rtc_test.c index 48129ca36c..4ed1349de4 100644 --- a/examples/test/rtc_test.c +++ b/examples/test/rtc_test.c @@ -1,26 +1,13 @@ /* - * File : rtc_test.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2017, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-01-15 Liu2guang the first version. */ + #include #include diff --git a/examples/ymodem/echo.c b/examples/ymodem/echo.c index 5cb807f519..fdd7e5228b 100644 --- a/examples/ymodem/echo.c +++ b/examples/ymodem/echo.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include static rt_device_t _odev; diff --git a/examples/ymodem/null.c b/examples/ymodem/null.c index c72ea064f8..640b8ba11b 100644 --- a/examples/ymodem/null.c +++ b/examples/ymodem/null.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include static enum rym_code _rym_dummy_write( diff --git a/examples/ymodem/tofile.c b/examples/ymodem/tofile.c index 4a3705ede7..35dca2f2c1 100644 --- a/examples/ymodem/tofile.c +++ b/examples/ymodem/tofile.c @@ -1,3 +1,12 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + #include #include #include -- cgit v1.3.1 From 98c72007d2f15f4e4314f7c820d2d58e625c0d5d Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Sun, 18 Jul 2021 12:52:04 +0800 Subject: [example] replace RT_IPC_FLAG_FIFO with RT_IPC_FLAG_PRIO --- examples/kernel/event_simple.c | 2 +- examples/kernel/mbox_send_wait.c | 2 +- examples/kernel/mbox_simple.c | 2 +- examples/kernel/messageq_simple.c | 2 +- examples/kernel/mutex_priority.c | 2 +- examples/kernel/mutex_simple.c | 2 +- examples/kernel/semaphore_buffer_worker.c | 2 +- examples/kernel/semaphore_dynamic.c | 2 +- examples/kernel/semaphore_producer_consumer.c | 6 +++--- examples/kernel/semaphore_static.c | 2 +- examples/kernel/tc_comm.c | 2 +- examples/kernel/timer_timeout.c | 2 +- examples/pm/wakeup_app.c | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) (limited to 'examples/kernel') diff --git a/examples/kernel/event_simple.c b/examples/kernel/event_simple.c index d2a2948fc7..8b2f966d3d 100644 --- a/examples/kernel/event_simple.c +++ b/examples/kernel/event_simple.c @@ -83,7 +83,7 @@ static void thread3_entry(void *param) int event_simple_init() { /* 初始化事件对象 */ - rt_event_init(&event, "event", RT_IPC_FLAG_FIFO); + rt_event_init(&event, "event", RT_IPC_FLAG_PRIO); /* 创建线程1 */ tid1 = rt_thread_create("t1", diff --git a/examples/kernel/mbox_send_wait.c b/examples/kernel/mbox_send_wait.c index 67f358ecea..919ceca31d 100644 --- a/examples/kernel/mbox_send_wait.c +++ b/examples/kernel/mbox_send_wait.c @@ -82,7 +82,7 @@ int mbox_send_wait_init() "mbt", /* 名称是mbt */ &mb_pool[0], /* 邮箱用到的内存池是mb_pool */ sizeof(mb_pool)/4, /* 大小是mb_pool大小除以4,因为一封邮件的大小是4字节 */ - RT_IPC_FLAG_FIFO); /* 采用FIFO方式进行线程等待 */ + RT_IPC_FLAG_PRIO); /* 采用PRIO方式进行线程等待 */ /* 创建线程1 */ tid1 = rt_thread_create("t1", diff --git a/examples/kernel/mbox_simple.c b/examples/kernel/mbox_simple.c index 3f39bc0016..373c5f2817 100644 --- a/examples/kernel/mbox_simple.c +++ b/examples/kernel/mbox_simple.c @@ -80,7 +80,7 @@ int mbox_simple_init() "mbt", /* 名称是mbt */ &mb_pool[0], /* 邮箱用到的内存池是mb_pool */ sizeof(mb_pool)/4, /* 大小是mb_pool大小除以4,因为一封邮件的大小是4字节 */ - RT_IPC_FLAG_FIFO); /* 采用FIFO方式进行线程等待 */ + RT_IPC_FLAG_PRIO); /* 采用PRIO方式进行线程等待 */ /* 创建线程1 */ tid1 = rt_thread_create("t1", diff --git a/examples/kernel/messageq_simple.c b/examples/kernel/messageq_simple.c index 62504bebb7..90bed7dd82 100644 --- a/examples/kernel/messageq_simple.c +++ b/examples/kernel/messageq_simple.c @@ -98,7 +98,7 @@ int messageq_simple_init() &msg_pool[0], /* 内存池指向msg_pool */ 128 - sizeof(void*), /* 每个消息的大小是 128 - void* */ sizeof(msg_pool), /* 内存池的大小是msg_pool的大小 */ - RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ + RT_IPC_FLAG_PRIO); /* 如果有多个线程等待,按照优先级由高到低的方法分配消息 */ /* 创建线程1 */ tid1 = rt_thread_create("t1", diff --git a/examples/kernel/mutex_priority.c b/examples/kernel/mutex_priority.c index c1db934157..a7702eed6f 100755 --- a/examples/kernel/mutex_priority.c +++ b/examples/kernel/mutex_priority.c @@ -281,7 +281,7 @@ static void thread29_entry(void* parameter) static int mutex_simple_init() { /* 创建互斥锁 */ - mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO); + mutex = rt_mutex_create("mutex", RT_IPC_FLAG_PRIO); if (mutex == RT_NULL) { tc_stat(TC_STAT_END | TC_STAT_FAILED); diff --git a/examples/kernel/mutex_simple.c b/examples/kernel/mutex_simple.c index 4f6c5d7d28..ee875cca7d 100644 --- a/examples/kernel/mutex_simple.c +++ b/examples/kernel/mutex_simple.c @@ -87,7 +87,7 @@ static void thread3_entry(void* parameter) int mutex_simple_init() { /* 创建互斥锁 */ - mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO); + mutex = rt_mutex_create("mutex", RT_IPC_FLAG_PRIO); if (mutex == RT_NULL) { tc_stat(TC_STAT_END | TC_STAT_FAILED); diff --git a/examples/kernel/semaphore_buffer_worker.c b/examples/kernel/semaphore_buffer_worker.c index 5e4723b417..bd5a488460 100644 --- a/examples/kernel/semaphore_buffer_worker.c +++ b/examples/kernel/semaphore_buffer_worker.c @@ -209,7 +209,7 @@ int semaphore_buffer_worker_init() rb_init(&working_rb, working_buffer, BUFFER_SIZE); /* 创建信号量 */ - sem = rt_sem_create("sem", 1, RT_IPC_FLAG_FIFO); + sem = rt_sem_create("sem", 1, RT_IPC_FLAG_PRIO); if (sem == RT_NULL) { tc_stat(TC_STAT_END | TC_STAT_FAILED); diff --git a/examples/kernel/semaphore_dynamic.c b/examples/kernel/semaphore_dynamic.c index 564d73c496..dacdf10c37 100644 --- a/examples/kernel/semaphore_dynamic.c +++ b/examples/kernel/semaphore_dynamic.c @@ -78,7 +78,7 @@ static void thread_entry(void* parameter) int semaphore_dynamic_init() { /* 创建一个信号量,初始值是0 */ - sem = rt_sem_create("sem", 0, RT_IPC_FLAG_FIFO); + sem = rt_sem_create("sem", 0, RT_IPC_FLAG_PRIO); if (sem == RT_NULL) { tc_stat(TC_STAT_END | TC_STAT_FAILED); diff --git a/examples/kernel/semaphore_producer_consumer.c b/examples/kernel/semaphore_producer_consumer.c index b6f996ff57..4d9eb24e44 100644 --- a/examples/kernel/semaphore_producer_consumer.c +++ b/examples/kernel/semaphore_producer_consumer.c @@ -98,9 +98,9 @@ void consumer_thread_entry(void* parameter) int semaphore_producer_consumer_init() { /* 初始化3个信号量 */ - rt_sem_init(&sem_lock , "lock", 1, RT_IPC_FLAG_FIFO); - rt_sem_init(&sem_empty, "empty", MAXSEM, RT_IPC_FLAG_FIFO); - rt_sem_init(&sem_full , "full", 0, RT_IPC_FLAG_FIFO); + rt_sem_init(&sem_lock , "lock", 1, RT_IPC_FLAG_PRIO); + rt_sem_init(&sem_empty, "empty", MAXSEM, RT_IPC_FLAG_PRIO); + rt_sem_init(&sem_full , "full", 0, RT_IPC_FLAG_PRIO); /* 创建线程1 */ producer_tid = rt_thread_create("producer", diff --git a/examples/kernel/semaphore_static.c b/examples/kernel/semaphore_static.c index 641b0bc7c9..16b043db9c 100644 --- a/examples/kernel/semaphore_static.c +++ b/examples/kernel/semaphore_static.c @@ -81,7 +81,7 @@ int semaphore_static_init(void) rt_err_t result; /* 初始化信号量,初始值是0 */ - result = rt_sem_init(&sem, "sem", 0, RT_IPC_FLAG_FIFO); + result = rt_sem_init(&sem, "sem", 0, RT_IPC_FLAG_PRIO); if (result != RT_EOK) { tc_stat(TC_STAT_END | TC_STAT_FAILED); diff --git a/examples/kernel/tc_comm.c b/examples/kernel/tc_comm.c index 7153412aa0..b98c97d9b3 100644 --- a/examples/kernel/tc_comm.c +++ b/examples/kernel/tc_comm.c @@ -35,7 +35,7 @@ void tc_thread_entry(void* parameter) struct finsh_syscall* index; /* create tc semaphore */ - rt_sem_init(&_tc_sem, "tc", 0, RT_IPC_FLAG_FIFO); + rt_sem_init(&_tc_sem, "tc", 0, RT_IPC_FLAG_PRIO); do { for (index = _syscall_table_begin; index < _syscall_table_end; FINSH_NEXT_SYSCALL(index)) diff --git a/examples/kernel/timer_timeout.c b/examples/kernel/timer_timeout.c index 40bbbf2831..f72b45be3c 100644 --- a/examples/kernel/timer_timeout.c +++ b/examples/kernel/timer_timeout.c @@ -73,7 +73,7 @@ int timer_timeout_init() &msg_pool[0], /* 内存池指向msg_pool */ 128 - sizeof(void*), /* 每个消息的大小是 128 - void* */ sizeof(msg_pool), /* 内存池的大小是msg_pool的大小 */ - RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ + RT_IPC_FLAG_PRIO); /* 如果有多个线程等待,按照优先级由高到低的方法分配消息 */ /* 创建线程 */ tid = rt_thread_create("t", diff --git a/examples/pm/wakeup_app.c b/examples/pm/wakeup_app.c index d287bf74ec..230d30ac4e 100644 --- a/examples/pm/wakeup_app.c +++ b/examples/pm/wakeup_app.c @@ -61,7 +61,7 @@ static int wakeup_app(void) { rt_thread_t tid; - wakeup_event = rt_event_create("wakup", RT_IPC_FLAG_FIFO); + wakeup_event = rt_event_create("wakup", RT_IPC_FLAG_PRIO); RT_ASSERT(wakeup_event != RT_NULL); tid = rt_thread_create("wakeup_app", wakeup_app_entry, RT_NULL, -- cgit v1.3.1 From 221da7f464d811955acce96280332d95348fb24f Mon Sep 17 00:00:00 2001 From: 马志远 <1468728718@qq.com> Date: Mon, 23 Aug 2021 17:30:05 +0800 Subject: Remove C Style Command Shell --- bsp/lm3s8962/applications/startup.c | 100 +-- bsp/lm3s9b9x/applications/startup.c | 94 +- bsp/lm4f232/applications/startup.c | 94 +- components/drivers/misc/adc.c | 4 +- components/drivers/misc/dac.c | 4 +- components/drivers/misc/rt_drv_pwm.c | 4 +- components/drivers/mtd/mtd_nand.c | 8 +- components/drivers/rtc/rtc.c | 4 +- components/drivers/sensors/sensor_cmd.c | 8 +- components/drivers/spi/spi_flash_sfud.c | 5 +- components/drivers/wlan/wlan_cmd.c | 2 +- components/finsh/Kconfig | 31 +- components/finsh/SConscript | 28 +- components/finsh/cmd.c | 544 ++++-------- components/finsh/finsh.h | 334 +++---- components/finsh/finsh_api.h | 218 ----- components/finsh/finsh_compiler.c | 918 ------------------- components/finsh/finsh_error.c | 55 -- components/finsh/finsh_error.h | 23 - components/finsh/finsh_heap.c | 279 ------ components/finsh/finsh_heap.h | 19 - components/finsh/finsh_init.c | 57 -- components/finsh/finsh_node.c | 183 ---- components/finsh/finsh_node.h | 69 -- components/finsh/finsh_ops.c | 603 ------------- components/finsh/finsh_ops.h | 116 --- components/finsh/finsh_parser.c | 986 --------------------- components/finsh/finsh_parser.h | 18 - components/finsh/finsh_token.c | 598 ------------- components/finsh/finsh_token.h | 63 -- components/finsh/finsh_var.c | 142 --- components/finsh/finsh_var.h | 41 - components/finsh/finsh_vm.c | 363 -------- components/finsh/finsh_vm.h | 35 - components/finsh/msh.c | 93 +- components/finsh/msh.h | 1 - components/finsh/msh_file.c | 20 +- components/finsh/shell.c | 189 +--- components/finsh/shell.h | 26 +- components/finsh/symbol.c | 66 -- components/libc/compilers/armlibc/syscalls.c | 2 +- components/net/at/Kconfig | 2 +- .../net/lwip-2.0.2/src/apps/tftp/tftp_port.c | 2 - .../net/lwip-2.0.3/src/apps/tftp/tftp_port.c | 2 - .../net/lwip-2.1.2/src/apps/tftp/tftp_port.c | 2 - components/utilities/ulog/ulog.c | 4 +- examples/file/listdir.c | 2 - examples/file/readspeed.c | 2 - examples/file/readwrite.c | 2 - examples/file/writespeed.c | 2 - examples/kernel/tc_comm.c | 1 - examples/libc/termios_test.c | 4 +- examples/test/hwtimer_test.c | 2 +- include/rtdef.h | 1 - include/rtthread.h | 2 +- 55 files changed, 550 insertions(+), 5927 deletions(-) delete mode 100644 components/finsh/finsh_api.h delete mode 100644 components/finsh/finsh_compiler.c delete mode 100644 components/finsh/finsh_error.c delete mode 100644 components/finsh/finsh_error.h delete mode 100644 components/finsh/finsh_heap.c delete mode 100644 components/finsh/finsh_heap.h delete mode 100644 components/finsh/finsh_init.c delete mode 100644 components/finsh/finsh_node.c delete mode 100644 components/finsh/finsh_node.h delete mode 100644 components/finsh/finsh_ops.c delete mode 100644 components/finsh/finsh_ops.h delete mode 100644 components/finsh/finsh_parser.c delete mode 100644 components/finsh/finsh_parser.h delete mode 100644 components/finsh/finsh_token.c delete mode 100644 components/finsh/finsh_token.h delete mode 100644 components/finsh/finsh_var.c delete mode 100644 components/finsh/finsh_var.h delete mode 100644 components/finsh/finsh_vm.c delete mode 100644 components/finsh/finsh_vm.h delete mode 100644 components/finsh/symbol.c (limited to 'examples/kernel') diff --git a/bsp/lm3s8962/applications/startup.c b/bsp/lm3s8962/applications/startup.c index e78cfa7eca..87df6e8788 100644 --- a/bsp/lm3s8962/applications/startup.c +++ b/bsp/lm3s8962/applications/startup.c @@ -18,8 +18,8 @@ #include "board.h" #ifdef RT_USING_LWIP -#include -#include + #include + #include #endif /** @@ -30,8 +30,8 @@ extern void rt_hw_serial_init(void); /*@{*/ #ifdef RT_USING_FINSH -extern int finsh_system_init(void); -extern void finsh_set_device(char* device); + extern int finsh_system_init(void); + extern void finsh_set_device(const char *device); #endif extern int rt_application_init(void); @@ -39,11 +39,11 @@ extern void rt_hw_sdcard_init(void); extern int rt_hw_luminaryif_init(void); #ifdef __CC_ARM -extern int Image$$RW_IRAM1$$ZI$$Limit; + extern int Image$$RW_IRAM1$$ZI$$Limit; #elif __ICCARM__ -#pragma section="HEAP" + #pragma section="HEAP" #else -extern int __bss_end; + extern int __bss_end; #endif #ifdef DEBUG @@ -56,13 +56,13 @@ extern int __bss_end; * Output : None * Return : None *******************************************************************************/ -void assert_failed(u8* file, u32 line) +void assert_failed(u8 *file, u32 line) { - rt_kprintf("\n\r Wrong parameter value detected on\r\n"); - rt_kprintf(" file %s\r\n", file); - rt_kprintf(" line %d\r\n", line); + rt_kprintf("\n\r Wrong parameter value detected on\r\n"); + rt_kprintf(" file %s\r\n", file); + rt_kprintf(" line %d\r\n", line); - while (1) ; + while (1) ; } #endif @@ -71,76 +71,76 @@ void assert_failed(u8* file, u32 line) */ void rtthread_startup(void) { - /* init board */ - rt_hw_board_init(); + /* init board */ + rt_hw_board_init(); - /* show version */ - rt_show_version(); + /* show version */ + rt_show_version(); - /* init timer system */ - rt_system_timer_init(); + /* init timer system */ + rt_system_timer_init(); #ifdef RT_USING_HEAP #ifdef __CC_ARM - rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)LM3S_SRAM_END); + rt_system_heap_init((void *)&Image$$RW_IRAM1$$ZI$$Limit, (void *)LM3S_SRAM_END); #elif __ICCARM__ - rt_system_heap_init(__segment_end("HEAP"), (void*)LM3S_SRAM_END); + rt_system_heap_init(__segment_end("HEAP"), (void *)LM3S_SRAM_END); #else - /* init memory system */ - rt_system_heap_init((void*)&__bss_end, (void*)LM3S_SRAM_END); + /* init memory system */ + rt_system_heap_init((void *)&__bss_end, (void *)LM3S_SRAM_END); #endif #endif -#ifdef RT_USING_MODULE - /* init module system */ - rt_system_module_init(); +#ifdef RT_USING_MODULE + /* init module system */ + rt_system_module_init(); #endif - /* init scheduler system */ - rt_system_scheduler_init(); + /* init scheduler system */ + rt_system_scheduler_init(); #ifdef RT_USING_LWIP - eth_system_device_init(); + eth_system_device_init(); - /* register ethernetif device */ - rt_hw_luminaryif_init(); + /* register ethernetif device */ + rt_hw_luminaryif_init(); #endif - /* init hardware serial device */ - rt_hw_serial_init(); + /* init hardware serial device */ + rt_hw_serial_init(); #ifdef RT_USING_DFS - /* init sd card device */ - rt_hw_sdcard_init(); + /* init sd card device */ + rt_hw_sdcard_init(); #endif - /* init application */ - rt_application_init(); + /* init application */ + rt_application_init(); #ifdef RT_USING_FINSH - /* init finsh */ - finsh_system_init(); + /* init finsh */ + finsh_system_init(); #ifdef RT_USING_DEVICE - finsh_set_device("uart1"); + finsh_set_device("uart1"); #endif #endif - /* init idle thread */ - rt_thread_idle_init(); + /* init idle thread */ + rt_thread_idle_init(); - /* start scheduler */ - rt_system_scheduler_start(); + /* start scheduler */ + rt_system_scheduler_start(); - /* never reach here */ - return ; + /* never reach here */ + return ; } int main(void) { - /* disable interrupt first */ - rt_hw_interrupt_disable(); - rtthread_startup(); - - return 0; + /* disable interrupt first */ + rt_hw_interrupt_disable(); + rtthread_startup(); + + return 0; } /*@}*/ diff --git a/bsp/lm3s9b9x/applications/startup.c b/bsp/lm3s9b9x/applications/startup.c index 4d374824e7..8d261d0036 100644 --- a/bsp/lm3s9b9x/applications/startup.c +++ b/bsp/lm3s9b9x/applications/startup.c @@ -18,8 +18,8 @@ #include "board.h" #ifdef RT_USING_LWIP -#include -#include + #include + #include #endif /** @@ -30,8 +30,8 @@ extern void rt_hw_serial_init(void); /*@{*/ #ifdef RT_USING_FINSH -extern int finsh_system_init(void); -extern void finsh_set_device(char* device); + extern int finsh_system_init(void); + extern void finsh_set_device(const char *device); #endif extern int rt_application_init(void); @@ -39,11 +39,11 @@ extern void rt_hw_sdcard_init(void); extern int rt_hw_luminaryif_init(void); #ifdef __CC_ARM -extern int Image$$RW_IRAM1$$ZI$$Limit; + extern int Image$$RW_IRAM1$$ZI$$Limit; #elif __ICCARM__ -#pragma section="HEAP" + #pragma section="HEAP" #else -extern int __bss_end; + extern int __bss_end; #endif #ifdef DEBUG @@ -56,13 +56,13 @@ extern int __bss_end; * Output : None * Return : None *******************************************************************************/ -void __error__(char* file, unsigned long line) +void __error__(char *file, unsigned long line) { - rt_kprintf("\n\r Wrong parameter value detected on\r\n"); - rt_kprintf(" file %s\r\n", file); - rt_kprintf(" line %d\r\n", line); + rt_kprintf("\n\r Wrong parameter value detected on\r\n"); + rt_kprintf(" file %s\r\n", file); + rt_kprintf(" line %d\r\n", line); - while (1) ; + while (1) ; } #endif @@ -71,77 +71,77 @@ void __error__(char* file, unsigned long line) */ void rtthread_startup(void) { - /* init board */ - rt_hw_board_init(); + /* init board */ + rt_hw_board_init(); - /* show version */ - rt_show_version(); + /* show version */ + rt_show_version(); - /* init timer system */ - rt_system_timer_init(); + /* init timer system */ + rt_system_timer_init(); #ifdef RT_USING_HEAP #if LM3S_EXT_SRAM == 1 - /* init sdram */ - rt_system_heap_init((void*)LM3S_EXT_SRAM_BEGIN, (void*)LM3S_EXT_SRAM_END); + /* init sdram */ + rt_system_heap_init((void *)LM3S_EXT_SRAM_BEGIN, (void *)LM3S_EXT_SRAM_END); #else #ifdef __CC_ARM - rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)LM3S_SRAM_END); + rt_system_heap_init((void *)&Image$$RW_IRAM1$$ZI$$Limit, (void *)LM3S_SRAM_END); #elif __ICCARM__ - rt_system_heap_init(__segment_end("HEAP"), (void*)LM3S_SRAM_END); + rt_system_heap_init(__segment_end("HEAP"), (void *)LM3S_SRAM_END); #else - /* init memory system */ - rt_system_heap_init((void*)&__bss_end, (void*)LM3S_SRAM_END); + /* init memory system */ + rt_system_heap_init((void *)&__bss_end, (void *)LM3S_SRAM_END); #endif #endif #endif - /* init scheduler system */ - rt_system_scheduler_init(); + /* init scheduler system */ + rt_system_scheduler_init(); #ifdef RT_USING_LWIP - eth_system_device_init(); + eth_system_device_init(); - /* register ethernetif device */ - rt_hw_luminaryif_init(); + /* register ethernetif device */ + rt_hw_luminaryif_init(); #endif - /* init hardware serial device */ - rt_hw_serial_init(); + /* init hardware serial device */ + rt_hw_serial_init(); #ifdef RT_USING_DFS - /* init sd card device */ - rt_hw_sdcard_init(); + /* init sd card device */ + rt_hw_sdcard_init(); #endif - /* init application */ - rt_application_init(); + /* init application */ + rt_application_init(); #ifdef RT_USING_FINSH - /* init finsh */ - finsh_system_init(); + /* init finsh */ + finsh_system_init(); #ifdef RT_USING_DEVICE - finsh_set_device("uart1"); + finsh_set_device("uart1"); #endif #endif - /* init idle thread */ - rt_thread_idle_init(); + /* init idle thread */ + rt_thread_idle_init(); - /* start scheduler */ - rt_system_scheduler_start(); + /* start scheduler */ + rt_system_scheduler_start(); - /* never reach here */ - return ; + /* never reach here */ + return ; } int main(void) { - /* disable interrupt first */ + /* disable interrupt first */ rt_hw_interrupt_disable(); - rtthread_startup(); + rtthread_startup(); - return 0; + return 0; } /*@}*/ diff --git a/bsp/lm4f232/applications/startup.c b/bsp/lm4f232/applications/startup.c index 8d9eb54611..ed16b60a50 100644 --- a/bsp/lm4f232/applications/startup.c +++ b/bsp/lm4f232/applications/startup.c @@ -18,8 +18,8 @@ #include "board.h" #ifdef RT_USING_LWIP -#include -#include + #include + #include #endif /** @@ -30,8 +30,8 @@ extern void rt_hw_serial_init(void); /*@{*/ #ifdef RT_USING_FINSH -extern int finsh_system_init(void); -extern void finsh_set_device(char* device); + extern int finsh_system_init(void); + extern void finsh_set_device(const char *device); #endif extern int rt_application_init(void); @@ -39,11 +39,11 @@ extern void rt_hw_sdcard_init(void); extern int rt_hw_luminaryif_init(void); #ifdef __CC_ARM -extern int Image$$ER_ZI$$ZI$$Limit; + extern int Image$$ER_ZI$$ZI$$Limit; #elif __ICCARM__ -#pragma section="HEAP" + #pragma section="HEAP" #else -extern int __bss_end; + extern int __bss_end; #endif #ifdef DEBUG @@ -56,13 +56,13 @@ extern int __bss_end; * Output : None * Return : None *******************************************************************************/ -void __error__(char* file, unsigned long line) +void __error__(char *file, unsigned long line) { - rt_kprintf("\n\r Wrong parameter value detected on\r\n"); - rt_kprintf(" file %s\r\n", file); - rt_kprintf(" line %d\r\n", line); + rt_kprintf("\n\r Wrong parameter value detected on\r\n"); + rt_kprintf(" file %s\r\n", file); + rt_kprintf(" line %d\r\n", line); - while (1) ; + while (1) ; } #endif @@ -71,77 +71,77 @@ void __error__(char* file, unsigned long line) */ void rtthread_startup(void) { - /* init board */ - rt_hw_board_init(); + /* init board */ + rt_hw_board_init(); - /* show version */ - rt_show_version(); + /* show version */ + rt_show_version(); - /* init timer system */ - rt_system_timer_init(); + /* init timer system */ + rt_system_timer_init(); #ifdef RT_USING_HEAP #if LM3S_EXT_SRAM == 1 - /* init sdram */ - rt_system_heap_init((void*)LM3S_EXT_SRAM_BEGIN, (void*)LM3S_EXT_SRAM_END); + /* init sdram */ + rt_system_heap_init((void *)LM3S_EXT_SRAM_BEGIN, (void *)LM3S_EXT_SRAM_END); #else #ifdef __CC_ARM - rt_system_heap_init((void*)&Image$$ER_ZI$$ZI$$Limit, (void*)LM3S_SRAM_END); + rt_system_heap_init((void *)&Image$$ER_ZI$$ZI$$Limit, (void *)LM3S_SRAM_END); #elif __ICCARM__ - rt_system_heap_init(__segment_end("HEAP"), (void*)LM3S_SRAM_END); + rt_system_heap_init(__segment_end("HEAP"), (void *)LM3S_SRAM_END); #else - /* init memory system */ - rt_system_heap_init((void*)&__bss_end, (void*)LM3S_SRAM_END); + /* init memory system */ + rt_system_heap_init((void *)&__bss_end, (void *)LM3S_SRAM_END); #endif #endif #endif - /* init scheduler system */ - rt_system_scheduler_init(); + /* init scheduler system */ + rt_system_scheduler_init(); #ifdef RT_USING_LWIP - eth_system_device_init(); + eth_system_device_init(); - /* register ethernetif device */ - rt_hw_luminaryif_init(); + /* register ethernetif device */ + rt_hw_luminaryif_init(); #endif - /* init hardware serial device */ - rt_hw_serial_init(); + /* init hardware serial device */ + rt_hw_serial_init(); #ifdef RT_USING_DFS - /* init sd card device */ - rt_hw_sdcard_init(); + /* init sd card device */ + rt_hw_sdcard_init(); #endif - /* init application */ - rt_application_init(); + /* init application */ + rt_application_init(); #ifdef RT_USING_FINSH - /* init finsh */ - finsh_system_init(); + /* init finsh */ + finsh_system_init(); #ifdef RT_USING_DEVICE - finsh_set_device("uart1"); + finsh_set_device("uart1"); #endif #endif - /* init idle thread */ - rt_thread_idle_init(); + /* init idle thread */ + rt_thread_idle_init(); - /* start scheduler */ - rt_system_scheduler_start(); + /* start scheduler */ + rt_system_scheduler_start(); - /* never reach here */ - return ; + /* never reach here */ + return ; } int main(void) { - /* disable interrupt first */ + /* disable interrupt first */ rt_hw_interrupt_disable(); - rtthread_startup(); + rtthread_startup(); - return 0; + return 0; } /*@}*/ diff --git a/components/drivers/misc/adc.c b/components/drivers/misc/adc.c index d8f79e058b..a73fcc54e3 100644 --- a/components/drivers/misc/adc.c +++ b/components/drivers/misc/adc.c @@ -144,7 +144,7 @@ rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel) return result; } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH static int adc(int argc, char **argv) { @@ -232,4 +232,4 @@ static int adc(int argc, char **argv) } MSH_CMD_EXPORT(adc, adc function); -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ diff --git a/components/drivers/misc/dac.c b/components/drivers/misc/dac.c index 784a503888..45b90d2106 100644 --- a/components/drivers/misc/dac.c +++ b/components/drivers/misc/dac.c @@ -141,7 +141,7 @@ rt_err_t rt_dac_disabled(rt_dac_device_t dev, rt_uint32_t channel) return result; } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH static int dac(int argc, char **argv) { @@ -228,4 +228,4 @@ static int dac(int argc, char **argv) } MSH_CMD_EXPORT(dac, dac function); -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ diff --git a/components/drivers/misc/rt_drv_pwm.c b/components/drivers/misc/rt_drv_pwm.c index f274f509e2..04895868e2 100644 --- a/components/drivers/misc/rt_drv_pwm.c +++ b/components/drivers/misc/rt_drv_pwm.c @@ -198,7 +198,7 @@ rt_err_t rt_pwm_get(struct rt_device_pwm *device, struct rt_pwm_configuration *c FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_enable, pwm_enable, enable pwm by channel.); FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_set, pwm_set, set pwm.); -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH static int pwm_enable(int argc, char **argv) { int result = 0; @@ -323,5 +323,5 @@ _exit: } MSH_CMD_EXPORT(pwm_get, pwm_get ); -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ #endif /* RT_USING_FINSH */ diff --git a/components/drivers/mtd/mtd_nand.c b/components/drivers/mtd/mtd_nand.c index 646625ade5..f516f9b147 100644 --- a/components/drivers/mtd/mtd_nand.c +++ b/components/drivers/mtd/mtd_nand.c @@ -278,7 +278,7 @@ int mtd_nand_erase_all(const char *name) return 0; } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH static void mtd_nand(int argc, char **argv) { /* If the number of arguments less than 2 */ @@ -346,16 +346,16 @@ help: } } MSH_CMD_EXPORT(mtd_nand, MTD nand device test function); -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ -#ifndef FINSH_USING_MSH_ONLY +#ifndef RT_USING_FINSH_ONLY FINSH_FUNCTION_EXPORT_ALIAS(mtd_nandid, nand_id, read ID - nandid(name)); FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_read, nand_read, read page in nand - nand_read(name, block, page)); FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_readoob, nand_readoob, read spare data in nand - nand_readoob(name, block, page)); FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_write, nand_write, write dump data to nand - nand_write(name, block, page)); FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_erase, nand_erase, nand_erase(name, block)); FINSH_FUNCTION_EXPORT_ALIAS(mtd_nand_erase_all, nand_erase_all, erase all of nand device - nand_erase_all(name, block)); -#endif /* FINSH_USING_MSH_ONLY */ +#endif /* RT_USING_FINSH_ONLY */ #endif /* defined(RT_MTD_NAND_DEBUG) && defined(RT_USING_FINSH) */ diff --git a/components/drivers/rtc/rtc.c b/components/drivers/rtc/rtc.c index 5eabeed2dd..35e7ddc3c4 100644 --- a/components/drivers/rtc/rtc.c +++ b/components/drivers/rtc/rtc.c @@ -218,7 +218,7 @@ rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second) return ret; } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH #include /** * get date and time or set (local timezone) [year month day hour min sec] @@ -283,6 +283,6 @@ static void date(uint8_t argc, char **argv) } } MSH_CMD_EXPORT(date, get date and time or set (local timezone) [year month day hour min sec]) -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ #endif /* RT_USING_RTC */ diff --git a/components/drivers/sensors/sensor_cmd.c b/components/drivers/sensors/sensor_cmd.c index 0f0ab66d63..14e53b1c22 100755 --- a/components/drivers/sensors/sensor_cmd.c +++ b/components/drivers/sensors/sensor_cmd.c @@ -155,7 +155,7 @@ static void sensor_fifo(int argc, char **argv) rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20); } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH MSH_CMD_EXPORT(sensor_fifo, Sensor fifo mode test function); #endif @@ -219,7 +219,7 @@ static void sensor_int(int argc, char **argv) } rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20); } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH MSH_CMD_EXPORT(sensor_int, Sensor interrupt mode test function); #endif @@ -268,7 +268,7 @@ static void sensor_polling(int argc, char **argv) } rt_device_close(dev); } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH MSH_CMD_EXPORT(sensor_polling, Sensor polling mode test function); #endif @@ -496,6 +496,6 @@ static void sensor(int argc, char **argv) LOG_W("Unknown command, please enter 'sensor' get help information!"); } } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH MSH_CMD_EXPORT(sensor, sensor test function); #endif diff --git a/components/drivers/spi/spi_flash_sfud.c b/components/drivers/spi/spi_flash_sfud.c index ba673edf62..bcc49e8df4 100644 --- a/components/drivers/spi/spi_flash_sfud.c +++ b/components/drivers/spi/spi_flash_sfud.c @@ -9,6 +9,7 @@ */ #include +#include #include #include "spi_flash.h" #include "spi_flash_sfud.h" @@ -508,7 +509,7 @@ __error: return RT_NULL; } -#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) +#if defined(RT_USING_FINSH) #include @@ -773,6 +774,6 @@ static void sf(uint8_t argc, char **argv) { } } MSH_CMD_EXPORT(sf, SPI Flash operate.); -#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */ +#endif /* defined(RT_USING_FINSH) */ #endif /* RT_USING_SFUD */ diff --git a/components/drivers/wlan/wlan_cmd.c b/components/drivers/wlan/wlan_cmd.c index fde9065428..3b8a119784 100644 --- a/components/drivers/wlan/wlan_cmd.c +++ b/components/drivers/wlan/wlan_cmd.c @@ -586,7 +586,7 @@ static int wifi_msh(int argc, char *argv[]) return 0; } -#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) +#if defined(RT_USING_FINSH) FINSH_FUNCTION_EXPORT_ALIAS(wifi_msh, __cmd_wifi, wifi command.); #endif diff --git a/components/finsh/Kconfig b/components/finsh/Kconfig index 8722fcd79a..637b1a30c1 100644 --- a/components/finsh/Kconfig +++ b/components/finsh/Kconfig @@ -1,13 +1,18 @@ menu "Command shell" config RT_USING_FINSH - bool "finsh shell" + bool + default n + +config RT_USING_MSH + bool "msh shell" + select RT_USING_FINSH default y -if RT_USING_FINSH +if RT_USING_MSH config FINSH_THREAD_NAME - string "The finsh thread name" + string "The msh thread name" default "tshell" config FINSH_USING_HISTORY bool "Enable command history feature" @@ -31,11 +36,11 @@ config FINSH_ECHO_DISABLE_DEFAULT default n config FINSH_THREAD_PRIORITY - int "The priority level value of finsh thread" + int "The priority level value of thread" default 20 config FINSH_THREAD_STACK_SIZE - int "The stack size for finsh thread" + int "The stack size for thread" default 4096 config FINSH_CMD_SIZE @@ -58,23 +63,9 @@ config FINSH_PASSWORD_MAX default RT_NAME_MAX endif -config FINSH_USING_MSH - bool "Using module shell" - default y - -if FINSH_USING_MSH -config FINSH_USING_MSH_DEFAULT - bool "Using module shell in default" - default y - -config FINSH_USING_MSH_ONLY - bool "Only using module shell" - default n - config FINSH_ARG_MAX - int "The command arg num for shell" + int "The number of arguments for a shell command" default 10 -endif endif diff --git a/components/finsh/SConscript b/components/finsh/SConscript index be04c56616..1a6d7c8fc7 100644 --- a/components/finsh/SConscript +++ b/components/finsh/SConscript @@ -1,39 +1,17 @@ -Import('rtconfig') from building import * cwd = GetCurrentDir() src = Split(''' shell.c cmd.c +msh.c ''') -fsh_src = Split(''' -finsh_compiler.c -finsh_error.c -finsh_heap.c -finsh_init.c -finsh_node.c -finsh_ops.c -finsh_parser.c -finsh_var.c -finsh_vm.c -finsh_token.c -''') - -msh_src = Glob('msh.c') - if GetDepend('RT_USING_DFS'): - msh_src += ['msh_file.c'] - -if not GetDepend('FINSH_USING_SYMTAB'): - src += ['symbol.c'] -if GetDepend('FINSH_USING_MSH'): - src = src + msh_src -if not GetDepend('FINSH_USING_MSH_ONLY'): - src = src + fsh_src + src += ['msh_file.c'] CPPPATH = [cwd] -group = DefineGroup('finsh', src, depend = ['RT_USING_FINSH'], CPPPATH = CPPPATH) +group = DefineGroup('msh', src, depend = ['RT_USING_FINSH'], CPPPATH = CPPPATH) Return('group') diff --git a/components/finsh/cmd.c b/components/finsh/cmd.c index fd08246fa5..ad68c49b35 100644 --- a/components/finsh/cmd.c +++ b/components/finsh/cmd.c @@ -33,10 +33,10 @@ #include #include +#include #ifdef RT_USING_FINSH - -#include "finsh.h" +#include #define LIST_FIND_OBJ_NR 8 @@ -46,7 +46,7 @@ long hello(void) return 0; } -FINSH_FUNCTION_EXPORT(hello, say hello world); +MSH_CMD_EXPORT(hello, say hello world); static long clear(void) { @@ -54,8 +54,7 @@ static long clear(void) return 0; } -FINSH_FUNCTION_EXPORT(clear,clear the terminal screen); -MSH_CMD_EXPORT(clear,clear the terminal screen); +MSH_CMD_EXPORT(clear, clear the terminal screen); extern void rt_show_version(void); long version(void) @@ -64,8 +63,7 @@ long version(void) return 0; } -FINSH_FUNCTION_EXPORT(version, show RT-Thread version information); -MSH_CMD_EXPORT(version, show RT-Thread version information); +MSH_CMD_EXPORT(version, show RT - Thread version information); rt_inline void object_split(int len) { @@ -166,20 +164,22 @@ long list_thread(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; const char *item_title = "thread"; int maxlen; - list_find_init(&find_arg, RT_Object_Class_Thread, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_Thread, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; #ifdef RT_USING_SMP - rt_kprintf("%-*.s cpu bind pri status sp stack size max used left tick error\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " --- ---- --- ------- ---------- ---------- ------ ---------- ---\n"); + rt_kprintf("%-*.s cpu bind pri status sp stack size max used left tick error\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" --- ---- --- ------- ---------- ---------- ------ ---------- ---\n"); #else - rt_kprintf("%-*.s pri status sp stack size max used left tick error\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " --- ------- ---------- ---------- ------ ---------- ---\n"); + rt_kprintf("%-*.s pri status sp stack size max used left tick error\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" --- ------- ---------- ---------- ------ ---------- ---\n"); #endif /*RT_USING_SMP*/ do @@ -201,10 +201,10 @@ long list_thread(void) continue; } /* copy info */ - memcpy(&thread_info, obj, sizeof thread_info); + rt_memcpy(&thread_info, obj, sizeof thread_info); rt_hw_interrupt_enable(level); - thread = (struct rt_thread*)obj; + thread = (struct rt_thread *)obj; { rt_uint8_t stat; rt_uint8_t *ptr; @@ -230,32 +230,31 @@ long list_thread(void) while (*ptr == '#')ptr --; rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n", - ((rt_ubase_t)thread->sp - (rt_ubase_t)thread->stack_addr), - thread->stack_size, - ((rt_ubase_t)ptr - (rt_ubase_t)thread->stack_addr) * 100 / thread->stack_size, - thread->remaining_tick, - thread->error); + ((rt_ubase_t)thread->sp - (rt_ubase_t)thread->stack_addr), + thread->stack_size, + ((rt_ubase_t)ptr - (rt_ubase_t)thread->stack_addr) * 100 / thread->stack_size, + thread->remaining_tick, + thread->error); #else ptr = (rt_uint8_t *)thread->stack_addr; while (*ptr == '#')ptr ++; rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n", - thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp), - thread->stack_size, - (thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 - / thread->stack_size, - thread->remaining_tick, - thread->error); + thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp), + thread->stack_size, + (thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 + / thread->stack_size, + thread->remaining_tick, + thread->error); #endif } } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); return 0; } -FINSH_FUNCTION_EXPORT(list_thread, list thread); MSH_CMD_EXPORT(list_thread, list thread); static void show_wait_queue(struct rt_list_node *list) @@ -266,7 +265,7 @@ static void show_wait_queue(struct rt_list_node *list) for (node = list->next; node != list; node = node->next) { thread = rt_list_entry(node, struct rt_thread, tlist); - rt_kprintf("%s", thread->name); + rt_kprintf("%.*s", RT_NAME_MAX, thread->name); if (node->next != list) rt_kprintf("/"); @@ -279,17 +278,18 @@ long list_sem(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; int maxlen; const char *item_title = "semaphore"; - list_find_init(&find_arg, RT_Object_Class_Semaphore, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_Semaphore, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; - rt_kprintf("%-*.s v suspend thread\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " --- --------------\n"); + rt_kprintf("%-*.s v suspend thread\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" --- --------------\n"); do { @@ -310,33 +310,32 @@ long list_sem(void) } rt_hw_interrupt_enable(level); - sem = (struct rt_semaphore*)obj; + sem = (struct rt_semaphore *)obj; if (!rt_list_isempty(&sem->parent.suspend_thread)) { rt_kprintf("%-*.*s %03d %d:", - maxlen, RT_NAME_MAX, - sem->parent.parent.name, - sem->value, - rt_list_len(&sem->parent.suspend_thread)); + maxlen, RT_NAME_MAX, + sem->parent.parent.name, + sem->value, + rt_list_len(&sem->parent.suspend_thread)); show_wait_queue(&(sem->parent.suspend_thread)); rt_kprintf("\n"); } else { rt_kprintf("%-*.*s %03d %d\n", - maxlen, RT_NAME_MAX, - sem->parent.parent.name, - sem->value, - rt_list_len(&sem->parent.suspend_thread)); + maxlen, RT_NAME_MAX, + sem->parent.parent.name, + sem->value, + rt_list_len(&sem->parent.suspend_thread)); } } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); return 0; } -FINSH_FUNCTION_EXPORT(list_sem, list semaphore in system); MSH_CMD_EXPORT(list_sem, list semaphore in system); #endif @@ -346,17 +345,18 @@ long list_event(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; int maxlen; const char *item_title = "event"; - list_find_init(&find_arg, RT_Object_Class_Event, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_Event, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; - rt_kprintf("%-*.s set suspend thread\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " ---------- --------------\n"); + rt_kprintf("%-*.s set suspend thread\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" ---------- --------------\n"); do { @@ -382,26 +382,25 @@ long list_event(void) if (!rt_list_isempty(&e->parent.suspend_thread)) { rt_kprintf("%-*.*s 0x%08x %03d:", - maxlen, RT_NAME_MAX, - e->parent.parent.name, - e->set, - rt_list_len(&e->parent.suspend_thread)); + maxlen, RT_NAME_MAX, + e->parent.parent.name, + e->set, + rt_list_len(&e->parent.suspend_thread)); show_wait_queue(&(e->parent.suspend_thread)); rt_kprintf("\n"); } else { rt_kprintf("%-*.*s 0x%08x 0\n", - maxlen, RT_NAME_MAX, e->parent.parent.name, e->set); + maxlen, RT_NAME_MAX, e->parent.parent.name, e->set); } } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); return 0; } -FINSH_FUNCTION_EXPORT(list_event, list event in system); MSH_CMD_EXPORT(list_event, list event in system); #endif @@ -411,17 +410,18 @@ long list_mutex(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; int maxlen; const char *item_title = "mutex"; - list_find_init(&find_arg, RT_Object_Class_Mutex, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_Mutex, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; - rt_kprintf("%-*.s owner hold suspend thread\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " -------- ---- --------------\n"); + rt_kprintf("%-*.s owner hold suspend thread\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" -------- ---- --------------\n"); do { @@ -445,21 +445,20 @@ long list_mutex(void) m = (struct rt_mutex *)obj; rt_kprintf("%-*.*s %-8.*s %04d %d\n", - maxlen, RT_NAME_MAX, - m->parent.parent.name, - RT_NAME_MAX, - m->owner->name, - m->hold, - rt_list_len(&m->parent.suspend_thread)); + maxlen, RT_NAME_MAX, + m->parent.parent.name, + RT_NAME_MAX, + m->owner->name, + m->hold, + rt_list_len(&m->parent.suspend_thread)); } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); return 0; } -FINSH_FUNCTION_EXPORT(list_mutex, list mutex in system); MSH_CMD_EXPORT(list_mutex, list mutex in system); #endif @@ -469,17 +468,18 @@ long list_mailbox(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; int maxlen; const char *item_title = "mailbox"; - list_find_init(&find_arg, RT_Object_Class_MailBox, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_MailBox, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; - rt_kprintf("%-*.s entry size suspend thread\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " ---- ---- --------------\n"); + rt_kprintf("%-*.s entry size suspend thread\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" ---- ---- --------------\n"); do { @@ -505,32 +505,31 @@ long list_mailbox(void) if (!rt_list_isempty(&m->parent.suspend_thread)) { rt_kprintf("%-*.*s %04d %04d %d:", - maxlen, RT_NAME_MAX, - m->parent.parent.name, - m->entry, - m->size, - rt_list_len(&m->parent.suspend_thread)); + maxlen, RT_NAME_MAX, + m->parent.parent.name, + m->entry, + m->size, + rt_list_len(&m->parent.suspend_thread)); show_wait_queue(&(m->parent.suspend_thread)); rt_kprintf("\n"); } else { rt_kprintf("%-*.*s %04d %04d %d\n", - maxlen, RT_NAME_MAX, - m->parent.parent.name, - m->entry, - m->size, - rt_list_len(&m->parent.suspend_thread)); + maxlen, RT_NAME_MAX, + m->parent.parent.name, + m->entry, + m->size, + rt_list_len(&m->parent.suspend_thread)); } } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); return 0; } -FINSH_FUNCTION_EXPORT(list_mailbox, list mail box in system); MSH_CMD_EXPORT(list_mailbox, list mail box in system); #endif @@ -540,17 +539,18 @@ long list_msgqueue(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; int maxlen; const char *item_title = "msgqueue"; - list_find_init(&find_arg, RT_Object_Class_MessageQueue, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_MessageQueue, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; - rt_kprintf("%-*.s entry suspend thread\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " ---- --------------\n"); + rt_kprintf("%-*.s entry suspend thread\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" ---- --------------\n"); do { next = list_get_next(next, &find_arg); @@ -575,29 +575,28 @@ long list_msgqueue(void) if (!rt_list_isempty(&m->parent.suspend_thread)) { rt_kprintf("%-*.*s %04d %d:", - maxlen, RT_NAME_MAX, - m->parent.parent.name, - m->entry, - rt_list_len(&m->parent.suspend_thread)); + maxlen, RT_NAME_MAX, + m->parent.parent.name, + m->entry, + rt_list_len(&m->parent.suspend_thread)); show_wait_queue(&(m->parent.suspend_thread)); rt_kprintf("\n"); } else { rt_kprintf("%-*.*s %04d %d\n", - maxlen, RT_NAME_MAX, - m->parent.parent.name, - m->entry, - rt_list_len(&m->parent.suspend_thread)); + maxlen, RT_NAME_MAX, + m->parent.parent.name, + m->entry, + rt_list_len(&m->parent.suspend_thread)); } } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); return 0; } -FINSH_FUNCTION_EXPORT(list_msgqueue, list message queue in system); MSH_CMD_EXPORT(list_msgqueue, list message queue in system); #endif @@ -607,17 +606,18 @@ long list_memheap(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; int maxlen; const char *item_title = "memheap"; - list_find_init(&find_arg, RT_Object_Class_MemHeap, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_MemHeap, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; - rt_kprintf("%-*.s pool size max used size available size\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " ---------- ------------- --------------\n"); + rt_kprintf("%-*.s pool size max used size available size\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" ---------- ------------- --------------\n"); do { next = list_get_next(next, &find_arg); @@ -641,20 +641,19 @@ long list_memheap(void) mh = (struct rt_memheap *)obj; rt_kprintf("%-*.*s %-010d %-013d %-05d\n", - maxlen, RT_NAME_MAX, - mh->parent.name, - mh->pool_size, - mh->max_used_size, - mh->available_size); + maxlen, RT_NAME_MAX, + mh->parent.name, + mh->pool_size, + mh->max_used_size, + mh->available_size); } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); return 0; } -FINSH_FUNCTION_EXPORT(list_memheap, list memory heap in system); MSH_CMD_EXPORT(list_memheap, list memory heap in system); #endif @@ -664,17 +663,18 @@ long list_mempool(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; int maxlen; const char *item_title = "mempool"; - list_find_init(&find_arg, RT_Object_Class_MemPool, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_MemPool, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; - rt_kprintf("%-*.s block total free suspend thread\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " ---- ---- ---- --------------\n"); + rt_kprintf("%-*.s block total free suspend thread\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" ---- ---- ---- --------------\n"); do { next = list_get_next(next, &find_arg); @@ -708,33 +708,32 @@ long list_mempool(void) if (suspend_thread_count > 0) { rt_kprintf("%-*.*s %04d %04d %04d %d:", - maxlen, RT_NAME_MAX, - mp->parent.name, - mp->block_size, - mp->block_total_count, - mp->block_free_count, - suspend_thread_count); + maxlen, RT_NAME_MAX, + mp->parent.name, + mp->block_size, + mp->block_total_count, + mp->block_free_count, + suspend_thread_count); show_wait_queue(&(mp->suspend_thread)); rt_kprintf("\n"); } else { rt_kprintf("%-*.*s %04d %04d %04d %d\n", - maxlen, RT_NAME_MAX, - mp->parent.name, - mp->block_size, - mp->block_total_count, - mp->block_free_count, - suspend_thread_count); + maxlen, RT_NAME_MAX, + mp->parent.name, + mp->block_size, + mp->block_total_count, + mp->block_free_count, + suspend_thread_count); } } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); return 0; } -FINSH_FUNCTION_EXPORT(list_mempool, list memory pool in system) MSH_CMD_EXPORT(list_mempool, list memory pool in system); #endif @@ -743,18 +742,20 @@ long list_timer(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; int maxlen; const char *item_title = "timer"; - list_find_init(&find_arg, RT_Object_Class_Timer, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_Timer, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; - rt_kprintf("%-*.s periodic timeout flag\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " ---------- ---------- -----------\n"); - do { + rt_kprintf("%-*.s periodic timeout flag\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" ---------- ---------- -----------\n"); + do + { next = list_get_next(next, &find_arg); { int i; @@ -775,10 +776,10 @@ long list_timer(void) timer = (struct rt_timer *)obj; rt_kprintf("%-*.*s 0x%08x 0x%08x ", - maxlen, RT_NAME_MAX, - timer->parent.name, - timer->init_tick, - timer->timeout_tick); + maxlen, RT_NAME_MAX, + timer->parent.name, + timer->init_tick, + timer->timeout_tick); if (timer->parent.flag & RT_TIMER_FLAG_ACTIVATED) rt_kprintf("activated\n"); else @@ -787,13 +788,12 @@ long list_timer(void) } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); rt_kprintf("current tick:0x%08x\n", rt_tick_get()); return 0; } -FINSH_FUNCTION_EXPORT(list_timer, list timer in system); MSH_CMD_EXPORT(list_timer, list timer in system); #ifdef RT_USING_DEVICE @@ -831,17 +831,18 @@ long list_device(void) rt_ubase_t level; list_get_next_t find_arg; rt_list_t *obj_list[LIST_FIND_OBJ_NR]; - rt_list_t *next = (rt_list_t*)RT_NULL; + rt_list_t *next = (rt_list_t *)RT_NULL; int maxlen; const char *item_title = "device"; - list_find_init(&find_arg, RT_Object_Class_Device, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); + list_find_init(&find_arg, RT_Object_Class_Device, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); maxlen = RT_NAME_MAX; - rt_kprintf("%-*.s type ref count\n", maxlen, item_title); object_split(maxlen); - rt_kprintf( " -------------------- ----------\n"); + rt_kprintf("%-*.s type ref count\n", maxlen, item_title); + object_split(maxlen); + rt_kprintf(" -------------------- ----------\n"); do { next = list_get_next(next, &find_arg); @@ -864,31 +865,25 @@ long list_device(void) device = (struct rt_device *)obj; rt_kprintf("%-*.*s %-20s %-8d\n", - maxlen, RT_NAME_MAX, - device->parent.name, - (device->type <= RT_Device_Class_Unknown) ? - device_type_str[device->type] : - device_type_str[RT_Device_Class_Unknown], - device->ref_count); + maxlen, RT_NAME_MAX, + device->parent.name, + (device->type <= RT_Device_Class_Unknown) ? + device_type_str[device->type] : + device_type_str[RT_Device_Class_Unknown], + device->ref_count); } } } - while (next != (rt_list_t*)RT_NULL); + while (next != (rt_list_t *)RT_NULL); return 0; } -FINSH_FUNCTION_EXPORT(list_device, list device in system); MSH_CMD_EXPORT(list_device, list device in system); #endif long list(void) { -#ifndef FINSH_USING_MSH_ONLY - struct finsh_syscall_item *syscall_item; - struct finsh_sysvar_item *sysvar_item; -#endif - rt_kprintf("--Function List:\n"); { struct finsh_syscall *index; @@ -907,247 +902,8 @@ long list(void) } } -#ifndef FINSH_USING_MSH_ONLY - /* list syscall list */ - syscall_item = global_syscall_list; - while (syscall_item != NULL) - { - rt_kprintf("[l] %s\n", syscall_item->syscall.name); - syscall_item = syscall_item->next; - } - - rt_kprintf("--Variable List:\n"); - { - struct finsh_sysvar *index; - for (index = _sysvar_table_begin; - index < _sysvar_table_end; - FINSH_NEXT_SYSVAR(index)) - { -#ifdef FINSH_USING_DESCRIPTION - rt_kprintf("%-16s -- %s\n", index->name, index->desc); -#else - rt_kprintf("%s\n", index->name); -#endif - } - } - - sysvar_item = global_sysvar_list; - while (sysvar_item != NULL) - { - rt_kprintf("[l] %s\n", sysvar_item->sysvar.name); - sysvar_item = sysvar_item->next; - } -#endif - return 0; } -FINSH_FUNCTION_EXPORT(list, list all symbol in system) - -#ifndef FINSH_USING_MSH_ONLY -static int str_is_prefix(const char *prefix, const char *str) -{ - while ((*prefix) && (*prefix == *str)) - { - prefix ++; - str ++; - } - - if (*prefix == 0) - return 0; - - return -1; -} - -static int str_common(const char *str1, const char *str2) -{ - const char *str = str1; - - while ((*str != 0) && (*str2 != 0) && (*str == *str2)) - { - str ++; - str2 ++; - } - - return (str - str1); -} - -void list_prefix(char *prefix) -{ - struct finsh_syscall_item *syscall_item; - struct finsh_sysvar_item *sysvar_item; - rt_uint16_t func_cnt, var_cnt; - int length, min_length; - const char *name_ptr; - - func_cnt = 0; - var_cnt = 0; - min_length = 0; - name_ptr = RT_NULL; - - /* checks in system function call */ - { - struct finsh_syscall *index; - for (index = _syscall_table_begin; - index < _syscall_table_end; - FINSH_NEXT_SYSCALL(index)) - { - /* skip internal command */ - if (str_is_prefix("__", index->name) == 0) continue; - - if (str_is_prefix(prefix, index->name) == 0) - { - if (func_cnt == 0) - { - rt_kprintf("--function:\n"); - - if (*prefix != 0) - { - /* set name_ptr */ - name_ptr = index->name; - - /* set initial length */ - min_length = strlen(name_ptr); - } - } - - func_cnt ++; - - if (*prefix != 0) - { - length = str_common(name_ptr, index->name); - if (length < min_length) - min_length = length; - } - -#ifdef FINSH_USING_DESCRIPTION - rt_kprintf("%-16s -- %s\n", index->name, index->desc); -#else - rt_kprintf("%s\n", index->name); -#endif - } - } - } - - /* checks in dynamic system function call */ - syscall_item = global_syscall_list; - while (syscall_item != NULL) - { - if (str_is_prefix(prefix, syscall_item->syscall.name) == 0) - { - if (func_cnt == 0) - { - rt_kprintf("--function:\n"); - if (*prefix != 0 && name_ptr == NULL) - { - /* set name_ptr */ - name_ptr = syscall_item->syscall.name; - - /* set initial length */ - min_length = strlen(name_ptr); - } - } - - func_cnt ++; - - if (*prefix != 0) - { - length = str_common(name_ptr, syscall_item->syscall.name); - if (length < min_length) - min_length = length; - } - - rt_kprintf("[l] %s\n", syscall_item->syscall.name); - } - syscall_item = syscall_item->next; - } - - /* checks in system variable */ - { - struct finsh_sysvar *index; - for (index = _sysvar_table_begin; - index < _sysvar_table_end; - FINSH_NEXT_SYSVAR(index)) - { - if (str_is_prefix(prefix, index->name) == 0) - { - if (var_cnt == 0) - { - rt_kprintf("--variable:\n"); - - if (*prefix != 0 && name_ptr == NULL) - { - /* set name_ptr */ - name_ptr = index->name; - - /* set initial length */ - min_length = strlen(name_ptr); - - } - } - - var_cnt ++; - - if (*prefix != 0) - { - length = str_common(name_ptr, index->name); - if (length < min_length) - min_length = length; - } - -#ifdef FINSH_USING_DESCRIPTION - rt_kprintf("%-16s -- %s\n", index->name, index->desc); -#else - rt_kprintf("%s\n", index->name); -#endif - } - } - } - - /* checks in dynamic system variable */ - sysvar_item = global_sysvar_list; - while (sysvar_item != NULL) - { - if (str_is_prefix(prefix, sysvar_item->sysvar.name) == 0) - { - if (var_cnt == 0) - { - rt_kprintf("--variable:\n"); - if (*prefix != 0 && name_ptr == NULL) - { - /* set name_ptr */ - name_ptr = sysvar_item->sysvar.name; - - /* set initial length */ - min_length = strlen(name_ptr); - } - } - - var_cnt ++; - - if (*prefix != 0) - { - length = str_common(name_ptr, sysvar_item->sysvar.name); - if (length < min_length) - min_length = length; - } - - rt_kprintf("[v] %s\n", sysvar_item->sysvar.name); - } - sysvar_item = sysvar_item->next; - } - - /* only one matched */ - if (name_ptr != NULL) - { - rt_strncpy(prefix, name_ptr, min_length); - } -} -#endif - -#if defined(FINSH_USING_SYMTAB) && !defined(FINSH_USING_MSH_ONLY) -static int dummy = 0; -FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh) -#endif +MSH_CMD_EXPORT(list, list all symbol in system) #endif /* RT_USING_FINSH */ - diff --git a/components/finsh/finsh.h b/components/finsh/finsh.h index dd5e27dea5..74fef60fc0 100644 --- a/components/finsh/finsh.h +++ b/components/finsh/finsh.h @@ -11,239 +11,157 @@ #define __FINSH_H__ #include -#include "finsh_api.h" -/* -- the beginning of option -- */ -#define FINSH_NAME_MAX 16 /* max length of identifier */ -#define FINSH_NODE_MAX 16 /* max number of node */ - -#define FINSH_HEAP_MAX 128 /* max length of heap */ -#define FINSH_STRING_MAX 128 /* max length of string */ -#define FINSH_VARIABLE_MAX 8 /* max number of variable */ - -#define FINSH_STACK_MAX 64 /* max stack size */ -#define FINSH_TEXT_MAX 128 /* max text segment size */ +#if defined(_MSC_VER) + #pragma section("FSymTab$f",read) +#endif -#define HEAP_ALIGNMENT 4 /* heap alignment */ +typedef long (*syscall_func)(void); +#ifdef FINSH_USING_SYMTAB +#ifdef __TI_COMPILER_VERSION__ + #define __TI_FINSH_EXPORT_FUNCTION(f) PRAGMA(DATA_SECTION(f,"FSymTab")) +#endif +#ifdef FINSH_USING_DESCRIPTION +#ifdef _MSC_VER +#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + const char __fsym_##cmd##_name[] = #cmd; \ + const char __fsym_##cmd##_desc[] = #desc; \ + __declspec(allocate("FSymTab$f")) \ + const struct finsh_syscall __fsym_##cmd = \ + { \ + __fsym_##cmd##_name, \ + __fsym_##cmd##_desc, \ + (syscall_func)&name \ + }; +#pragma comment(linker, "/merge:FSymTab=mytext") + +#elif defined(__TI_COMPILER_VERSION__) +#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \ + const char __fsym_##cmd##_name[] = #cmd; \ + const char __fsym_##cmd##_desc[] = #desc; \ + const struct finsh_syscall __fsym_##cmd = \ + { \ + __fsym_##cmd##_name, \ + __fsym_##cmd##_desc, \ + (syscall_func)&name \ + }; -#define FINSH_GET16(x) (*(x)) | (*((x)+1) << 8) -#define FINSH_GET32(x) (rt_ubase_t)(*(x)) | ((rt_ubase_t)*((x)+1) << 8) | \ - ((rt_ubase_t)*((x)+2) << 16) | ((rt_ubase_t)*((x)+3) << 24) +#else +#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + const char __fsym_##cmd##_name[] RT_SECTION(".rodata.name") = #cmd; \ + const char __fsym_##cmd##_desc[] RT_SECTION(".rodata.name") = #desc; \ + RT_USED const struct finsh_syscall __fsym_##cmd RT_SECTION("FSymTab")= \ + { \ + __fsym_##cmd##_name, \ + __fsym_##cmd##_desc, \ + (syscall_func)&name \ + }; -#define FINSH_SET16(x, v) \ - do \ - { \ - *(x) = (v) & 0x00ff; \ - (*((x)+1)) = (v) >> 8; \ - } while ( 0 ) +#endif +#else +#ifdef _MSC_VER +#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + const char __fsym_##cmd##_name[] = #cmd; \ + __declspec(allocate("FSymTab$f")) \ + const struct finsh_syscall __fsym_##cmd = \ + { \ + __fsym_##cmd##_name, \ + (syscall_func)&name \ + }; +#pragma comment(linker, "/merge:FSymTab=mytext") + +#elif defined(__TI_COMPILER_VERSION__) +#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \ + const char __fsym_##cmd##_name[] = #cmd; \ + const struct finsh_syscall __fsym_##cmd = \ + { \ + __fsym_##cmd##_name, \ + (syscall_func)&name \ + }; -#define FINSH_SET32(x, v) \ - do \ - { \ - *(x) = (rt_uint32_t)(v) & 0x000000ff; \ - (*((x)+1)) = ((rt_uint32_t)(v) >> 8) & 0x000000ff; \ - (*((x)+2)) = ((rt_uint32_t)(v) >> 16) & 0x000000ff; \ - (*((x)+3)) = ((rt_uint32_t)(v) >> 24); \ - } while ( 0 ) +#else +#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ + const char __fsym_##cmd##_name[] = #cmd; \ + RT_USED const struct finsh_syscall __fsym_##cmd RT_SECTION("FSymTab")= \ + { \ + __fsym_##cmd##_name, \ + (syscall_func)&name \ + }; -/* -- the end of option -- */ +#endif +#endif /* end of FINSH_USING_DESCRIPTION */ +#endif /* end of FINSH_USING_SYMTAB */ -/* std header file */ -#include -#include -#include -#include -#include +/** + * @ingroup finsh + * + * This macro exports a system function to finsh shell. + * + * @param name the name of function. + * @param desc the description of function, which will show in help. + */ +#define FINSH_FUNCTION_EXPORT(name, desc) \ + FINSH_FUNCTION_EXPORT_CMD(name, name, desc) -#define FINSH_VERSION_MAJOR 1 -#define FINSH_VERSION_MINOR 0 +/** + * @ingroup finsh + * + * This macro exports a system function with an alias name to finsh shell. + * + * @param name the name of function. + * @param alias the alias name of function. + * @param desc the description of function, which will show in help. + */ +#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \ + FINSH_FUNCTION_EXPORT_CMD(name, alias, desc) /** - * @addtogroup finsh + * @ingroup finsh + * + * This macro exports a command to module shell. + * + * @param command the name of command. + * @param desc the description of command, which will show in help. */ -/*@{*/ -#define FINSH_ERROR_OK 0 /**< No error */ -#define FINSH_ERROR_INVALID_TOKEN 1 /**< Invalid token */ -#define FINSH_ERROR_EXPECT_TYPE 2 /**< Expect a type */ -#define FINSH_ERROR_UNKNOWN_TYPE 3 /**< Unknown type */ -#define FINSH_ERROR_VARIABLE_EXIST 4 /**< Variable exist */ -#define FINSH_ERROR_EXPECT_OPERATOR 5 /**< Expect a operator */ -#define FINSH_ERROR_MEMORY_FULL 6 /**< Memory full */ -#define FINSH_ERROR_UNKNOWN_OP 7 /**< Unknown operator */ -#define FINSH_ERROR_UNKNOWN_NODE 8 /**< Unknown node */ -#define FINSH_ERROR_EXPECT_CHAR 9 /**< Expect a character */ -#define FINSH_ERROR_UNEXPECT_END 10 /**< Unexpect end */ -#define FINSH_ERROR_UNKNOWN_TOKEN 11 /**< Unknown token */ -#define FINSH_ERROR_NO_FLOAT 12 /**< Float not supported */ -#define FINSH_ERROR_UNKNOWN_SYMBOL 13 /**< Unknown symbol */ -#define FINSH_ERROR_NULL_NODE 14 /**< Null node */ -/*@}*/ +#define MSH_CMD_EXPORT(command, desc) \ + FINSH_FUNCTION_EXPORT_CMD(command, __cmd_##command, desc) +#define MSH_CMD_EXPORT_ALIAS(command, alias, desc) \ + FINSH_FUNCTION_EXPORT_ALIAS(command, __cmd_##alias, desc) + +/* system call table */ +struct finsh_syscall +{ + const char *name; /* the name of system call */ +#if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB) + const char *desc; /* description of system call */ +#endif + syscall_func func; /* the function address of system call */ +}; /* system call item */ struct finsh_syscall_item { - struct finsh_syscall_item* next; /* next item */ + struct finsh_syscall_item *next; /* next item */ struct finsh_syscall syscall; /* syscall */ }; -extern struct finsh_syscall_item *global_syscall_list; -/* system variable table */ -struct finsh_sysvar -{ - const char* name; /* the name of variable */ -#if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB) - const char* desc; /* description of system variable */ -#endif - uint8_t type; /* the type of variable */ - void* var ; /* the address of variable */ -}; +extern struct finsh_syscall_item *global_syscall_list; +extern struct finsh_syscall *_syscall_table_begin, *_syscall_table_end; #if defined(_MSC_VER) || (defined(__GNUC__) && defined(__x86_64__)) -struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call); -struct finsh_sysvar* finsh_sysvar_next(struct finsh_sysvar* call); -#define FINSH_NEXT_SYSCALL(index) index=finsh_syscall_next(index) -#define FINSH_NEXT_SYSVAR(index) index=finsh_sysvar_next(index) + struct finsh_syscall *finsh_syscall_next(struct finsh_syscall *call); + #define FINSH_NEXT_SYSCALL(index) index=finsh_syscall_next(index) #else -#define FINSH_NEXT_SYSCALL(index) index++ -#define FINSH_NEXT_SYSVAR(index) index++ + #define FINSH_NEXT_SYSCALL(index) index++ #endif -/* system variable item */ -struct finsh_sysvar_item -{ - struct finsh_sysvar_item *next; /* next item */ - struct finsh_sysvar sysvar; /* system variable */ -}; -extern struct finsh_sysvar *_sysvar_table_begin, *_sysvar_table_end; -extern struct finsh_sysvar_item* global_sysvar_list; +/* find out system call, which should be implemented in user program */ +struct finsh_syscall *finsh_syscall_lookup(const char *name); -/* find out system variable, which should be implemented in user program */ -struct finsh_sysvar* finsh_sysvar_lookup(const char* name); - - -struct finsh_token -{ - char eof; - char replay; - - int position; - uint8_t current_token; - - union { - char char_value; - int int_value; - long long_value; - } value; - uint8_t string[FINSH_STRING_MAX]; - - uint8_t* line; -}; - -#define FINSH_IDTYPE_VAR 0x01 -#define FINSH_IDTYPE_SYSVAR 0x02 -#define FINSH_IDTYPE_SYSCALL 0x04 -#define FINSH_IDTYPE_ADDRESS 0x08 -struct finsh_node -{ - uint8_t node_type; /* node node_type */ - uint8_t data_type; /* node data node_type */ - uint8_t idtype; /* id node information */ - - union { /* value node */ - char char_value; - short short_value; - int int_value; - long long_value; - void* ptr; - } value; - union - { - /* point to variable identifier or function identifier */ - struct finsh_var *var; - struct finsh_sysvar *sysvar; - struct finsh_syscall*syscall; - }id; - - /* sibling and child node */ - struct finsh_node *sibling, *child; -}; - -struct finsh_parser -{ - uint8_t* parser_string; - - struct finsh_token token; - struct finsh_node* root; -}; - -/** - * @ingroup finsh - * - * The basic data type in finsh shell - */ -enum finsh_type { - finsh_type_unknown = 0, /**< unknown data type */ - finsh_type_void, /**< void */ - finsh_type_voidp, /**< void pointer */ - finsh_type_char, /**< char */ - finsh_type_uchar, /**< unsigned char */ - finsh_type_charp, /**< char pointer */ - finsh_type_short, /**< short */ - finsh_type_ushort, /**< unsigned short */ - finsh_type_shortp, /**< short pointer */ - finsh_type_int, /**< int */ - finsh_type_uint, /**< unsigned int */ - finsh_type_intp, /**< int pointer */ - finsh_type_long, /**< long */ - finsh_type_ulong, /**< unsigned long */ - finsh_type_longp /**< long pointer */ -}; - -/* init finsh environment */ -int finsh_init(struct finsh_parser* parser); -/* flush finsh node, text segment */ -int finsh_flush(struct finsh_parser* parser); -/* reset all of finsh */ -int finsh_reset(struct finsh_parser* parser); #ifdef RT_USING_DEVICE -void finsh_set_device(const char* device_name); + void finsh_set_device(const char *device_name); #endif -/* run finsh parser to generate abstract synatx tree */ -void finsh_parser_run (struct finsh_parser* parser, const unsigned char* string); -/* run compiler to compile abstract syntax tree */ -int finsh_compiler_run(struct finsh_node* node); -/* run finsh virtual machine */ -void finsh_vm_run(void); - -/* get variable value */ -struct finsh_var* finsh_var_lookup(const char* name); -/* get bottom value of stack */ -long finsh_stack_bottom(void); - -/* get error number of finsh */ -uint8_t finsh_errno(void); -/* get error string */ -const char* finsh_error_string(uint8_t type); - -#ifdef RT_USING_HEAP -/** - * @ingroup finsh - * - * This function appends a system call to finsh runtime environment - * @param name the name of system call - * @param func the function pointer of system call - */ -void finsh_syscall_append(const char* name, syscall_func func); - -/** - * @ingroup finsh - * - * This function appends a system variable to finsh runtime environment - * @param name the name of system variable - * @param type the data type of system variable - * @param addr the address of system variable - */ -void finsh_sysvar_append(const char* name, uint8_t type, void* addr); -#endif #endif diff --git a/components/finsh/finsh_api.h b/components/finsh/finsh_api.h deleted file mode 100644 index fd9e6a773e..0000000000 --- a/components/finsh/finsh_api.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#ifndef FINSH_API_H__ -#define FINSH_API_H__ - -#if defined(_MSC_VER) -#pragma section("FSymTab$f",read) -#pragma section("VSymTab",read) -#endif - -typedef long (*syscall_func)(void); - -/* system call table */ -struct finsh_syscall -{ - const char* name; /* the name of system call */ -#if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB) - const char* desc; /* description of system call */ -#endif - syscall_func func; /* the function address of system call */ -}; -extern struct finsh_syscall *_syscall_table_begin, *_syscall_table_end; - -/* find out system call, which should be implemented in user program */ -struct finsh_syscall* finsh_syscall_lookup(const char* name); - -#ifdef FINSH_USING_SYMTAB - -#ifdef __TI_COMPILER_VERSION__ -#define __TI_FINSH_EXPORT_FUNCTION(f) PRAGMA(DATA_SECTION(f,"FSymTab")) -#define __TI_FINSH_EXPORT_VAR(v) PRAGMA(DATA_SECTION(v,"VSymTab")) -#endif - - #ifdef FINSH_USING_DESCRIPTION - #ifdef _MSC_VER - #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ - const char __fsym_##cmd##_name[] = #cmd; \ - const char __fsym_##cmd##_desc[] = #desc; \ - __declspec(allocate("FSymTab$f")) \ - const struct finsh_syscall __fsym_##cmd = \ - { \ - __fsym_##cmd##_name, \ - __fsym_##cmd##_desc, \ - (syscall_func)&name \ - }; - #pragma comment(linker, "/merge:FSymTab=mytext") - - #define FINSH_VAR_EXPORT(name, type, desc) \ - const char __vsym_##name##_name[] = #name; \ - const char __vsym_##name##_desc[] = #desc; \ - __declspec(allocate("VSymTab")) \ - const struct finsh_sysvar __vsym_##name = \ - { \ - __vsym_##name##_name, \ - __vsym_##name##_desc, \ - type, \ - (void*)&name \ - }; - - #elif defined(__TI_COMPILER_VERSION__) - #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ - __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \ - const char __fsym_##cmd##_name[] = #cmd; \ - const char __fsym_##cmd##_desc[] = #desc; \ - const struct finsh_syscall __fsym_##cmd = \ - { \ - __fsym_##cmd##_name, \ - __fsym_##cmd##_desc, \ - (syscall_func)&name \ - }; - - #define FINSH_VAR_EXPORT(name, type, desc) \ - __TI_FINSH_EXPORT_VAR(__vsym_##name); \ - const char __vsym_##name##_name[] = #name; \ - const char __vsym_##name##_desc[] = #desc; \ - const struct finsh_sysvar __vsym_##name = \ - { \ - __vsym_##name##_name, \ - __vsym_##name##_desc, \ - type, \ - (void*)&name \ - }; - - #else - #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ - const char __fsym_##cmd##_name[] RT_SECTION(".rodata.name") = #cmd; \ - const char __fsym_##cmd##_desc[] RT_SECTION(".rodata.name") = #desc; \ - RT_USED const struct finsh_syscall __fsym_##cmd RT_SECTION("FSymTab")= \ - { \ - __fsym_##cmd##_name, \ - __fsym_##cmd##_desc, \ - (syscall_func)&name \ - }; - - #define FINSH_VAR_EXPORT(name, type, desc) \ - const char __vsym_##name##_name[] RT_SECTION(".rodata.name") = #name; \ - const char __vsym_##name##_desc[] RT_SECTION(".rodata.name") = #desc; \ - RT_USED const struct finsh_sysvar __vsym_##name RT_SECTION("VSymTab")= \ - { \ - __vsym_##name##_name, \ - __vsym_##name##_desc, \ - type, \ - (void*)&name \ - }; - - #endif - #else - #ifdef _MSC_VER - #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ - const char __fsym_##cmd##_name[] = #cmd; \ - __declspec(allocate("FSymTab$f")) \ - const struct finsh_syscall __fsym_##cmd = \ - { \ - __fsym_##cmd##_name, \ - (syscall_func)&name \ - }; - #pragma comment(linker, "/merge:FSymTab=mytext") - - #define FINSH_VAR_EXPORT(name, type, desc) \ - const char __vsym_##name##_name[] = #name; \ - __declspec(allocate("VSymTab")) const struct finsh_sysvar __vsym_##name = \ - { \ - __vsym_##name##_name, \ - type, \ - (void*)&name \ - }; - - #elif defined(__TI_COMPILER_VERSION__) - #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ - __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \ - const char __fsym_##cmd##_name[] = #cmd; \ - const struct finsh_syscall __fsym_##cmd = \ - { \ - __fsym_##cmd##_name, \ - (syscall_func)&name \ - }; - - #define FINSH_VAR_EXPORT(name, type, desc) \ - __TI_FINSH_EXPORT_VAR(__vsym_##name); \ - const char __vsym_##name##_name[] = #name; \ - const struct finsh_sysvar __vsym_##name = \ - { \ - __vsym_##name##_name, \ - type, \ - (void*)&name \ - }; - - #else - #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ - const char __fsym_##cmd##_name[] = #cmd; \ - RT_USED const struct finsh_syscall __fsym_##cmd RT_SECTION("FSymTab")= \ - { \ - __fsym_##cmd##_name, \ - (syscall_func)&name \ - }; - - #define FINSH_VAR_EXPORT(name, type, desc) \ - const char __vsym_##name##_name[] = #name; \ - RT_USED const struct finsh_sysvar __vsym_##name RT_SECTION("VSymTab")= \ - { \ - __vsym_##name##_name, \ - type, \ - (void*)&name \ - }; - - #endif - #endif /* end of FINSH_USING_DESCRIPTION */ -#endif /* end of FINSH_USING_SYMTAB */ - -/** - * @ingroup finsh - * - * This macro exports a system function to finsh shell. - * - * @param name the name of function. - * @param desc the description of function, which will show in help. - */ -#define FINSH_FUNCTION_EXPORT(name, desc) \ - FINSH_FUNCTION_EXPORT_CMD(name, name, desc) - -/** - * @ingroup finsh - * - * This macro exports a system function with an alias name to finsh shell. - * - * @param name the name of function. - * @param alias the alias name of function. - * @param desc the description of function, which will show in help. - */ -#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \ - FINSH_FUNCTION_EXPORT_CMD(name, alias, desc) - -/** - * @ingroup finsh - * - * This macro exports a command to module shell. - * - * @param command the name of command. - * @param desc the description of command, which will show in help. - */ -#ifdef FINSH_USING_MSH -#define MSH_CMD_EXPORT(command, desc) \ - FINSH_FUNCTION_EXPORT_CMD(command, __cmd_##command, desc) -#define MSH_CMD_EXPORT_ALIAS(command, alias, desc) \ - FINSH_FUNCTION_EXPORT_ALIAS(command, __cmd_##alias, desc) -#else -#define MSH_CMD_EXPORT(command, desc) -#define MSH_CMD_EXPORT_ALIAS(command, alias, desc) -#endif - -#endif diff --git a/components/finsh/finsh_compiler.c b/components/finsh/finsh_compiler.c deleted file mode 100644 index 1cb4ff00a5..0000000000 --- a/components/finsh/finsh_compiler.c +++ /dev/null @@ -1,918 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#include - -#include "finsh_node.h" -#include "finsh_error.h" -#include "finsh_var.h" -#include "finsh_ops.h" - -union finsh_value* finsh_compile_sp; /* stack pointer */ -uint8_t* finsh_compile_pc; /* PC */ - -#define finsh_code_byte(x) do { *finsh_compile_pc = (x); finsh_compile_pc ++; } while(0) -#define finsh_code_word(x) do { FINSH_SET16(finsh_compile_pc, x); finsh_compile_pc +=2; } while(0) -#define finsh_code_dword(x) do { FINSH_SET32(finsh_compile_pc, x); finsh_compile_pc +=4; } while(0) - -static int finsh_compile(struct finsh_node* node) -{ - if (node != NULL) - { - /* compile child node */ - if (finsh_node_child(node) != NULL) - finsh_compile(finsh_node_child(node)); - - /* compile current node */ - switch (node->node_type) - { - case FINSH_NODE_ID: - { - /* identifier::syscall */ - if (node->idtype & FINSH_IDTYPE_SYSCALL) - { - /* load address */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword((long)node->id.syscall->func); - } - /* identifier::sysvar */ - else if (node->idtype & FINSH_IDTYPE_SYSVAR) - { - struct finsh_sysvar* sysvar; - - sysvar = node->id.sysvar; - if (sysvar != NULL) - { - switch (sysvar->type) - { - case finsh_type_char: - case finsh_type_uchar: - if (node->idtype & FINSH_IDTYPE_ADDRESS) - { - /* load address */ - finsh_code_byte(FINSH_OP_LD_DWORD); - } - else - { - /* load value */ - finsh_code_byte(FINSH_OP_LD_VALUE_BYTE); - } - - finsh_code_dword((long)(sysvar->var)); - break; - - case finsh_type_short: - case finsh_type_ushort: - if (node->idtype & FINSH_IDTYPE_ADDRESS) - { - /* load address */ - finsh_code_byte(FINSH_OP_LD_DWORD); - } - else - { - /* load value */ - finsh_code_byte(FINSH_OP_LD_VALUE_WORD); - } - - finsh_code_dword((long)(sysvar->var)); - break; - - case finsh_type_int: - case finsh_type_uint: - case finsh_type_long: - case finsh_type_ulong: - case finsh_type_charp: - case finsh_type_shortp: - case finsh_type_intp: - case finsh_type_longp: - if (node->idtype & FINSH_IDTYPE_ADDRESS) - { - /* load address */ - finsh_code_byte(FINSH_OP_LD_DWORD); - } - else - { - /* load value */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD); - } - - finsh_code_dword((long)(sysvar->var)); - break; - } - } - } - /* identifier::var */ - else - { - struct finsh_var* var; - - var = node->id.var; - if (var != NULL) - { - switch (var->type) - { - case finsh_type_char: - case finsh_type_uchar: - if (node->idtype & FINSH_IDTYPE_ADDRESS) - { - /* load address */ - finsh_code_byte(FINSH_OP_LD_DWORD); - } - else - { - /* load value */ - finsh_code_byte(FINSH_OP_LD_VALUE_BYTE); - } - - finsh_code_dword((long)&(var->value.char_value)); - break; - - case finsh_type_short: - case finsh_type_ushort: - if (node->idtype & FINSH_IDTYPE_ADDRESS) - { - /* load address */ - finsh_code_byte(FINSH_OP_LD_DWORD); - } - else - { - /* load value */ - finsh_code_byte(FINSH_OP_LD_VALUE_WORD); - } - - finsh_code_dword((long)&(var->value.short_value)); - break; - - case finsh_type_int: - case finsh_type_uint: - case finsh_type_long: - case finsh_type_ulong: - case finsh_type_charp: - case finsh_type_shortp: - case finsh_type_intp: - case finsh_type_longp: - if (node->idtype & FINSH_IDTYPE_ADDRESS) - { - /* load address */ - finsh_code_byte(FINSH_OP_LD_DWORD); - } - else - { - /* load value */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD); - } - - finsh_code_dword((long)&(var->value.long_value)); - break; - } - } - } - } - break; - - /* load const */ - case FINSH_NODE_VALUE_CHAR: - finsh_code_byte(FINSH_OP_LD_BYTE); - finsh_code_byte(node->value.char_value); - break; - - case FINSH_NODE_VALUE_INT: - case FINSH_NODE_VALUE_LONG: - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword(node->value.long_value); - break; - - case FINSH_NODE_VALUE_NULL: - case FINSH_NODE_VALUE_STRING: - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword((rt_ubase_t)node->value.ptr); - break; - - /* arithmetic operation */ - case FINSH_NODE_SYS_ADD: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_ADD_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_ADD_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_ADD_DWORD); - break; - - case FINSH_NODE_SYS_SUB: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_SUB_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_SUB_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_SUB_DWORD); - break; - - case FINSH_NODE_SYS_MUL: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_MUL_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_MUL_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_MUL_DWORD); - break; - - case FINSH_NODE_SYS_DIV: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_DIV_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_DIV_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_DIV_DWORD); - break; - - case FINSH_NODE_SYS_MOD: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_MOD_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_MOD_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_MOD_DWORD); - break; - - /* bit operation */ - case FINSH_NODE_SYS_AND: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_AND_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_AND_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_AND_DWORD); - break; - - case FINSH_NODE_SYS_OR: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_OR_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_OR_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_OR_DWORD); - break; - - case FINSH_NODE_SYS_XOR: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_XOR_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_XOR_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_XOR_DWORD); - break; - - case FINSH_NODE_SYS_BITWISE: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_BITWISE_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_BITWISE_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_BITWISE_DWORD); - break; - - case FINSH_NODE_SYS_SHL: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_SHL_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_SHL_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_SHL_DWORD); - break; - - case FINSH_NODE_SYS_SHR: - if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_SHR_BYTE); - else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_SHR_WORD); - else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_SHR_DWORD); - break; - - /* syscall */ - case FINSH_NODE_SYS_FUNC: - { - int parameters; - struct finsh_node* sibling; - - parameters = 0; - if (finsh_node_child(node) != NULL) - { - sibling = finsh_node_sibling(finsh_node_child(node)); - while (sibling != NULL) - { - parameters ++; - sibling = finsh_node_sibling(sibling); - } - - /* load address of function */ - // finsh_code_dword((long)&(node->var->value.ptr)); - - /* syscall parameters */ - finsh_code_byte(FINSH_OP_SYSCALL); - finsh_code_byte(parameters); - } - } - break; - - /* assign expression */ - case FINSH_NODE_SYS_ASSIGN: - if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID) - { - switch (finsh_node_child(node)->data_type) - { - case FINSH_DATA_TYPE_BYTE: - finsh_code_byte(FINSH_OP_ST_BYTE); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_BYTE_STACK); - break; - - case FINSH_DATA_TYPE_WORD: - finsh_code_byte(FINSH_OP_ST_WORD); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_WORD_STACK); - break; - - case FINSH_DATA_TYPE_DWORD: - finsh_code_byte(FINSH_OP_ST_DWORD); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK); - break; - - default: - finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE); - } - } - else if (finsh_node_child(node)->node_type == FINSH_NODE_SYS_GETVALUE) - { - switch ((finsh_node_child(node)->data_type) & 0x0F) - { - case FINSH_DATA_TYPE_BYTE: - finsh_code_byte(FINSH_OP_ST_BYTE); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_BYTE_STACK); - break; - - case FINSH_DATA_TYPE_WORD: - finsh_code_byte(FINSH_OP_ST_WORD); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_WORD_STACK); - break; - - case FINSH_DATA_TYPE_DWORD: - finsh_code_byte(FINSH_OP_ST_DWORD); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK); - break; - - default: - finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE); - } - } - break; - - /* pre-increase */ - case FINSH_NODE_SYS_PREINC: - if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID) - { - struct finsh_var* var; - var = finsh_node_child(node)->id.var; - - /* ld_dword &id */ - // finsh_code_byte(FINSH_OP_LD_DWORD); - - switch (node->data_type) - { - case FINSH_DATA_TYPE_BYTE: - /* address */ - // finsh_code_dword((long)&(var->value.char_value)); - - /* ld_value_byte &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_BYTE); - finsh_code_dword((long)&(var->value.char_value)); - - /* ld_byte 1 */ - finsh_code_byte(FINSH_OP_LD_BYTE); - finsh_code_byte(1); - - /* add_byte */ - finsh_code_byte(FINSH_OP_ADD_BYTE); - /* st_byte */ - finsh_code_byte(FINSH_OP_ST_BYTE); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK); - - break; - - case FINSH_DATA_TYPE_WORD: - /* address */ - // finsh_code_dword((long)&(var->value.short_value)); - - /* ld_value_word &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_WORD); - finsh_code_dword((long)&(var->value.short_value)); - - /* ld_word 1 */ - finsh_code_byte(FINSH_OP_LD_WORD); - finsh_code_word(1); - - /* add_word */ - finsh_code_byte(FINSH_OP_ADD_WORD); - /* st_word */ - finsh_code_byte(FINSH_OP_ST_WORD); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK); - - break; - - case FINSH_DATA_TYPE_DWORD: - /* address */ - // finsh_code_dword((long)&(var->value.long_value)); - - /* ld_dword &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD); - finsh_code_dword((long)&(var->value.long_value)); - - /* ld_dword 1 */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword(1); - - /* add_dword */ - finsh_code_byte(FINSH_OP_ADD_DWORD); - /* st_dword */ - finsh_code_byte(FINSH_OP_ST_DWORD); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK); - - break; - } - } - break; - - /* pre-decrease */ - case FINSH_NODE_SYS_PREDEC: - if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID) - { - struct finsh_var* var; - var = finsh_node_child(node)->id.var; - - /* ld_dword &id */ - // finsh_code_byte(FINSH_OP_LD_DWORD); - - switch (node->data_type) - { - case FINSH_DATA_TYPE_BYTE: - /* address */ - // finsh_code_dword((long)&(var->value.char_value)); - - /* ld_value_byte &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_BYTE); - finsh_code_dword((long)&(var->value.char_value)); - - /* ld_byte 1 */ - finsh_code_byte(FINSH_OP_LD_BYTE); - finsh_code_byte(1); - - /* add_byte */ - finsh_code_byte(FINSH_OP_SUB_BYTE); - /* st_byte */ - finsh_code_byte(FINSH_OP_ST_BYTE); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK); - - break; - - case FINSH_DATA_TYPE_WORD: - /* address */ - // finsh_code_dword((long)&(var->value.short_value)); - - /* ld_value_word &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_WORD); - finsh_code_dword((long)&(var->value.short_value)); - - /* ld_word 1 */ - finsh_code_byte(FINSH_OP_LD_WORD); - finsh_code_word(1); - - /* add_word */ - finsh_code_byte(FINSH_OP_SUB_WORD); - /* st_word */ - finsh_code_byte(FINSH_OP_ST_WORD); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK); - - break; - - case FINSH_DATA_TYPE_DWORD: - /* address */ - // finsh_code_dword((long)&(var->value.long_value)); - - /* ld_dword &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD); - finsh_code_dword((long)&(var->value.long_value)); - - /* ld_dword 1 */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword(1); - - /* add_dword */ - finsh_code_byte(FINSH_OP_SUB_DWORD); - /* st_dword */ - finsh_code_byte(FINSH_OP_ST_DWORD); - - /* load value again */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK); - - break; - } - } - break; - - /* increase */ - case FINSH_NODE_SYS_INC: - if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID) - { - struct finsh_var* var; - var = finsh_node_child(node)->id.var; - - switch (node->data_type) - { - case FINSH_DATA_TYPE_BYTE: - /* ld_value_byte &id */ - // finsh_code_byte(FINSH_OP_LD_VALUE_BYTE); - // finsh_code_dword((long)&(var->value.char_value)); - - /* ld_dword &id */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword((long)&(var->value.char_value)); - - /* ld_value_byte &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_BYTE); - finsh_code_dword((long)&(var->value.char_value)); - - /* ld_byte 1 */ - finsh_code_byte(FINSH_OP_LD_BYTE); - finsh_code_byte(1); - - /* add_byte */ - finsh_code_byte(FINSH_OP_ADD_BYTE); - /* get byte */ - finsh_code_byte(FINSH_OP_ST_BYTE); - - /* pop */ - finsh_code_byte(FINSH_OP_POP); - break; - - case FINSH_DATA_TYPE_WORD: - /* ld_value_word &id */ - // finsh_code_byte(FINSH_OP_LD_VALUE_WORD); - // finsh_code_dword((long)&(var->value.short_value)); - - /* ld_dword &id */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword((long)&(var->value.short_value)); - - /* ld_value_word &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_WORD); - finsh_code_dword((long)&(var->value.short_value)); - - /* ld_word 1 */ - finsh_code_byte(FINSH_OP_LD_WORD); - finsh_code_word(1); - - /* add_byte */ - finsh_code_byte(FINSH_OP_ADD_WORD); - /* get byte */ - finsh_code_byte(FINSH_OP_ST_WORD); - - /* pop */ - finsh_code_byte(FINSH_OP_POP); - break; - - case FINSH_DATA_TYPE_DWORD: - /* ld_value_dword &id */ - // finsh_code_byte(FINSH_OP_LD_VALUE_DWORD); - // finsh_code_dword((long)&(var->value.long_value)); - - /* ld_dword &id */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword((long)&(var->value.long_value)); - - /* ld_value_dword &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD); - finsh_code_dword((long)&(var->value.long_value)); - - /* ld_dword 1 */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword(1); - - /* add_byte */ - finsh_code_byte(FINSH_OP_ADD_DWORD); - /* get byte */ - finsh_code_byte(FINSH_OP_ST_DWORD); - - /* pop */ - finsh_code_byte(FINSH_OP_POP); - break; - } - } - break; - - /* decrease */ - case FINSH_NODE_SYS_DEC: - if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID) - { - struct finsh_var* var; - var = finsh_node_child(node)->id.var; - - switch (node->data_type) - { - case FINSH_DATA_TYPE_BYTE: - /* ld_value_byte &id */ - // finsh_code_byte(FINSH_OP_LD_VALUE_BYTE); - // finsh_code_dword((long)&(var->value.char_value)); - - /* ld_dword &id */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword((long)&(var->value.char_value)); - - /* ld_value_byte &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_BYTE); - finsh_code_dword((long)&(var->value.char_value)); - - /* ld_byte 1 */ - finsh_code_byte(FINSH_OP_LD_BYTE); - finsh_code_byte(1); - - /* add_byte */ - finsh_code_byte(FINSH_OP_SUB_BYTE); - /* get byte */ - finsh_code_byte(FINSH_OP_ST_BYTE); - - /* pop */ - finsh_code_byte(FINSH_OP_POP); - break; - - case FINSH_DATA_TYPE_WORD: - /* ld_value_word &id */ - // finsh_code_byte(FINSH_OP_LD_VALUE_WORD); - // finsh_code_dword((long)&(var->value.short_value)); - - /* ld_dword &id */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword((long)&(var->value.short_value)); - - /* ld_value_word &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_WORD); - finsh_code_dword((long)&(var->value.short_value)); - - /* ld_word 1 */ - finsh_code_byte(FINSH_OP_LD_WORD); - finsh_code_word(1); - - /* add_byte */ - finsh_code_byte(FINSH_OP_SUB_WORD); - /* get byte */ - finsh_code_byte(FINSH_OP_ST_WORD); - - /* pop */ - finsh_code_byte(FINSH_OP_POP); - break; - - case FINSH_DATA_TYPE_DWORD: - /* ld_value_dword &id */ - // finsh_code_byte(FINSH_OP_LD_VALUE_DWORD); - // finsh_code_dword((long)&(var->value.long_value)); - - /* ld_dword &id */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword((long)&(var->value.long_value)); - - /* ld_value_dword &id */ - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD); - finsh_code_dword((long)&(var->value.long_value)); - - /* ld_dword 1 */ - finsh_code_byte(FINSH_OP_LD_DWORD); - finsh_code_dword(1); - - /* add_byte */ - finsh_code_byte(FINSH_OP_SUB_DWORD); - /* get byte */ - finsh_code_byte(FINSH_OP_ST_DWORD); - - /* pop */ - finsh_code_byte(FINSH_OP_POP); - break; - } - } - break; - - case FINSH_NODE_SYS_NULL: - finsh_code_dword(0); - break; - - case FINSH_NODE_SYS_GETVALUE: - if (node->idtype & FINSH_IDTYPE_ADDRESS) - { - /* nothing will be generated */ - } - else - { - switch (node->data_type) - { - case FINSH_DATA_TYPE_BYTE: - finsh_code_byte(FINSH_OP_LD_VALUE_BYTE_STACK); - break; - case FINSH_DATA_TYPE_WORD: - finsh_code_byte(FINSH_OP_LD_VALUE_WORD_STACK); - break; - case FINSH_DATA_TYPE_DWORD: - finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK); - break; - default: - break; - } - } - break; - - case FINSH_NODE_SYS_GETADDR: - /* nothing will be generated */ - break; - - default: - finsh_error_set(FINSH_ERROR_UNKNOWN_NODE); - break; - } - - /* compile sibling node */ - if (finsh_node_sibling(node) != NULL) - finsh_compile(finsh_node_sibling(node)); - } - - return 0; -} - -static int finsh_type_check(struct finsh_node* node, uint8_t is_addr) -{ - if (node != NULL) - { - /* address & value */ - if (node->node_type == FINSH_NODE_SYS_ASSIGN || - node->node_type == FINSH_NODE_SYS_PREINC || - node->node_type == FINSH_NODE_SYS_PREDEC || - node->node_type == FINSH_NODE_SYS_GETADDR) - { - /* address */ - finsh_type_check(finsh_node_child(node), FINSH_IDTYPE_ADDRESS); - } - else if (node->node_type == FINSH_NODE_SYS_GETVALUE && is_addr) - { - /* change the attribute of getvalue in left expr */ - finsh_type_check(finsh_node_child(node), 0); - } - else - { - /* transfer 'av' to child node */ - finsh_type_check(finsh_node_child(node), is_addr); - } - - /* always does not load address in sibling */ - finsh_type_check(finsh_node_sibling(node), FINSH_NODE_VALUE); - - /** set attribute of current node */ - - /* make sure the current node is address or value */ - if (node->idtype != FINSH_IDTYPE_SYSCALL) node->idtype |= is_addr; - - if (finsh_node_child(node) != NULL) - { - node->data_type = finsh_node_child(node)->data_type; - return 0; - } - - if (node->node_type == FINSH_NODE_ID) - { - if (node->idtype & FINSH_IDTYPE_VAR) - { - struct finsh_var* var; - - var = node->id.var; - if (var != NULL) - { - switch (var->type) - { - case finsh_type_void: - node->data_type = FINSH_DATA_TYPE_VOID; - break; - - case finsh_type_char: - case finsh_type_uchar: - node->data_type = FINSH_DATA_TYPE_BYTE; - break; - - case finsh_type_short: - case finsh_type_ushort: - node->data_type = FINSH_DATA_TYPE_WORD; - break; - - case finsh_type_int: - case finsh_type_uint: - case finsh_type_long: - case finsh_type_ulong: - node->data_type = FINSH_DATA_TYPE_DWORD; - break; - - case finsh_type_charp: - case finsh_type_voidp: - case finsh_type_shortp: - case finsh_type_intp: - case finsh_type_longp: - node->data_type = FINSH_DATA_TYPE_DWORD; - break; - - default: - finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE); - break; - } - } - } - else if (node->idtype & FINSH_IDTYPE_SYSVAR) - { - struct finsh_sysvar *sysvar; - - sysvar = node->id.sysvar; - if (sysvar != NULL) - { - switch (sysvar->type) - { - case finsh_type_void: - node->data_type = FINSH_DATA_TYPE_VOID; - break; - - case finsh_type_char: - case finsh_type_uchar: - node->data_type = FINSH_DATA_TYPE_BYTE; - break; - - case finsh_type_short: - case finsh_type_ushort: - node->data_type = FINSH_DATA_TYPE_WORD; - break; - - case finsh_type_int: - case finsh_type_uint: - case finsh_type_long: - case finsh_type_ulong: - node->data_type = FINSH_DATA_TYPE_DWORD; - break; - - case finsh_type_charp: - case finsh_type_voidp: - case finsh_type_shortp: - case finsh_type_intp: - case finsh_type_longp: - node->data_type = FINSH_DATA_TYPE_DWORD; - break; - - default: - finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE); - break; - } - } - } - } - else if (node->node_type == FINSH_NODE_VALUE_CHAR) - { - node->data_type = FINSH_DATA_TYPE_BYTE; - } - else if (node->node_type == FINSH_NODE_VALUE_INT || - node->node_type == FINSH_NODE_VALUE_LONG || - node->node_type == FINSH_NODE_VALUE_STRING || - node->node_type == FINSH_NODE_VALUE_NULL) - { - node->data_type = FINSH_DATA_TYPE_DWORD; - } - } - return 0; -} - -int finsh_compiler_run(struct finsh_node* node) -{ - struct finsh_node* sibling; - - /* type check */ - finsh_type_check(node, FINSH_NODE_VALUE); - - /* clean text segment and vm stack */ - memset(&text_segment[0], 0, sizeof(text_segment)); - memset(&finsh_vm_stack[0], 0, sizeof(finsh_vm_stack)); - - /* reset compile stack pointer and pc */ - finsh_compile_sp = &finsh_vm_stack[0]; - finsh_compile_pc = &text_segment[0]; - - /* compile node */ - sibling = node; - while (sibling != NULL) - { - struct finsh_node* current_node; - current_node = sibling; - - /* get sibling node */ - sibling = current_node->sibling; - - /* clean sibling node */ - current_node->sibling = NULL; - finsh_compile(current_node); - - /* pop current value */ - if (sibling != NULL) finsh_code_byte(FINSH_OP_POP); - } - - return 0; -} diff --git a/components/finsh/finsh_error.c b/components/finsh/finsh_error.c deleted file mode 100644 index a5cf2eb514..0000000000 --- a/components/finsh/finsh_error.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#include "finsh_error.h" - -uint8_t global_errno; - -static const char * finsh_error_string_table[] = -{ - "No error", - "Invalid token", - "Expect a type", - "Unknown type", - "Variable exist", - "Expect a operater", - "Memory full", - "Unknown operator", - "Unknown node", - "Expect a character", - "Unexpect end", - "Unknown token", - "Float not supported", - "Unknown symbol", - "Null node" -}; - -int finsh_error_init() -{ - global_errno = FINSH_ERROR_OK; - - return 0; -} - -int finsh_error_set(uint8_t type) -{ - global_errno = type; - - return 0; -} - -uint8_t finsh_errno() -{ - return global_errno; -} - -const char* finsh_error_string(uint8_t type) -{ - return finsh_error_string_table[type]; -} diff --git a/components/finsh/finsh_error.h b/components/finsh/finsh_error.h deleted file mode 100644 index 8dfafd013c..0000000000 --- a/components/finsh/finsh_error.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#ifndef __FINSH_ERROR_H__ -#define __FINSH_ERROR_H__ - -#include - -int finsh_error_init(void); - -/* get error number */ -uint8_t finsh_errno(void); - -int finsh_error_set(uint8_t type); -const char* finsh_error_string(uint8_t type); - -#endif diff --git a/components/finsh/finsh_heap.c b/components/finsh/finsh_heap.c deleted file mode 100644 index 9f64d108dd..0000000000 --- a/components/finsh/finsh_heap.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#include - -#include "finsh_var.h" - -ALIGN(RT_ALIGN_SIZE) -uint8_t finsh_heap[FINSH_HEAP_MAX]; -struct finsh_block_header -{ - uint32_t length; - struct finsh_block_header* next; -}; -#define BLOCK_HEADER(x) (struct finsh_block_header*)(x) -#define finsh_block_get_header(data) (struct finsh_block_header*)((uint8_t*)data - sizeof(struct finsh_block_header)) -#define finsh_block_get_data(header) (uint8_t*)((struct finsh_block_header*)header + 1) -#define HEAP_ALIGN_SIZE(size) (((size) + HEAP_ALIGNMENT - 1) & ~(HEAP_ALIGNMENT-1)) - -static struct finsh_block_header* free_list; -static struct finsh_block_header* allocate_list; - -static void finsh_heap_gc(void); - -static void finsh_block_insert(struct finsh_block_header** list, struct finsh_block_header* header); -static void finsh_block_remove(struct finsh_block_header** list, struct finsh_block_header* header); -static void finsh_block_split(struct finsh_block_header* header, size_t size); -static void finsh_block_merge(struct finsh_block_header** list, struct finsh_block_header* header); - -int finsh_heap_init(void) -{ - /* clear heap to zero */ - memset(&finsh_heap[0], 0, sizeof(finsh_heap)); - - /* init free and alloc list */ - free_list = BLOCK_HEADER(&finsh_heap[0]); - free_list->length = FINSH_HEAP_MAX - sizeof(struct finsh_block_header); - free_list->next = NULL; - - allocate_list = NULL; - - return 0; -} - -/** - * allocate a block from heap - */ -void* finsh_heap_allocate(size_t size) -{ - struct finsh_block_header* header; - - size = HEAP_ALIGN_SIZE(size); - - /* find the first fit block */ - for (header = free_list; - ((header != NULL) && (header->length <= size + sizeof(struct finsh_block_header))); - header = header->next) ; - - if (header == NULL) - { - finsh_heap_gc(); - - /* find the first fit block */ - for (header = free_list; - ((header != NULL) && (header->length < size + sizeof(struct finsh_block_header))); - header = header->next) ; - - /* there is no memory */ - if (header == NULL) return NULL; - } - - /* split block */ - finsh_block_split(header, size); - - /* remove from free list */ - finsh_block_remove(&free_list, header); - header->next = NULL; - - /* insert to allocate list */ - finsh_block_insert(&allocate_list, header); - - memset(finsh_block_get_data(header), 0, size); - - return finsh_block_get_data(header); -} - -/** - * release the allocated block - */ -void finsh_heap_free(void*ptr) -{ - struct finsh_block_header* header; - - /* get block header */ - header = finsh_block_get_header(ptr); - - /* remove from allocate list */ - finsh_block_remove(&allocate_list, header); - - /* insert to free list */ - finsh_block_insert(&free_list, header); - finsh_block_merge(&free_list, header); -} - -/** - * garbage collector - */ -static void finsh_heap_gc(void) -{ - int i; - struct finsh_block_header *header, *temp; - - temp = NULL; - - /* find the first fit block */ - for (header = allocate_list; header != NULL; ) - { - for (i = 0; i < FINSH_VARIABLE_MAX; i ++) - { - if (global_variable[i].type != finsh_type_unknown) - { - if (global_variable[i].value.ptr == finsh_block_get_data(header)) - break; - } - } - - temp = header; - header = header->next; - - /* this block is an unused block, release it */ - if (i == FINSH_VARIABLE_MAX) - { - finsh_heap_free(finsh_block_get_data(temp)); - } - } -} - -/** - * insert a block to list - */ -void finsh_block_insert(struct finsh_block_header** list, struct finsh_block_header* header) -{ - struct finsh_block_header* node; - - if (*list == NULL) - { - *list = header; - return; - } - - /* find out insert point */ - node = *list; - - if (node > header) - { - /* insert node in the header of list */ - header->next = node; - *list = header; - - return; - } - else - { - for (node = *list; node; node = node->next) - { - if (node->next > header) break; - - if (node->next == NULL) break; - } - } - - /* insert node */ - if (node->next != NULL) header->next = node->next; - node->next = header; -} - -/** - * remove block from list - */ -void finsh_block_remove(struct finsh_block_header** list, struct finsh_block_header* header) -{ - struct finsh_block_header* node; - - node = *list; - if (node == header) - { - /* remove list header */ - *list = header->next; - header->next = NULL; - - return; - } - - for (node = *list; node != NULL; node = node->next) - { - if (node->next == header) - { - node->next = header->next; - break; - } - } -} - -/** - * split block - */ -void finsh_block_split(struct finsh_block_header* header, size_t size) -{ - struct finsh_block_header* next; - - /* - * split header into two node: - * header->next->... - */ - next = BLOCK_HEADER((uint8_t*)header + sizeof(struct finsh_block_header) + size); - next->length = header->length - sizeof(struct finsh_block_header) - size; - header->length = size; - next->next = header->next; - - header->next = next; -} - -void finsh_block_merge(struct finsh_block_header** list, struct finsh_block_header* header) -{ - struct finsh_block_header* prev_node; - struct finsh_block_header* next_node; - - next_node = header->next; - - if (*list == header) prev_node = NULL; - else - { - /* find out the previous header */ - for (prev_node = *list; prev_node; prev_node =prev_node->next) - { - if (prev_node->next == header) - break; - } - } - - /* try merge node */ - - /* merge to previous node */ - if (prev_node != NULL && - ((uint8_t*)prev_node + prev_node->length + sizeof(struct finsh_block_header) - == (uint8_t*)header)) - { - /* is it close to next node? */ - if ((next_node != NULL) && - ((uint8_t*)header + header->length + sizeof(struct finsh_block_header) - == (uint8_t*)next_node)) - { - /* merge three node */ - prev_node->length += header->length + next_node->length + - 2 * sizeof(struct finsh_block_header); - - prev_node->next = next_node->next; - } - else - { - prev_node->length += header->length + sizeof(struct finsh_block_header); - prev_node->next = header->next; - } - } - else /* merge to last node */ - if ( (next_node != NULL) && - ((uint8_t*)header + header->length + sizeof(struct finsh_block_header) - == (uint8_t*)next_node)) - { - header->length += next_node->length + sizeof(struct finsh_block_header); - header->next = next_node->next; - } -} diff --git a/components/finsh/finsh_heap.h b/components/finsh/finsh_heap.h deleted file mode 100644 index f320c2771a..0000000000 --- a/components/finsh/finsh_heap.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#include - -#ifndef __FINSH_HEAP_H__ -#define __FINSH_HEAP_H__ - -int finsh_heap_init(void); -void* finsh_heap_allocate(size_t size); -void finsh_heap_free(void*ptr); - -#endif diff --git a/components/finsh/finsh_init.c b/components/finsh/finsh_init.c deleted file mode 100644 index 76302a0516..0000000000 --- a/components/finsh/finsh_init.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#include - -#include "finsh_node.h" -#include "finsh_vm.h" -#include "finsh_parser.h" -#include "finsh_var.h" -#include "finsh_error.h" -#include "finsh_heap.h" - -int finsh_init(struct finsh_parser* parser) -{ - finsh_parser_init(parser); - - /* finsh init */ - finsh_node_init(); - finsh_var_init(); - finsh_error_init(); - finsh_heap_init(); - - return 0; -} - -long finsh_stack_bottom() -{ - return finsh_vm_stack[0].long_value; -} - -int finsh_flush(struct finsh_parser* parser) -{ - finsh_parser_init(parser); - - /* finsh init */ - finsh_node_init(); - finsh_error_init(); - - return 0; -} - -int finsh_reset(struct finsh_parser* parser) -{ - /* finsh init */ - finsh_node_init(); - finsh_var_init(); - finsh_error_init(); - finsh_heap_init(); - - return 0; -} diff --git a/components/finsh/finsh_node.c b/components/finsh/finsh_node.c deleted file mode 100644 index 82a4c03f1e..0000000000 --- a/components/finsh/finsh_node.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#include - -#include "finsh_node.h" -#include "finsh_error.h" -#include "finsh_var.h" -#include "finsh_heap.h" - -struct finsh_node global_node_table[FINSH_NODE_MAX]; - -int finsh_node_init() -{ - memset(global_node_table, 0, sizeof(global_node_table)); - - return 0; -} - -struct finsh_node* finsh_node_allocate(uint8_t type) -{ - int i; - - /* find an empty entry */ - for (i = 0; i < FINSH_NODE_MAX; i ++) - { - if (global_node_table[i].node_type == FINSH_NODE_UNKNOWN) break; - } - - if (i == FINSH_NODE_MAX) return NULL; - - /* fill type field */ - global_node_table[i].node_type = type; - - /* return this allocated node */ - return &global_node_table[i]; -} - -struct finsh_node* finsh_node_new_id(char* id) -{ - struct finsh_node* node; - void* symbol; - unsigned char type; - - symbol = NULL; - type = 0; - node = NULL; - - /* lookup variable firstly */ - symbol = (void*)finsh_var_lookup(id); - if (symbol == NULL) - { - /* then lookup system variable */ - symbol = (void*)finsh_sysvar_lookup(id); - if (symbol == NULL) - { - /* then lookup system call */ - symbol = (void*)finsh_syscall_lookup(id); - if (symbol != NULL) type = FINSH_IDTYPE_SYSCALL; - } - else type = FINSH_IDTYPE_SYSVAR; - } - else type = FINSH_IDTYPE_VAR; - - if (symbol != NULL) - { - /* allocate a new node */ - node = finsh_node_allocate(FINSH_NODE_ID); - - /* allocate node error */ - if (node == NULL) - { - finsh_error_set(FINSH_ERROR_MEMORY_FULL); - return NULL; - } - - /* fill node value according type */ - switch (type) - { - case FINSH_IDTYPE_VAR: - node->id.var = (struct finsh_var*)symbol; - break; - - case FINSH_IDTYPE_SYSVAR: - node->id.sysvar = (struct finsh_sysvar*)symbol; - break; - - case FINSH_IDTYPE_SYSCALL: - node->id.syscall = (struct finsh_syscall*)symbol; - break; - } - /* fill identifier type */ - node->idtype = type; - } - else finsh_error_set(FINSH_ERROR_UNKNOWN_SYMBOL); - - return node; -} - -struct finsh_node* finsh_node_new_char(char c) -{ - struct finsh_node* node; - - node = finsh_node_allocate(FINSH_NODE_VALUE_CHAR); - if (node == NULL) - { - finsh_error_set(FINSH_ERROR_MEMORY_FULL); - return NULL; - } - - node->value.char_value = c; - return node; -} - -struct finsh_node* finsh_node_new_int(int i) -{ - struct finsh_node* node; - - node = finsh_node_allocate(FINSH_NODE_VALUE_INT); - if (node == NULL) - { - finsh_error_set(FINSH_ERROR_MEMORY_FULL); - return NULL; - } - - node->value.int_value = i; - return node; -} - -struct finsh_node* finsh_node_new_long(long l) -{ - struct finsh_node* node; - - node = finsh_node_allocate(FINSH_NODE_VALUE_LONG); - if (node == NULL) - { - finsh_error_set(FINSH_ERROR_MEMORY_FULL); - return NULL; - } - - node->value.long_value = l; - return node; -} - -struct finsh_node* finsh_node_new_string(char* s) -{ - struct finsh_node* node; - - node = finsh_node_allocate(FINSH_NODE_VALUE_STRING); - if (node == NULL) - { - finsh_error_set(FINSH_ERROR_MEMORY_FULL); - return NULL; - } - - /* make string */ - node->value.ptr = finsh_heap_allocate(strlen(s) + 1); - strncpy(node->value.ptr, s, strlen(s)); - ((uint8_t*)node->value.ptr)[strlen(s)] = '\0'; - - return node; -} - -struct finsh_node* finsh_node_new_ptr(void* ptr) -{ - struct finsh_node* node; - - node = finsh_node_allocate(FINSH_NODE_VALUE_NULL); - if (node == NULL) - { - finsh_error_set(FINSH_ERROR_MEMORY_FULL); - return NULL; - } - - node->value.ptr = ptr; - return node; -} diff --git a/components/finsh/finsh_node.h b/components/finsh/finsh_node.h deleted file mode 100644 index ff4333df13..0000000000 --- a/components/finsh/finsh_node.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#ifndef __FINSH_NODE_H__ -#define __FINSH_NODE_H__ - -#include - -#define FINSH_NODE_UNKNOWN 0 -#define FINSH_NODE_ID 1 - -#define FINSH_NODE_VALUE_CHAR 2 -#define FINSH_NODE_VALUE_INT 3 -#define FINSH_NODE_VALUE_LONG 4 -#define FINSH_NODE_VALUE_STRING 5 -#define FINSH_NODE_VALUE_NULL 6 - -#define FINSH_NODE_SYS_ADD 7 -#define FINSH_NODE_SYS_SUB 8 -#define FINSH_NODE_SYS_MUL 9 -#define FINSH_NODE_SYS_DIV 10 -#define FINSH_NODE_SYS_MOD 11 -#define FINSH_NODE_SYS_AND 12 -#define FINSH_NODE_SYS_OR 13 -#define FINSH_NODE_SYS_XOR 14 -#define FINSH_NODE_SYS_BITWISE 15 -#define FINSH_NODE_SYS_SHL 16 -#define FINSH_NODE_SYS_SHR 17 -#define FINSH_NODE_SYS_FUNC 18 -#define FINSH_NODE_SYS_ASSIGN 19 -#define FINSH_NODE_SYS_CAST 20 -#define FINSH_NODE_SYS_PREINC 21 -#define FINSH_NODE_SYS_PREDEC 22 -#define FINSH_NODE_SYS_INC 23 -#define FINSH_NODE_SYS_DEC 24 -#define FINSH_NODE_SYS_GETVALUE 25 -#define FINSH_NODE_SYS_GETADDR 26 -#define FINSH_NODE_SYS_NULL 27 - -#define FINSH_DATA_TYPE_VOID 0x00 -#define FINSH_DATA_TYPE_BYTE 0x01 -#define FINSH_DATA_TYPE_WORD 0x02 -#define FINSH_DATA_TYPE_DWORD 0x03 -#define FINSH_DATA_TYPE_PTR 0x10 - -#define FINSH_NODE_VALUE 0 -#define FINSH_NODE_ADDRESS 1 -#define FINSH_NODE_FUNCTION 2 - -int finsh_node_init(void); - -struct finsh_node* finsh_node_allocate(uint8_t type); -struct finsh_node* finsh_node_new_id(char* id); -struct finsh_node* finsh_node_new_char(char c); -struct finsh_node* finsh_node_new_int(int i); -struct finsh_node* finsh_node_new_long(long l); -struct finsh_node* finsh_node_new_string(char* s); -struct finsh_node* finsh_node_new_ptr(void* ptr); - -#define finsh_node_sibling(node) ((node)->sibling) -#define finsh_node_child(node) ((node)->child) - -#endif diff --git a/components/finsh/finsh_ops.c b/components/finsh/finsh_ops.c deleted file mode 100644 index ec8b8cb58a..0000000000 --- a/components/finsh/finsh_ops.c +++ /dev/null @@ -1,603 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#include "finsh_ops.h" -#include "finsh_vm.h" - -#define OP_BIN_BYTE(x) do {\ - (finsh_sp - 2)->char_value = (finsh_sp - 2)->char_value x (finsh_sp - 1)->char_value; \ - finsh_sp--; \ - }while (0) - -#define OP_BIN_WORD(x) do {\ - (finsh_sp - 2)->short_value = (finsh_sp - 2)->short_value x (finsh_sp - 1)->short_value; \ - finsh_sp--; \ - }while (0) - -#define OP_BIN_DWORD(x) do {\ - (finsh_sp - 2)->long_value = (finsh_sp - 2)->long_value x (finsh_sp - 1)->long_value; \ - finsh_sp--; \ - }while (0) - -/* --- noop --- */ -void OP_no_op() -{ - /* none */ - return ; -} - -/* --- add --- */ -void OP_add_byte() -{ - OP_BIN_BYTE(+); - - return ; -} - -void OP_add_word() -{ - OP_BIN_WORD(+); - - return ; -} - -void OP_add_dword() -{ - OP_BIN_DWORD(+); - - return ; -} - -/* --- sub --- */ -void OP_sub_byte() -{ - OP_BIN_BYTE(-); - - return ; -} - -void OP_sub_word() -{ - OP_BIN_WORD(-); - - return ; -} - -void OP_sub_dword() -{ - OP_BIN_DWORD(-); - - return ; -} - -/* --- div --- */ -void OP_div_byte() -{ - OP_BIN_BYTE(/); - - return ; -} - -void OP_div_word() -{ - OP_BIN_WORD(/); - - return ; -} - -void OP_div_dword() -{ - OP_BIN_DWORD(/); - - return ; -} - -/* --- mod --- */ -void OP_mod_byte() -{ - OP_BIN_BYTE(%); - - return ; -} - -void OP_mod_word() -{ - OP_BIN_WORD(%); - - return ; -} - -void OP_mod_dword() -{ - OP_BIN_DWORD(%); - - return ; -} - -/* --- mul --- */ -void OP_mul_byte() -{ - OP_BIN_BYTE(*); - - return ; -} - -void OP_mul_word() -{ - OP_BIN_WORD(*); - - return ; -} - -void OP_mul_dword() -{ - OP_BIN_DWORD(*); - - return ; -} - -/* --- and --- */ -void OP_and_byte() -{ - OP_BIN_BYTE(&); - - return ; -} - -void OP_and_word() -{ - OP_BIN_WORD(&); - - return ; -} - -void OP_and_dword() -{ - OP_BIN_DWORD(&); - - return ; -} - -/* --- or --- */ -void OP_or_byte() -{ - OP_BIN_BYTE(|); - - return ; -} - -void OP_or_word() -{ - OP_BIN_WORD(|); - - return ; -} - -void OP_or_dword() -{ - OP_BIN_DWORD(|); - - return ; -} - -/* --- xor --- */ -void OP_xor_byte() -{ - OP_BIN_BYTE(^); - - return ; -} - -void OP_xor_word() -{ - OP_BIN_WORD(^); - - return ; -} - -void OP_xor_dword() -{ - OP_BIN_DWORD(^); - - return ; -} - -/* --- bw --- */ -void OP_bw_byte() -{ - (finsh_sp - 1)->char_value = ~ ((finsh_sp - 1)->char_value); - - return ; -} - -void OP_bw_word() -{ - (finsh_sp - 1)->short_value = ~ ((finsh_sp - 1)->short_value); - - return ; -} - -void OP_bw_dword() -{ - (finsh_sp - 1)->long_value = ~ ((finsh_sp - 1)->long_value); - - return ; -} - -/* --- shl --- */ -void OP_shl_byte() -{ - OP_BIN_BYTE(<<); - - return ; -} - -void OP_shl_word() -{ - OP_BIN_WORD(<<); - - return ; -} - -void OP_shl_dword() -{ - OP_BIN_DWORD(<<); - - return ; -} - -/* --- shr --- */ -void OP_shr_byte() -{ - OP_BIN_BYTE(>>); - - return ; -} - -void OP_shr_word() -{ - OP_BIN_WORD(>>); - - return ; -} - -void OP_shr_dword() -{ - OP_BIN_DWORD(>>); - - return ; -} - -/* --- ld --- */ -void OP_ld_byte() -{ - finsh_sp->char_value = *finsh_pc; - - finsh_sp++; - finsh_pc++; - - return ; -} - -void OP_ld_word() -{ - finsh_sp->short_value = FINSH_GET16(finsh_pc); - - finsh_sp ++; - finsh_pc += 2; - - return ; -} - -void OP_ld_dword() -{ - finsh_sp->long_value = FINSH_GET32(finsh_pc); - - finsh_sp ++; - finsh_pc += 4; - - return ; -} - -void OP_ld_value_byte() -{ - char* c; - - c = (char*) (FINSH_GET32(finsh_pc)); - - finsh_sp->char_value = *c; - - finsh_sp ++; - finsh_pc += 4; - - return; -} - -void OP_ld_value_byte_stack() -{ - char* c; - - c = (char *)(finsh_sp - 1)->long_value; - (finsh_sp - 1)->char_value = *c; - - return; -} - -void OP_ld_value_word() -{ - short* s; - - s = (short*) (FINSH_GET32(finsh_pc)); - - finsh_sp->short_value = *s; - - finsh_sp ++; - finsh_pc += 4; - - return; -} - -void OP_ld_value_word_stack() -{ - short* s; - - s = (short *)(finsh_sp - 1)->long_value; - (finsh_sp - 1)->short_value = *s; - - return; -} - -void OP_ld_value_dword() -{ - long* l; - - l = (long*) (FINSH_GET32(finsh_pc)); - - finsh_sp->long_value = *l; - - finsh_sp ++; - finsh_pc += 4; - - return; -} - -void OP_ld_value_dword_stack() -{ - long* l; - - l = (long *)(finsh_sp - 1)->long_value; - (finsh_sp - 1)->long_value = *l; - - return; -} - -/* --- st --- */ -/* - * 2006-4-16 bernard - * fixed the sp move bug - */ -void OP_st_byte() -{ - *(char*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->char_value; - finsh_sp --; - - return ; -} - -/* - * 2006-4-16 bernard - * fixed the sp move bug - */ -void OP_st_word() -{ - *(short*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->short_value; - finsh_sp --; - - return ; -} - -/* - * 2006-4-16 bernard - * fixed the sp move bug - */ -void OP_st_dword() -{ - *(long*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->long_value; - finsh_sp --; - - return ; -} - -/* --- pop --- */ -void OP_pop() -{ - finsh_sp --; - return ; -} - -/* --- call --- */ -void OP_call() -{ - /* the max number of arg*/ - unsigned long parameterv[16]; - unsigned int parameters, i; - - typedef unsigned long var_t; - typedef var_t (*op_func)(); - op_func f; - var_t r; - - parameters = *finsh_pc ++; - - i = 0; finsh_sp --; - while (i < parameters) - { - parameterv[parameters - 1 - i] = finsh_sp->long_value; - finsh_sp --; - i++; - } - - f = (op_func)(finsh_sp->long_value); - switch (parameters) - { - case 0: - r = f(0); - break; - - case 1: - r = f(parameterv[0]); - break; - - case 2: - r = f(parameterv[0], parameterv[1]); - break; - - case 3: - r = f(parameterv[0], parameterv[1], parameterv[2]); - break; - - case 4: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3]); - break; - - case 5: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4]); - break; - - case 6: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5]); - break; - - case 7: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6]); - break; - - case 8: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6], parameterv[7]); - break; - - case 9: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6], parameterv[7], - parameterv[8]); - break; - - case 10: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6], parameterv[7], - parameterv[8], parameterv[9]); - break; - - case 11: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6], parameterv[7], - parameterv[8], parameterv[9], parameterv[10]); - break; - - case 12: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6], parameterv[7], - parameterv[8], parameterv[9], parameterv[10], parameterv[11]); - break; - - case 13: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6], parameterv[7], - parameterv[8], parameterv[9], parameterv[10], parameterv[11], - parameterv[12]); - break; - - case 14: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6], parameterv[7], - parameterv[8], parameterv[9], parameterv[10], parameterv[11], - parameterv[12], parameterv[13]); - break; - - case 15: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6], parameterv[7], - parameterv[8], parameterv[9], parameterv[10], parameterv[11], - parameterv[12], parameterv[13], parameterv[14]); - break; - - case 16: - r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3], - parameterv[4], parameterv[5], parameterv[6], parameterv[7], - parameterv[8], parameterv[9], parameterv[10], parameterv[11], - parameterv[12], parameterv[13], parameterv[14], parameterv[15]); - break; - - default: - r = 0; - break; - } - - finsh_sp->long_value = r; - finsh_sp ++; - - return ; -} - -const op_func op_table[] = -{ - /* 00 */ OP_no_op, - /* 01 */ OP_add_byte, - /* 02 */ OP_add_word, - /* 03 */ OP_add_dword, - /* 04 */ OP_sub_byte, - /* 05 */ OP_sub_word, - /* 06 */ OP_sub_dword, - /* 07 */ OP_div_byte, - /* 08 */ OP_div_word, - /* 09 */ OP_div_dword, - /* 10 */ OP_mod_byte, - /* 11 */ OP_mod_word, - /* 12 */ OP_mod_dword, - /* 13 */ OP_mul_byte, - /* 14 */ OP_mul_word, - /* 15 */ OP_mul_dword, - /* 16 */ OP_and_byte, - /* 17 */ OP_and_word, - /* 18 */ OP_and_dword, - /* 19 */ OP_or_byte, - /* 20 */ OP_or_word, - /* 21 */ OP_or_dword, - /* 22 */ OP_xor_byte, - /* 23 */ OP_xor_word, - /* 24 */ OP_xor_dword, - /* 25 */ OP_bw_byte, - /* 26 */ OP_bw_word, - /* 27 */ OP_bw_dword, - /* 28 */ OP_shl_byte, - /* 29 */ OP_shl_word, - /* 30 */ OP_shl_dword, - /* 31 */ OP_shr_byte, - /* 32 */ OP_shr_word, - /* 33 */ OP_shr_dword, - /* 34 */ OP_ld_byte, - /* 35 */ OP_ld_word, - /* 36 */ OP_ld_dword, - /* 37 */ OP_ld_value_byte, - /* 38 */ OP_ld_value_word, - /* 39 */ OP_ld_value_dword, - /* 40 */ OP_st_byte, - /* 41 */ OP_st_word, - /* 42 */ OP_st_dword, - /* 43 */ OP_pop, - /* 44 */ OP_call, - /* 45 */ OP_ld_value_byte_stack, - /* 46 */ OP_ld_value_word_stack, - /* 47 */ OP_ld_value_dword_stack, - NULL -}; diff --git a/components/finsh/finsh_ops.h b/components/finsh/finsh_ops.h deleted file mode 100644 index 0cc945f078..0000000000 --- a/components/finsh/finsh_ops.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#ifndef __FINSH_OP_H__ -#define __FINSH_OP_H__ - -#include "finsh_vm.h" - -/* - * FinC VM specification - * Memory - * .VAR - * - * .STACK - * - * .HEAP - * - * .TEXT - * OP [op1] - */ - -#define FINSH_OP_NOOP 0x00 - -/* add @ r1 = r2 + r3 */ -#define FINSH_OP_ADD_BYTE 0x01 -#define FINSH_OP_ADD_WORD 0x02 -#define FINSH_OP_ADD_DWORD 0x03 - -/* sub @ r1 = r2 - r3 */ -#define FINSH_OP_SUB_BYTE 0x04 -#define FINSH_OP_SUB_WORD 0x05 -#define FINSH_OP_SUB_DWORD 0x06 - -/* div @ r1 = r2 / r3 */ -#define FINSH_OP_DIV_BYTE 0x07 -#define FINSH_OP_DIV_WORD 0x08 -#define FINSH_OP_DIV_DWORD 0x09 - -/* mod @ r1 = r2 % r3 */ -#define FINSH_OP_MOD_BYTE 0x0A -#define FINSH_OP_MOD_WORD 0x0B -#define FINSH_OP_MOD_DWORD 0x0C - -/* mul @ r1 = r2 * r3 */ -#define FINSH_OP_MUL_BYTE 0x0D -#define FINSH_OP_MUL_WORD 0x0E -#define FINSH_OP_MUL_DWORD 0x0F - -/* and @ r1 = r2 & r3 */ -#define FINSH_OP_AND_BYTE 0x10 -#define FINSH_OP_AND_WORD 0x11 -#define FINSH_OP_AND_DWORD 0x12 - -/* or @ r1 = r2 | r3 */ -#define FINSH_OP_OR_BYTE 0x13 -#define FINSH_OP_OR_WORD 0x14 -#define FINSH_OP_OR_DWORD 0x15 - -/* xor @ r1 = r2 ^ r3 */ -#define FINSH_OP_XOR_BYTE 0x16 -#define FINSH_OP_XOR_WORD 0x17 -#define FINSH_OP_XOR_DWORD 0x18 - -/* bw @ r1 = ~r2 */ -#define FINSH_OP_BITWISE_BYTE 0x19 -#define FINSH_OP_BITWISE_WORD 0x1A -#define FINSH_OP_BITWISE_DWORD 0x1B - -/* shl @ r1 = r2 << r3 */ -#define FINSH_OP_SHL_BYTE 0x1C -#define FINSH_OP_SHL_WORD 0x1D -#define FINSH_OP_SHL_DWORD 0x1E - -/* shr @ r1 = r2 >> r3 */ -#define FINSH_OP_SHR_BYTE 0x1F -#define FINSH_OP_SHR_WORD 0x20 -#define FINSH_OP_SHR_DWORD 0x21 - -/* ld @ r1 = [r2] */ -#define FINSH_OP_LD_BYTE 0x22 -#define FINSH_OP_LD_WORD 0x23 -#define FINSH_OP_LD_DWORD 0x24 - -#define FINSH_OP_LD_VALUE_BYTE 0x25 -#define FINSH_OP_LD_VALUE_WORD 0x26 -#define FINSH_OP_LD_VALUE_DWORD 0x27 - -/* st @ [r2] = r1 */ -#define FINSH_OP_ST_BYTE 0x28 -#define FINSH_OP_ST_WORD 0x29 -#define FINSH_OP_ST_DWORD 0x2A - -/* pop */ -#define FINSH_OP_POP 0x2B - -/* call r1 @ [r1](stack) */ -#define FINSH_OP_SYSCALL 0x2C - -/* load value from stack */ -#define FINSH_OP_LD_VALUE_BYTE_STACK 0x2D -#define FINSH_OP_LD_VALUE_WORD_STACK 0x2E -#define FINSH_OP_LD_VALUE_DWORD_STACK 0x2F - -/* halt */ -#define FINSH_OP_HALT 0xFF - -typedef void (*op_func)(); -extern const op_func op_table[]; - -#endif diff --git a/components/finsh/finsh_parser.c b/components/finsh/finsh_parser.c deleted file mode 100644 index 4b8b4af7e4..0000000000 --- a/components/finsh/finsh_parser.c +++ /dev/null @@ -1,986 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - * 2013-10-09 Bernard fix the command line too long issue. - */ -#include - -#include "finsh_token.h" -#include "finsh_node.h" -#include "finsh_error.h" -#include "finsh_parser.h" -#include "finsh_var.h" - -/* - * the structure of abstract syntax tree: - * root____________ - * | \ - * child__ sibling__ - * | \ | \ - * child sibling child sibling - * ... - */ -static enum finsh_type proc_type(struct finsh_parser* self); -static int proc_identifier(struct finsh_parser* self, char* id); -static struct finsh_node* proc_variable_decl(struct finsh_parser* self); -static struct finsh_node* proc_expr(struct finsh_parser* self); -static struct finsh_node* proc_assign_expr(struct finsh_parser* self); -static struct finsh_node* proc_inclusive_or_expr(struct finsh_parser* self); -static struct finsh_node* proc_exclusive_or_expr(struct finsh_parser* self); -static struct finsh_node* proc_and_expr(struct finsh_parser* self); -static struct finsh_node* proc_shift_expr(struct finsh_parser* self); -static struct finsh_node* proc_additive_expr(struct finsh_parser* self); -static struct finsh_node* proc_multiplicative_expr(struct finsh_parser* self); -static struct finsh_node* proc_cast_expr(struct finsh_parser* self); -static struct finsh_node* proc_unary_expr(struct finsh_parser* self); -static struct finsh_node* proc_postfix_expr(struct finsh_parser* self); -static struct finsh_node* proc_primary_expr(struct finsh_parser* self); -static struct finsh_node* proc_param_list(struct finsh_parser* self); -static struct finsh_node* proc_expr_statement(struct finsh_parser* self); -static struct finsh_node* make_sys_node(uint8_t type, struct finsh_node* node1, - struct finsh_node* node2); - -/* check token */ -#define check_token(token, lex, type) if ( (token) != (type) ) \ - { \ - finsh_error_set(FINSH_ERROR_INVALID_TOKEN); \ - finsh_token_replay(lex); \ - } - -/* is the token a data type? */ -#define is_base_type(token) ((token) == finsh_token_type_void \ - || (token) == finsh_token_type_char \ - || (token) == finsh_token_type_short \ - || (token) == finsh_token_type_int \ - || (token) == finsh_token_type_long) - -/* get the next token */ -#define next_token(token, lex) (token) = finsh_token_token(lex) - -/* match a specified token */ -#define match_token(token, lex, type) next_token(token, lex); \ - check_token(token, lex, type) - -/* -process for function and variable declaration. -decl_variable -> type declaration_list ';' -declarator_list -> declarator_list ',' declarator - | declarator -declarator -> identifier - | identifier ASSIGN expr_assign -*/ -static struct finsh_node* proc_variable_decl(struct finsh_parser* self) -{ - enum finsh_token_type token; - enum finsh_type type; - char id[FINSH_NAME_MAX + 1]; - - struct finsh_node *node; - struct finsh_node *end; - struct finsh_node *assign; - - node = NULL; - end = NULL; - - /* get type */ - type = proc_type(self); - - /*process id.*/ - if (proc_identifier(self, id) == 0) - { - /* if add variable failed */ - if (finsh_var_insert(id, type) < 0) - { - finsh_error_set(FINSH_ERROR_VARIABLE_EXIST); - } - } - - next_token(token, &(self->token)); - switch ( token ) - { - case finsh_token_type_comma:/*',', it's a variable_list declaration.*/ - if (proc_identifier(self, id) == 0) - { - /* if add variable failed */ - if (finsh_var_insert(id, type) < 0) - { - finsh_error_set(FINSH_ERROR_VARIABLE_EXIST); - } - } - - next_token(token, &(self->token)); - if ( token == finsh_token_type_assign ) - { - /* get the right side of assign expression */ - assign = proc_assign_expr(self); - - if (assign != NULL) - { - struct finsh_node* idnode; - - idnode = finsh_node_new_id(id); - end = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign); - node = end; - - next_token(token, &(self->token)); - } - } - - while ( token == finsh_token_type_comma ) - { - if (proc_identifier(self, id) == 0) - { - /* if add variable failed */ - if (finsh_var_insert(id, type) < 0) - { - finsh_error_set(FINSH_ERROR_VARIABLE_EXIST); - } - } - - next_token(token, &(self->token)); - if ( token == finsh_token_type_assign ) - { - /* get the right side of assign expression */ - assign = proc_assign_expr(self); - - if (assign != NULL) - { - struct finsh_node* idnode; - - idnode = finsh_node_new_id(id); - - /* make assign expression node */ - if (node != NULL) - { - finsh_node_sibling(end) = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign); - end = finsh_node_sibling(end); - } - else - { - end = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign); - node = end; - } - - next_token(token, &(self->token)); - } - } - } - - check_token(token, &(self->token), finsh_token_type_semicolon); - return node; - - case finsh_token_type_assign:/*'=', it's a variable with assign declaration.*/ - { - struct finsh_node *idnode; - - assign = proc_assign_expr(self); - if (assign != NULL) - { - idnode = finsh_node_new_id(id); - - /* make assign expression node */ - end = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign); - node = end; - - next_token(token, &(self->token)); - } - - while ( token == finsh_token_type_comma ) - { - if (proc_identifier(self, id) == 0) - { - /* if add variable failed */ - if (finsh_var_insert(id, type) < 0) - { - finsh_error_set(FINSH_ERROR_VARIABLE_EXIST); - } - } - - next_token(token, &(self->token)); - if (token == finsh_token_type_assign) - { - /* get the right side of assign expression */ - assign = proc_assign_expr(self); - - if (assign != NULL) - { - idnode = finsh_node_new_id(id); - - /* make assign expression node */ - if (node != NULL) - { - finsh_node_sibling(end) = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign); - end = finsh_node_sibling(end); - } - else - { - end = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign); - node = end; - } - - next_token(token, &(self->token)); - } - } - } - - check_token(token, &(self->token), finsh_token_type_semicolon); - return node; - } - - case finsh_token_type_semicolon:/*';', it's a variable declaration.*/ - return node; - - default: - finsh_error_set(FINSH_ERROR_EXPECT_TYPE); - - return NULL; - } -} - -/* -type -> type_prefix type_basic | type_basic -type_prefix -> UNSIGNED -type_basic -> VOID - | CHAR - | SHORT - | INT - | STRING -*/ -static enum finsh_type proc_type(struct finsh_parser* self) -{ - enum finsh_type type; - enum finsh_token_type token; - - /* set init type */ - type = finsh_type_unknown; - - next_token(token, &(self->token)); - if ( is_base_type(token) ) /* base_type */ - { - switch (token) - { - case finsh_token_type_void: - type = finsh_type_void; - break; - - case finsh_token_type_char: - type = finsh_type_char; - break; - - case finsh_token_type_short: - type = finsh_type_short; - break; - - case finsh_token_type_int: - type = finsh_type_int; - break; - - case finsh_token_type_long: - type = finsh_type_long; - break; - - default: - goto __return; - } - } - else if ( token == finsh_token_type_unsigned ) /* unsigned base_type */ - { - next_token(token, &(self->token)); - if ( is_base_type(token) ) - { - switch (token) - { - case finsh_token_type_char: - type = finsh_type_uchar; - break; - - case finsh_token_type_short: - type = finsh_type_ushort; - break; - - case finsh_token_type_int: - type = finsh_type_uint; - break; - - case finsh_token_type_long: - type = finsh_type_ulong; - break; - - default: - goto __return; - } - } - else - { - finsh_token_replay(&(self->token)); - finsh_error_set(FINSH_ERROR_EXPECT_TYPE); - } - } - else - { - goto __return; - } - - /* parse for pointer */ - next_token(token, &(self->token)); - if (token == finsh_token_type_mul) - { - switch (type) - { - case finsh_type_void: - type = finsh_type_voidp; - break; - - case finsh_type_char: - case finsh_type_uchar: - type = finsh_type_charp; - break; - - case finsh_type_short: - case finsh_type_ushort: - type = finsh_type_shortp; - break; - - case finsh_type_int: - case finsh_type_uint: - type = finsh_type_intp; - break; - - case finsh_type_long: - case finsh_type_ulong: - type = finsh_type_longp; - break; - - default: - type = finsh_type_voidp; - break; - } - } - else finsh_token_replay(&(self->token)); - - return type; - -__return: - finsh_token_replay(&(self->token)); - finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE); - - return type; -} - -/* -identifier -> IDENTIFIER -*/ -static int proc_identifier(struct finsh_parser* self, char* id) -{ - enum finsh_token_type token; - - match_token(token, &(self->token), finsh_token_type_identifier); - - strncpy(id, (char*)self->token.string, FINSH_NAME_MAX); - - return 0; -} - -/* -statement_expr -> ';' - | expr ';' -*/ -static struct finsh_node* proc_expr_statement(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* expr; - - expr = NULL; - next_token(token, &(self->token)); - if ( token != finsh_token_type_semicolon ) - { - finsh_token_replay(&(self->token)); - expr = proc_expr(self); - - match_token(token, &(self->token), finsh_token_type_semicolon); - } - - return expr; -} - -/* -expr -> expr_assign -*/ -static struct finsh_node* proc_expr(struct finsh_parser* self) -{ - return proc_assign_expr(self); -} - -/* -expr_assign -> expr_inclusive_or - | expr_unary ASSIGN expr_assign -*/ -static struct finsh_node* proc_assign_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* or; - struct finsh_node* assign; - - or = proc_inclusive_or_expr(self); - - next_token(token, &(self->token)); - - if (token == finsh_token_type_assign) - { - assign = proc_assign_expr(self); - - return make_sys_node(FINSH_NODE_SYS_ASSIGN, or, assign); - } - else finsh_token_replay(&(self->token)); - - return or; -} - -/* -expr_inclusive_or -> expr_exclusive_or - | expr_inclusive_or '|' expr_exclusive_or -*/ -static struct finsh_node* proc_inclusive_or_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* xor; - struct finsh_node* xor_new; - - xor = proc_exclusive_or_expr(self); - - next_token(token, &(self->token)); - while ( token == finsh_token_type_or ) - { - xor_new = proc_exclusive_or_expr(self); - - if (xor_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - else xor = make_sys_node(FINSH_NODE_SYS_OR, xor, xor_new); - - next_token(token, &(self->token)); - } - - finsh_token_replay(&(self->token)); - return xor; -} - -/* -expr_exclusive_or -> expr_and - | expr_exclusive '^' expr_and -*/ -static struct finsh_node* proc_exclusive_or_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* and; - struct finsh_node* and_new; - - and = proc_and_expr(self); - next_token(token, &(self->token)); - while ( token == finsh_token_type_xor ) - { - and_new = proc_and_expr(self); - if (and_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - else and = make_sys_node(FINSH_NODE_SYS_XOR, and, and_new); - - next_token(token, &(self->token)); - } - - finsh_token_replay(&(self->token)); - return and; -} - -/* -expr_and -> expr_shift - | expr_and '&' expr_shift -*/ -static struct finsh_node* proc_and_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* shift; - struct finsh_node* shift_new; - - shift = proc_shift_expr(self); - - next_token(token, &(self->token)); - while ( token == finsh_token_type_and ) - { - shift_new = proc_shift_expr(self); - - if (shift_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - else shift = make_sys_node(FINSH_NODE_SYS_AND, shift, shift_new); - - next_token(token, &(self->token)); - } - - finsh_token_replay(&(self->token)); - return shift; -} - -/* -expr_shift -> expr_additive - | expr_shift '<<' expr_additive - | expr_shift '>>' expr_additive -*/ -static struct finsh_node* proc_shift_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* add; - struct finsh_node* add_new; - - add = proc_additive_expr(self); - - next_token(token, &(self->token)); - while ( token == finsh_token_type_shl || token == finsh_token_type_shr) - { - add_new = proc_additive_expr(self); - if (add_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - else - { - switch (token) - { - case finsh_token_type_shl: - add = make_sys_node(FINSH_NODE_SYS_SHL, add, add_new); - break; - case finsh_token_type_shr: - add = make_sys_node(FINSH_NODE_SYS_SHR, add, add_new); - break; - default: - finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - break; - } - } - next_token(token, &(self->token)); - } - - finsh_token_replay(&(self->token)); - return add; -} - -/* -expr_additive -> expr_multiplicative - | expr_additive SUB expr_multiplicative - | expr_additive ADD expr_multiplicative -*/ -static struct finsh_node* proc_additive_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* mul; - struct finsh_node* mul_new; - - mul = proc_multiplicative_expr(self); - - next_token(token, &(self->token)); - while ( token == finsh_token_type_sub || token == finsh_token_type_add ) - { - mul_new = proc_multiplicative_expr(self); - if (mul_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - else - { - switch (token) - { - case finsh_token_type_sub: - mul = make_sys_node(FINSH_NODE_SYS_SUB, mul, mul_new); - break; - case finsh_token_type_add: - mul = make_sys_node(FINSH_NODE_SYS_ADD, mul, mul_new); - break; - default: - finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - break; - } - } - next_token(token, &(self->token)); - } - - finsh_token_replay(&(self->token)); - return mul; -} - -/* -expr_multiplicative -> expr_cast - | expr_multiplicative '*' expr_cast - | expr_multiplicative '/' expr_cast - | expr_multiplicative '%' expr_cast -*/ -static struct finsh_node* proc_multiplicative_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* cast; - struct finsh_node* cast_new; - - cast = proc_cast_expr(self); - next_token(token, &(self->token)); - while (token == finsh_token_type_mul || - token == finsh_token_type_div || - token == finsh_token_type_mod ) - { - cast_new = proc_cast_expr(self); - if (cast_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - else - { - switch (token) - { - case finsh_token_type_mul: - cast = make_sys_node(FINSH_NODE_SYS_MUL, cast, cast_new); - break; - - case finsh_token_type_div: - cast = make_sys_node(FINSH_NODE_SYS_DIV, cast, cast_new); - break; - - case finsh_token_type_mod: - cast = make_sys_node(FINSH_NODE_SYS_MOD, cast, cast_new); - break; - - default: - finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - break; - } - } - next_token(token, &(self->token)); - } - - finsh_token_replay(&(self->token)); - return cast; -} - -/* -20060313, add recast parse -expr_cast -> expr_unary - | '(' type ')' expr_cast -*/ -static struct finsh_node* proc_cast_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - enum finsh_type type; - struct finsh_node* cast; - - next_token(token, &(self->token)); - if (token == finsh_token_type_left_paren) - { - type = proc_type(self); - match_token(token, &(self->token), finsh_token_type_right_paren); - - cast = proc_cast_expr(self); - if (cast != NULL) - { - cast->data_type = type; - return cast; - } - } - - finsh_token_replay(&(self->token)); - return proc_unary_expr(self); -} - -/* -20050921, add '*' and '&' -expr_unary -> expr_postfix - | ADD expr_cast - | INC expr_cast - | SUB expr_cast - | DEC expr_cast - | '~' expr_cast - | '*' expr_cast - | '&' expr_cast -*/ -static struct finsh_node* proc_unary_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node *cast; - - next_token(token, &(self->token)); - switch (token) - { - case finsh_token_type_add: /* + */ - cast = proc_cast_expr(self); - return cast; - - case finsh_token_type_inc: /* ++ */ - cast = proc_cast_expr(self); - return make_sys_node(FINSH_NODE_SYS_PREINC, cast, NULL); - - case finsh_token_type_sub: /* - */ - cast = proc_cast_expr(self); - return make_sys_node(FINSH_NODE_SYS_SUB, finsh_node_new_long(0), cast); - - case finsh_token_type_dec: /* -- */ - cast = proc_cast_expr(self); - return make_sys_node(FINSH_NODE_SYS_PREDEC, cast, NULL); - - case finsh_token_type_bitwise: /* ~ */ - cast = proc_cast_expr(self); - return make_sys_node(FINSH_NODE_SYS_BITWISE, cast, NULL); - - case finsh_token_type_mul: /* * */ - cast = proc_cast_expr(self); - return make_sys_node(FINSH_NODE_SYS_GETVALUE, cast, NULL); - - case finsh_token_type_and: /* & */ - cast = proc_cast_expr(self); - return make_sys_node(FINSH_NODE_SYS_GETADDR, cast, NULL); - - default: - finsh_token_replay(&(self->token)); - return proc_postfix_expr(self); - } -} - -/* -expr_postfix -> expr_primary - | expr_postfix INC - | expr_postfix DEC - | expr_postfix '(' param_list ')' -*/ -static struct finsh_node* proc_postfix_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* postfix; - - postfix = proc_primary_expr(self); - - next_token(token, &(self->token)); - while ( token == finsh_token_type_inc || - token == finsh_token_type_dec || - token == finsh_token_type_left_paren ) - { - switch (token) - { - case finsh_token_type_inc :/* '++' */ - postfix = make_sys_node(FINSH_NODE_SYS_INC, postfix, NULL); - break; - - case finsh_token_type_dec :/* '--' */ - postfix = make_sys_node(FINSH_NODE_SYS_DEC, postfix, NULL); - break; - - case finsh_token_type_left_paren :/* '(' */ - { - struct finsh_node* param_list; - - param_list = NULL; - next_token(token, &(self->token)); - if (token != finsh_token_type_right_paren) - { - finsh_token_replay(&(self->token)); - param_list = proc_param_list(self); - - match_token(token, &(self->token), finsh_token_type_right_paren); - } - - postfix = make_sys_node(FINSH_NODE_SYS_FUNC, postfix, param_list); - } - break; - - default: - break; - } - - next_token(token, &(self->token)); - } - - finsh_token_replay(&(self->token)); - return postfix; -} - -/* -expr_primary -> literal - | '(' expr ')' - | identifier -*/ -static struct finsh_node* proc_primary_expr(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node* expr; - - next_token(token, &(self->token)); - switch ( token ) - { - case finsh_token_type_identifier: - { - char id[FINSH_NAME_MAX + 1]; - - finsh_token_replay(&(self->token)); - proc_identifier(self, id); - return finsh_node_new_id(id); - } - - case finsh_token_type_left_paren: - expr = proc_expr(self); - match_token(token, &(self->token), finsh_token_type_right_paren); - return expr; - - case finsh_token_type_value_int: - return finsh_node_new_int(self->token.value.int_value); - - case finsh_token_type_value_long: - return finsh_node_new_long(self->token.value.long_value); - - case finsh_token_type_value_char: - return finsh_node_new_char(self->token.value.char_value); - - case finsh_token_type_value_string: - return finsh_node_new_string((char*)self->token.string); - - case finsh_token_type_value_null: - return finsh_node_new_ptr(NULL); - - default: - finsh_error_set(FINSH_ERROR_INVALID_TOKEN); - break; - } - - return NULL; -} - -/* -param_list -> empty - | expr_assign - | param_list ',' expr_assign -*/ -static struct finsh_node* proc_param_list(struct finsh_parser* self) -{ - enum finsh_token_type token; - struct finsh_node *node, *assign; - - assign = proc_assign_expr(self); - if (assign == NULL) return NULL; - node = assign; - - next_token(token, &(self->token)); - while (token == finsh_token_type_comma ) - { - finsh_node_sibling(assign) = proc_assign_expr(self); - - if (finsh_node_sibling(assign) != NULL) assign = finsh_node_sibling(assign); - else finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR); - - next_token(token, &(self->token)); - } - - finsh_token_replay(&(self->token)); - - return node; -} - -/* -make a new node as following tree: -new_node -| -node1__ - \ - node2 -*/ -static struct finsh_node* make_sys_node(uint8_t type, struct finsh_node* node1, struct finsh_node* node2) -{ - struct finsh_node* node; - - node = finsh_node_allocate(type); - - if ((node1 != NULL) && (node != NULL)) - { - finsh_node_child(node) = node1; - finsh_node_sibling(node1) = node2; - } - else finsh_error_set(FINSH_ERROR_NULL_NODE); - - return node; -} - -/* -start -> statement_expr | decl_variable -*/ -void finsh_parser_run(struct finsh_parser* self, const uint8_t* string) -{ - enum finsh_token_type token; - struct finsh_node *node; - - node = NULL; - - /* init parser */ - self->parser_string = (uint8_t*)string; - - /* init token */ - finsh_token_init(&(self->token), self->parser_string); - - /* get next token */ - next_token(token, &(self->token)); - while (token != finsh_token_type_eof && token != finsh_token_type_bad) - { - switch (token) - { - case finsh_token_type_identifier: - /* process expr_statement */ - finsh_token_replay(&(self->token)); - - if (self->root != NULL) - { - finsh_node_sibling(node) = proc_expr_statement(self); - if (finsh_node_sibling(node) != NULL) - node = finsh_node_sibling(node); - } - else - { - node = proc_expr_statement(self); - self->root = node; - } - break; - - default: - if (is_base_type(token) || token == finsh_token_type_unsigned) - { - /* variable decl */ - finsh_token_replay(&(self->token)); - - if (self->root != NULL) - { - finsh_node_sibling(node) = proc_variable_decl(self); - if (finsh_node_sibling(node) != NULL) - node = finsh_node_sibling(node); - } - else - { - node = proc_variable_decl(self); - self->root = node; - } - } - else - { - /* process expr_statement */ - finsh_token_replay(&(self->token)); - - if (self->root != NULL) - { - finsh_node_sibling(node) = proc_expr_statement(self); - if (finsh_node_sibling(node) != NULL) - node = finsh_node_sibling(node); - else next_token(token, &(self->token)); - } - else - { - node = proc_expr_statement(self); - self->root = node; - } - } - - break; - } - - /* no root found, break out */ - if (self->root == NULL) break; - - /* get next token */ - next_token(token, &(self->token)); - } -} - -int finsh_parser_init(struct finsh_parser* self) -{ - memset(self, 0, sizeof(struct finsh_parser)); - - return 0; -} diff --git a/components/finsh/finsh_parser.h b/components/finsh/finsh_parser.h deleted file mode 100644 index 2d0148093a..0000000000 --- a/components/finsh/finsh_parser.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#ifndef __FINSH_PARSER_H__ -#define __FINSH_PARSER_H__ - -#include - -int finsh_parser_init(struct finsh_parser* self); -void finsh_parser_run(struct finsh_parser* self, const uint8_t* string); - -#endif diff --git a/components/finsh/finsh_token.c b/components/finsh/finsh_token.c deleted file mode 100644 index dfd613da5b..0000000000 --- a/components/finsh/finsh_token.c +++ /dev/null @@ -1,598 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - * 2013-04-03 Bernard strip more characters. - */ -#include -#include - -#include "finsh_token.h" -#include "finsh_error.h" - -#define is_alpha(ch) ((ch | 0x20) - 'a') < 26u -#define is_digit(ch) ((ch) >= '0' && (ch) <= '9') -#define is_xdigit(ch) (((ch) >= '0' && (ch) <= '9') || (((ch | 0x20) - 'a') < 6u)) -#define is_separator(ch) !(((ch) >= 'a' && (ch) <= 'z') \ - || ((ch) >= 'A' && (ch) <= 'Z') || ((ch) >= '0' && (ch) <= '9') || ((ch) == '_')) -#define is_eof(self) (self)->eof - -struct name_table -{ - char* name; - enum finsh_token_type type; -}; - -/* keyword */ -static const struct name_table finsh_name_table[] = -{ - {"void", finsh_token_type_void}, - {"char", finsh_token_type_char}, - {"short", finsh_token_type_short}, - {"int", finsh_token_type_int}, - {"long", finsh_token_type_long}, - {"unsigned", finsh_token_type_unsigned}, - - {"NULL", finsh_token_type_value_null}, - {"null", finsh_token_type_value_null} -}; - -static char token_next_char(struct finsh_token* self); -static void token_prev_char(struct finsh_token* self); -static long token_spec_number(char* string, int length, int b); -static void token_run(struct finsh_token* self); -static int token_match_name(struct finsh_token* self, const char* str); -static void token_proc_number(struct finsh_token* self); -static uint8_t* token_proc_string(struct finsh_token* self); -static void token_trim_space(struct finsh_token* self); -static char token_proc_char(struct finsh_token* self); -static int token_proc_escape(struct finsh_token* self); - -void finsh_token_init(struct finsh_token* self, uint8_t* line) -{ - memset(self, 0, sizeof(struct finsh_token)); - - self->line = line; -} - -enum finsh_token_type finsh_token_token(struct finsh_token* self) -{ - if ( self->replay ) self->replay = 0; - else token_run(self); - - return (enum finsh_token_type)self->current_token; -} - -void finsh_token_get_token(struct finsh_token* self, uint8_t* token) -{ - strncpy((char*)token, (char*)self->string, FINSH_NAME_MAX); -} - -int token_get_string(struct finsh_token* self, uint8_t* str) -{ - unsigned char *p=str; - char ch; - - ch = token_next_char(self); - if (is_eof(self)) return -1; - - str[0] = '\0'; - - if ( is_digit(ch) )/*the first character of identifier is not a digit.*/ - { - token_prev_char(self); - return -1; - } - - while (!is_separator(ch) && !is_eof(self)) - { - *p++ = ch; - - ch = token_next_char(self); - } - self->eof = 0; - - token_prev_char(self); - *p = '\0'; - - return 0; -} - -/* -get next character. -*/ -static char token_next_char(struct finsh_token* self) -{ - if (self->eof) return '\0'; - - if (self->position == (int)strlen((char*)self->line) || self->line[self->position] =='\n') - { - self->eof = 1; - self->position = 0; - return '\0'; - } - - return self->line[self->position++]; -} - -static void token_prev_char(struct finsh_token* self) -{ - if ( self->eof ) return; - - if ( self->position == 0 ) return; - else self->position--; -} - -static void token_run(struct finsh_token* self) -{ - char ch; - - token_trim_space(self); /* first trim space and tab. */ - token_get_string(self, &(self->string[0])); - - if ( is_eof(self) ) /*if it is eof, break;*/ - { - self->current_token = finsh_token_type_eof; - return ; - } - - if (self->string[0] != '\0') /*It is a key word or a identifier.*/ - { - if ( !token_match_name(self, (char*)self->string) ) - { - self->current_token = finsh_token_type_identifier; - } - } - else/*It is a operator character.*/ - { - ch = token_next_char(self); - - switch ( ch ) - { - case '(': - self->current_token = finsh_token_type_left_paren; - break; - - case ')': - self->current_token = finsh_token_type_right_paren; - break; - - case ',': - self->current_token = finsh_token_type_comma; - break; - - case ';': - self->current_token = finsh_token_type_semicolon; - break; - - case '&': - self->current_token = finsh_token_type_and; - break; - - case '*': - self->current_token = finsh_token_type_mul; - break; - - case '+': - ch = token_next_char(self); - - if ( ch == '+' ) - { - self->current_token = finsh_token_type_inc; - } - else - { - token_prev_char(self); - self->current_token = finsh_token_type_add; - } - break; - - case '-': - ch = token_next_char(self); - - if ( ch == '-' ) - { - self->current_token = finsh_token_type_dec; - } - else - { - token_prev_char(self); - self->current_token = finsh_token_type_sub; - } - break; - - case '/': - ch = token_next_char(self); - if (ch == '/') - { - /* line comments, set to end of file */ - self->current_token = finsh_token_type_eof; - } - else - { - token_prev_char(self); - self->current_token = finsh_token_type_div; - } - break; - - case '<': - ch = token_next_char(self); - - if ( ch == '<' ) - { - self->current_token = finsh_token_type_shl; - } - else - { - token_prev_char(self); - self->current_token = finsh_token_type_bad; - } - break; - - case '>': - ch = token_next_char(self); - - if ( ch == '>' ) - { - self->current_token = finsh_token_type_shr; - } - else - { - token_prev_char(self); - self->current_token = finsh_token_type_bad; - } - break; - - case '|': - self->current_token = finsh_token_type_or; - break; - - case '%': - self->current_token = finsh_token_type_mod; - break; - - case '~': - self->current_token = finsh_token_type_bitwise; - break; - - case '^': - self->current_token = finsh_token_type_xor; - break; - - case '=': - self->current_token = finsh_token_type_assign; - break; - - case '\'': - self->value.char_value = token_proc_char(self); - self->current_token = finsh_token_type_value_char; - break; - - case '"': - token_proc_string(self); - self->current_token = finsh_token_type_value_string; - break; - - default: - if ( is_digit(ch) ) - { - token_prev_char(self); - token_proc_number(self); - break; - } - - finsh_error_set(FINSH_ERROR_UNKNOWN_TOKEN); - self->current_token = finsh_token_type_bad; - - break; - } - } -} - -static int token_match_name(struct finsh_token* self, const char* str) -{ - int i; - - for (i = 0; i < sizeof(finsh_name_table)/sizeof(struct name_table); i++) - { - if ( strcmp(finsh_name_table[i].name, str)==0 ) - { - self->current_token = finsh_name_table[i].type; - return 1; - } - } - - return 0; -} - -static void token_trim_space(struct finsh_token* self) -{ - char ch; - while ( (ch = token_next_char(self)) ==' ' || - ch == '\t' || - ch == '\r'); - - token_prev_char(self); -} - -static char token_proc_char(struct finsh_token* self) -{ - char ch; - char buf[4], *p; - - p = buf; - ch = token_next_char(self); - - if ( ch == '\\' ) - { - ch = token_next_char(self); - switch ( ch ) - { - case 'n': ch = '\n'; break; - case 't': ch = '\t'; break; - case 'v': ch = '\v'; break; - case 'b': ch = '\b'; break; - case 'r': ch = '\r'; break; - case '\\': ch = '\\'; break; - case '\'': ch = '\''; break; - default : - while ( is_digit(ch) )/*for '\113' char*/ - { - ch = token_next_char(self); - *p++ = ch; - } - - token_prev_char(self); - *p = '\0'; - ch = atoi(p); - break; - } - } - - if ( token_next_char(self) != '\'' ) - { - token_prev_char(self); - finsh_error_set(FINSH_ERROR_EXPECT_CHAR); - return ch; - } - - return ch; -} - -static uint8_t* token_proc_string(struct finsh_token* self) -{ - uint8_t* p; - - for ( p = &self->string[0]; p - &(self->string[0]) < FINSH_STRING_MAX; ) - { - char ch = token_next_char(self); - - if ( is_eof(self) ) - { - finsh_error_set(FINSH_ERROR_UNEXPECT_END); - return NULL;; - } - if ( ch == '\\' ) - { - ch = token_proc_escape(self); - } - else if ( ch == '"' )/*end of string.*/ - { - *p = '\0'; - return self->string; - } - - *p++ = ch; - } - - return NULL; -} - -static int token_proc_escape(struct finsh_token* self) -{ - char ch; - int result=0; - - ch = token_next_char(self); - switch (ch) - { - case 'n': - result = '\n'; - break; - case 't': - result = '\t'; - break; - case 'v': - result = '\v'; - break; - case 'b': - result = '\b'; - break; - case 'r': - result = '\r'; - break; - case 'f': - result = '\f'; - break; - case 'a': - result = '\007'; - break; - case '"': - result = '"'; - break; - case 'x': - case 'X': - result = 0; - ch = token_next_char(self); - while (is_xdigit(ch)) - { - result = result * 16 + ((ch < 'A') ? (ch - '0') : (ch | 0x20) - 'a' + 10); - ch = token_next_char(self); - } - token_prev_char(self); - break; - default: - if ( (ch - '0') < 8u) - { - result = 0; - while ( (ch - '0') < 8u ) - { - result = result*8 + ch - '0'; - ch = token_next_char(self); - } - - token_prev_char(self); - } - break; - } - - return result; -} - -/* -(0|0x|0X|0b|0B)number+(l|L) -*/ -static void token_proc_number(struct finsh_token* self) -{ - char ch; - char *p, buf[128]; - long value; - - value = 0; - p = buf; - - ch = token_next_char(self); - if ( ch == '0' ) - { - int b; - ch = token_next_char(self); - if ( ch == 'x' || ch == 'X' )/*it's a hex number*/ - { - b = 16; - ch = token_next_char(self); - while ( is_digit(ch) || is_alpha(ch) ) - { - *p++ = ch; - ch = token_next_char(self); - } - - *p = '\0'; - } - else if ( ch == 'b' || ch == 'B' ) - { - b = 2; - ch = token_next_char(self); - while ( (ch=='0')||(ch=='1') ) - { - *p++ = ch; - ch = token_next_char(self); - } - - *p = '\0'; - } - else if ( '0' <= ch && ch <= '7' ) - { - b = 8; - while ( '0' <= ch && ch <= '7' ) - { - *p++ = ch; - ch = token_next_char(self); - } - - *p = '\0'; - } - else - { - token_prev_char(self); - - /* made as 0 value */ - self->value.int_value = 0; - self->current_token = finsh_token_type_value_int; - return; - } - - self->value.int_value = token_spec_number(buf, strlen(buf), b); - self->current_token = finsh_token_type_value_int; - } - else - { - while ( is_digit(ch) ) - { - value = value*10 + ( ch - '0' ); - ch = token_next_char(self); - } - - self->value.int_value = value; - self->current_token = finsh_token_type_value_int; - } - - switch ( ch ) - { - case 'l': - case 'L': - self->current_token = finsh_token_type_value_long; - break; - - default: - token_prev_char(self); - break; - } -} - -/*use 64 bit number*/ -#define BN_SIZE 2 - -static long token_spec_number(char* string, int length, int b) -{ - char* p; - int t; - int i, j, shift=1; - unsigned int bn[BN_SIZE], v; - long d; - - p = string; - i = 0; - - switch ( b ) - { - case 16: shift = 4; - break; - case 8: shift = 3; - break; - case 2: shift = 1; - break; - default: break; - } - - for ( j=0; j='a' && t <='f' ) - { - t = t - 'a' +10; - } - else if ( t >='A' && t <='F' ) - { - t = t - 'A' +10; - } - else t = t - '0'; - - for ( j=0; j> (32 - shift); - } - i++; - } - - d = (long)bn[0]; - - return d; -} diff --git a/components/finsh/finsh_token.h b/components/finsh/finsh_token.h deleted file mode 100644 index 9845357b8e..0000000000 --- a/components/finsh/finsh_token.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#ifndef __FINSH_TOKEN_H__ -#define __FINSH_TOKEN_H__ - -#include - -enum finsh_token_type -{ - finsh_token_type_left_paren = 1, /* ( */ - finsh_token_type_right_paren , /* ) */ - finsh_token_type_comma , /* , */ - finsh_token_type_semicolon , /* ; */ - finsh_token_type_mul , /* * */ - finsh_token_type_add , /* + */ - finsh_token_type_inc , /* ++ */ - finsh_token_type_sub , /* - */ - finsh_token_type_dec , /* -- */ - finsh_token_type_div , /* / */ - finsh_token_type_mod , /* % */ - finsh_token_type_assign , /* = */ - finsh_token_type_and, /* & */ - finsh_token_type_or, /* | */ - finsh_token_type_xor, /* ^ */ - finsh_token_type_bitwise, /* ~ */ - finsh_token_type_shl, /* << */ - finsh_token_type_shr, /* >> */ - finsh_token_type_comments, /* // */ - /*-- data type --*/ - finsh_token_type_void, /* void */ - finsh_token_type_char, /* char */ - finsh_token_type_short, /* short */ - finsh_token_type_int, /* int */ - finsh_token_type_long, /* long */ - finsh_token_type_unsigned, /* unsigned */ - /* data value type */ - finsh_token_type_value_char, /* v:char */ - finsh_token_type_value_int, /* v:int */ - finsh_token_type_value_long, /* v:long */ - finsh_token_type_value_string, /* v:string */ - finsh_token_type_value_null, /* NULL */ - /*-- others --*/ - finsh_token_type_identifier, /* ID */ - finsh_token_type_bad, /* bad token */ - finsh_token_type_eof -}; - -#define finsh_token_position(self) (self)->position -#define finsh_token_replay(self) (self)->replay = 1 - -void finsh_token_init(struct finsh_token* self, uint8_t* script); - -enum finsh_token_type finsh_token_token(struct finsh_token* self); -void finsh_token_get_token(struct finsh_token* self, uint8_t* token); - -#endif diff --git a/components/finsh/finsh_var.c b/components/finsh/finsh_var.c deleted file mode 100644 index 2e3df30c6d..0000000000 --- a/components/finsh/finsh_var.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - * 2012-04-27 Bernard fixed finsh_var_delete issue which - * is found by Grissiom. - */ -#include -#include "finsh_var.h" - -struct finsh_var global_variable[FINSH_VARIABLE_MAX]; -struct finsh_sysvar_item* global_sysvar_list; - -int finsh_var_init() -{ - memset(global_variable, 0, sizeof(global_variable)); - - return 0; -} - -int finsh_var_insert(const char* name, int type) -{ - int i, empty; - - empty = -1; - for (i = 0; i < FINSH_VARIABLE_MAX; i ++) - { - /* there is a same name variable exist. */ - if (strncmp(global_variable[i].name, name, FINSH_NAME_MAX) == 0) - return -1; - - if (global_variable[i].type == finsh_type_unknown && empty == -1) - { - empty = i; - } - } - - /* there is no empty entry */ - if (empty == -1) return -1; - - /* insert entry */ - strncpy(global_variable[empty].name, name, FINSH_NAME_MAX); - global_variable[empty].type = type; - - /* return the offset */ - return empty; -} - -int finsh_var_delete(const char* name) -{ - int i; - - for (i = 0; i < FINSH_VARIABLE_MAX; i ++) - { - if (strncmp(global_variable[i].name, name, FINSH_NAME_MAX) == 0) - break; - } - - /* can't find variable */ - if (i == FINSH_VARIABLE_MAX) return -1; - - memset(&global_variable[i], 0, sizeof(struct finsh_var)); - - return 0; -} - -struct finsh_var* finsh_var_lookup(const char* name) -{ - int i; - - for (i = 0; i < FINSH_VARIABLE_MAX; i ++) - { - if (strncmp(global_variable[i].name, name, FINSH_NAME_MAX) == 0) - break; - } - - /* can't find variable */ - if (i == FINSH_VARIABLE_MAX) return NULL; - - return &global_variable[i]; -} - -#ifdef RT_USING_HEAP -void finsh_sysvar_append(const char* name, uint8_t type, void* var_addr) -{ - /* create a sysvar */ - struct finsh_sysvar_item* item; - - item = (struct finsh_sysvar_item*) rt_malloc (sizeof(struct finsh_sysvar_item)); - if (item != NULL) - { - item->next = NULL; - item->sysvar.name = rt_strdup(name); - item->sysvar.type = type; - item->sysvar.var = var_addr; - - if (global_sysvar_list == NULL) - { - global_sysvar_list = item; - } - else - { - item->next = global_sysvar_list; - global_sysvar_list = item; - } - } -} -#endif - -struct finsh_sysvar* finsh_sysvar_lookup(const char* name) -{ - struct finsh_sysvar* index; - struct finsh_sysvar_item* item; - - for (index = _sysvar_table_begin; - index < _sysvar_table_end; - FINSH_NEXT_SYSVAR(index)) - { - if (strcmp(index->name, name) == 0) - return index; - } - - /* find in sysvar list */ - item = global_sysvar_list; - while (item != NULL) - { - if (strncmp(item->sysvar.name, name, strlen(name)) == 0) - { - return &(item->sysvar); - } - - /* move to next item */ - item = item->next; - } - - /* can't find variable */ - return NULL; -} diff --git a/components/finsh/finsh_var.h b/components/finsh/finsh_var.h deleted file mode 100644 index 796f979441..0000000000 --- a/components/finsh/finsh_var.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#ifndef __FINSH_VAR_H__ -#define __FINSH_VAR_H__ - -#include - -/* - * The variable in finsh is put in data segment as a global variable. - * The 'finsh_var' structure presents the structure of variable in data segment. - */ -struct finsh_var -{ - char name[FINSH_NAME_MAX + 1]; /* the name of variable */ - - uint8_t type; /* the type of variable */ - - /* variable value */ - union { - char char_value; - short short_value; - int int_value; - long long_value; - void* ptr; - }value; -}; -extern struct finsh_var global_variable[]; - -int finsh_var_init(void); -int finsh_var_insert(const char* name, int type); -int finsh_var_delete(const char* name); -struct finsh_var* finsh_var_lookup(const char* name); - -#endif diff --git a/components/finsh/finsh_vm.c b/components/finsh/finsh_vm.c deleted file mode 100644 index e56cedbdfb..0000000000 --- a/components/finsh/finsh_vm.c +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#include - -#include "finsh_vm.h" -#include "finsh_ops.h" -#include "finsh_var.h" - -/* stack */ -union finsh_value finsh_vm_stack[FINSH_STACK_MAX]; -/* text segment */ -uint8_t text_segment[FINSH_TEXT_MAX]; - -union finsh_value* finsh_sp; /* stack pointer */ -uint8_t* finsh_pc; /* PC */ - -/* syscall list, for dynamic system call register */ -struct finsh_syscall_item* global_syscall_list = NULL; - -// #define FINSH_VM_DISASSEMBLE -void finsh_vm_run() -{ - uint8_t op; - - /* if you want to disassemble the byte code, please define FINSH_VM_DISASSEMBLE */ -#ifdef FINSH_VM_DISASSEMBLE - void finsh_disassemble(); - finsh_disassemble(); -#endif - - /* set sp(stack pointer) to the beginning of stack */ - finsh_sp = &finsh_vm_stack[0]; - - /* set pc to the beginning of text segment */ - finsh_pc = &text_segment[0]; - - while ((finsh_pc - &text_segment[0] >= 0) && - (finsh_pc - &text_segment[0] < FINSH_TEXT_MAX)) - { - /* get op */ - op = *finsh_pc++; - - /* call op function */ - op_table[op](); - } -} - -#ifdef RT_USING_HEAP -void finsh_syscall_append(const char* name, syscall_func func) -{ - /* create the syscall */ - struct finsh_syscall_item* item; - - item = (struct finsh_syscall_item*)rt_malloc(sizeof(struct finsh_syscall_item)); - if (item != RT_NULL) - { - item->next = NULL; - item->syscall.name = rt_strdup(name); - item->syscall.func = func; - - if (global_syscall_list == NULL) - { - global_syscall_list = item; - } - else - { - item->next = global_syscall_list; - global_syscall_list = item; - } - } -} -#endif - -struct finsh_syscall* finsh_syscall_lookup(const char* name) -{ - struct finsh_syscall* index; - struct finsh_syscall_item* item; - - for (index = _syscall_table_begin; index < _syscall_table_end; FINSH_NEXT_SYSCALL(index)) - { - if (strcmp(index->name, name) == 0) - return index; - } - - /* find on syscall list */ - item = global_syscall_list; - while (item != NULL) - { - if (strncmp(item->syscall.name, name, strlen(name)) == 0) - { - return &(item->syscall); - } - - item = item->next; - } - - return NULL; -} - -#ifdef FINSH_VM_DISASSEMBLE -void finsh_disassemble() -{ - uint8_t *pc, op; - - pc = &text_segment[0]; - while (*pc != 0) - { - op = *pc; - switch (op) - { - case FINSH_OP_ADD_BYTE: - pc ++; - rt_kprintf("addb\n"); - break; - - case FINSH_OP_SUB_BYTE: - pc ++; - rt_kprintf("subb\n"); - break; - - case FINSH_OP_DIV_BYTE: - pc ++; - rt_kprintf("divb\n"); - break; - - case FINSH_OP_MOD_BYTE: - pc ++; - rt_kprintf("modb\n"); - break; - - case FINSH_OP_MUL_BYTE: - pc ++; - rt_kprintf("mulb\n"); - break; - - case FINSH_OP_AND_BYTE: - pc ++; - rt_kprintf("andb\n"); - break; - - case FINSH_OP_OR_BYTE: - pc ++; - rt_kprintf("orb\n"); - break; - - case FINSH_OP_XOR_BYTE: - pc ++; - rt_kprintf("xorb\n"); - break; - - case FINSH_OP_BITWISE_BYTE: - pc ++; - rt_kprintf("bwb\n"); - break; - - case FINSH_OP_SHL_BYTE: - pc ++; - rt_kprintf("shlb\n"); - break; - - case FINSH_OP_SHR_BYTE: - pc ++; - rt_kprintf("shrb\n"); - break; - - case FINSH_OP_LD_BYTE: - pc ++; - rt_kprintf("ldb %d\n", *pc++); - break; - - case FINSH_OP_LD_VALUE_BYTE: - pc ++; - rt_kprintf("ldb [0x%x]\n", FINSH_GET32(pc)); - pc += 4; - break; - - case FINSH_OP_ST_BYTE: - pc ++; - rt_kprintf("stb\n"); - break; - - case FINSH_OP_ADD_WORD: - pc ++; - rt_kprintf("addw\n"); - break; - - case FINSH_OP_SUB_WORD: - pc ++; - rt_kprintf("subw\n"); - break; - - case FINSH_OP_DIV_WORD: - pc ++; - rt_kprintf("divw\n"); - break; - - case FINSH_OP_MOD_WORD: - pc ++; - rt_kprintf("modw\n"); - break; - - case FINSH_OP_MUL_WORD: - pc ++; - rt_kprintf("mulw\n"); - break; - - case FINSH_OP_AND_WORD: - pc ++; - rt_kprintf("andw\n"); - break; - - case FINSH_OP_OR_WORD: - pc ++; - rt_kprintf("orw\n"); - break; - - case FINSH_OP_XOR_WORD: - pc ++; - rt_kprintf("xorw\n"); - break; - - case FINSH_OP_BITWISE_WORD: - pc ++; - rt_kprintf("bww\n"); - break; - - case FINSH_OP_SHL_WORD: - pc ++; - rt_kprintf("shlw\n"); - break; - - case FINSH_OP_SHR_WORD: - pc ++; - rt_kprintf("shrw\n"); - break; - - case FINSH_OP_LD_WORD: - pc ++; - rt_kprintf("ldw %d\n", FINSH_GET16(pc)); - pc += 2; - break; - - case FINSH_OP_LD_VALUE_WORD: - pc ++; - rt_kprintf("ldw [0x%x]\n", FINSH_GET32(pc)); - pc += 4; - break; - - case FINSH_OP_ST_WORD: - pc ++; - rt_kprintf("stw\n"); - break; - - case FINSH_OP_ADD_DWORD: - pc ++; - rt_kprintf("addd\n"); - break; - - case FINSH_OP_SUB_DWORD: - pc ++; - rt_kprintf("subd\n"); - break; - - case FINSH_OP_DIV_DWORD: - pc ++; - rt_kprintf("divd\n"); - break; - - case FINSH_OP_MOD_DWORD: - pc ++; - rt_kprintf("modd\n"); - break; - - case FINSH_OP_MUL_DWORD: - pc ++; - rt_kprintf("muld\n"); - break; - - case FINSH_OP_AND_DWORD: - pc ++; - rt_kprintf("andd\n"); - break; - - case FINSH_OP_OR_DWORD: - pc ++; - rt_kprintf("ord\n"); - break; - - case FINSH_OP_XOR_DWORD: - pc ++; - rt_kprintf("xord\n"); - break; - - case FINSH_OP_BITWISE_DWORD: - pc ++; - rt_kprintf("bwd\n"); - break; - - case FINSH_OP_SHL_DWORD: - pc ++; - rt_kprintf("shld\n"); - break; - - case FINSH_OP_SHR_DWORD: - pc ++; - rt_kprintf("shrd\n"); - break; - - case FINSH_OP_LD_DWORD: - pc ++; - rt_kprintf("ldd 0x%x\n", FINSH_GET32(pc)); - pc += 4; - break; - - case FINSH_OP_LD_VALUE_DWORD: - pc ++; - rt_kprintf("ldd [0x%x]\n", FINSH_GET32(pc)); - pc += 4; - break; - - case FINSH_OP_ST_DWORD: - pc ++; - rt_kprintf("std\n"); - break; - - case FINSH_OP_POP: - rt_kprintf("pop\n"); - pc ++; - break; - - case FINSH_OP_SYSCALL: - pc ++; - rt_kprintf("syscall %d\n", *pc++); - break; - - case FINSH_OP_LD_VALUE_BYTE_STACK: - pc ++; - rt_kprintf("ldb [sp]\n"); - break; - - case FINSH_OP_LD_VALUE_WORD_STACK: - pc ++; - rt_kprintf("ldw [sp]\n"); - break; - - case FINSH_OP_LD_VALUE_DWORD_STACK: - pc ++; - rt_kprintf("ldd [sp]\n"); - break; - - default: - return; - } - } -} -#endif diff --git a/components/finsh/finsh_vm.h b/components/finsh/finsh_vm.h deleted file mode 100644 index 15d5da1ef8..0000000000 --- a/components/finsh/finsh_vm.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ -#ifndef __FINSH_VM_H__ -#define __FINSH_VM_H__ - -#include - -#include "finsh_var.h" - -union finsh_value { - char char_value; - short short_value; - long long_value; - void* ptr; -}; - -extern union finsh_value* finsh_sp; /* stack pointer */ -extern uint8_t* finsh_pc; /* PC */ - -/* stack */ -extern union finsh_value finsh_vm_stack[FINSH_STACK_MAX]; -/* text segment */ -extern uint8_t text_segment[FINSH_TEXT_MAX]; - -void finsh_vm_run(void); -//void finsh_disassemble(void); - -#endif diff --git a/components/finsh/msh.c b/components/finsh/msh.c index ed12219c2e..648b4bbd69 100644 --- a/components/finsh/msh.c +++ b/components/finsh/msh.c @@ -10,61 +10,27 @@ * 2017-07-19 Aubr.Cool limit argc to RT_FINSH_ARG_MAX */ #include +#include -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH + +#ifndef FINSH_ARG_MAX + #define FINSH_ARG_MAX 8 +#endif #include "msh.h" -#include -#include +#include "shell.h" #ifdef RT_USING_DFS -#include + #include #endif #ifdef RT_USING_MODULE -#include -#endif - -#ifndef FINSH_ARG_MAX -#define FINSH_ARG_MAX 8 + #include #endif typedef int (*cmd_function_t)(int argc, char **argv); -#ifdef FINSH_USING_MSH -#ifdef FINSH_USING_MSH_ONLY -rt_bool_t msh_is_used(void) -{ - return RT_TRUE; -} -#else -#ifdef FINSH_USING_MSH_DEFAULT -static rt_bool_t __msh_state = RT_TRUE; -#else -static rt_bool_t __msh_state = RT_FALSE; -#endif -rt_bool_t msh_is_used(void) -{ - return __msh_state; -} - -static int msh_exit(int argc, char **argv) -{ - /* return to finsh shell mode */ - __msh_state = RT_FALSE; - return 0; -} -FINSH_FUNCTION_EXPORT_ALIAS(msh_exit, __cmd_exit, return to RT-Thread shell mode.); - -static int msh_enter(void) -{ - /* enter module shell mode */ - __msh_state = RT_TRUE; - return 0; -} -FINSH_FUNCTION_EXPORT_ALIAS(msh_enter, msh, use module shell); -#endif - int msh_help(int argc, char **argv) { rt_kprintf("RT-Thread shell commands:\n"); @@ -87,7 +53,7 @@ int msh_help(int argc, char **argv) return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(msh_help, __cmd_help, RT-Thread shell help.); +MSH_CMD_EXPORT_ALIAS(msh_help, help, RT - Thread shell help.); int cmd_ps(int argc, char **argv) { @@ -102,7 +68,7 @@ int cmd_ps(int argc, char **argv) list_thread(); return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_ps, __cmd_ps, List threads in the system.); +MSH_CMD_EXPORT_ALIAS(cmd_ps, ps, List threads in the system.); #ifdef RT_USING_HEAP int cmd_free(int argc, char **argv) @@ -117,7 +83,7 @@ int cmd_free(int argc, char **argv) #endif return 0; } -FINSH_FUNCTION_EXPORT_ALIAS(cmd_free, __cmd_free, Show the memory usage in the system.); +MSH_CMD_EXPORT_ALIAS(cmd_free, free, Show the memory usage in the system.); #endif static int msh_split(char *cmd, rt_size_t length, char *argv[FINSH_ARG_MAX]) @@ -128,7 +94,8 @@ static int msh_split(char *cmd, rt_size_t length, char *argv[FINSH_ARG_MAX]) rt_size_t i; ptr = cmd; - position = 0; argc = 0; + position = 0; + argc = 0; while (position < length) { @@ -136,13 +103,14 @@ static int msh_split(char *cmd, rt_size_t length, char *argv[FINSH_ARG_MAX]) while ((*ptr == ' ' || *ptr == '\t') && position < length) { *ptr = '\0'; - ptr ++; position ++; + ptr ++; + position ++; } - if(argc >= FINSH_ARG_MAX) + if (argc >= FINSH_ARG_MAX) { rt_kprintf("Too many args ! We only Use:\n"); - for(i = 0; i < argc; i++) + for (i = 0; i < argc; i++) { rt_kprintf("%s ", argv[i]); } @@ -155,8 +123,10 @@ static int msh_split(char *cmd, rt_size_t length, char *argv[FINSH_ARG_MAX]) /* handle string */ if (*ptr == '"') { - ptr ++; position ++; - argv[argc] = ptr; argc ++; + ptr ++; + position ++; + argv[argc] = ptr; + argc ++; /* skip this string */ while (*ptr != '"' && position < length) @@ -165,15 +135,19 @@ static int msh_split(char *cmd, rt_size_t length, char *argv[FINSH_ARG_MAX]) { if (*(ptr + 1) == '"') { - ptr ++; position ++; + ptr ++; + position ++; } } - ptr ++; position ++; + ptr ++; + position ++; } if (position >= length) break; /* skip '"' */ - *ptr = '\0'; ptr ++; position ++; + *ptr = '\0'; + ptr ++; + position ++; } else { @@ -181,7 +155,8 @@ static int msh_split(char *cmd, rt_size_t length, char *argv[FINSH_ARG_MAX]) argc ++; while ((*ptr != ' ' && *ptr != '\t') && position < length) { - ptr ++; position ++; + ptr ++; + position ++; } if (position >= length) break; } @@ -340,7 +315,7 @@ static int _msh_exec_lwp(char *cmd, rt_size_t length) int fd = -1; char *pg_name; - extern int exec(char*, int, char**); + extern int exec(char *, int, char **); /* find the size of first command */ while ((cmd[cmd0_size] != ' ' && cmd[cmd0_size] != '\t') && cmd0_size < length) @@ -642,6 +617,4 @@ void msh_auto_complete(char *prefix) return ; } -#endif - -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ diff --git a/components/finsh/msh.h b/components/finsh/msh.h index 17c7a39ef1..b9b037586e 100644 --- a/components/finsh/msh.h +++ b/components/finsh/msh.h @@ -13,7 +13,6 @@ #include -rt_bool_t msh_is_used(void); int msh_exec(char *cmd, rt_size_t length); void msh_auto_complete(char *prefix); diff --git a/components/finsh/msh_file.c b/components/finsh/msh_file.c index 3f21cc6f34..8f067efd98 100644 --- a/components/finsh/msh_file.c +++ b/components/finsh/msh_file.c @@ -11,7 +11,7 @@ #include -#if defined(FINSH_USING_MSH) && defined(RT_USING_DFS) +#if defined(RT_USING_FINSH) && defined(RT_USING_DFS) #include #include "msh.h" @@ -144,7 +144,7 @@ int msh_exec_script(const char *cmd_line, int size) } #ifdef DFS_USING_WORKDIR -extern char working_directory[]; + extern char working_directory[]; #endif static int cmd_ls(int argc, char **argv) @@ -614,19 +614,19 @@ static int cmd_tail(int argc, char **argv) rt_uint32_t required_lines = 0; rt_uint32_t after_xxx_line = 0; - if(argc < 2) + if (argc < 2) { rt_kprintf("Usage: tail [-n numbers] \n"); return -1; } - else if(argc == 2) + else if (argc == 2) { required_lines = 10; /* default: 10 lines from tail */ file_name = argv[1]; } - else if(rt_strcmp(argv[1], "-n") == 0) + else if (rt_strcmp(argv[1], "-n") == 0) { - if(argv[2][0] != '+') + if (argv[2][0] != '+') { required_lines = atoi(argv[2]); } @@ -659,9 +659,9 @@ static int cmd_tail(int argc, char **argv) rt_kprintf("\nTotal Number of lines:%d\n", total_lines); - if(after_xxx_line != 0) + if (after_xxx_line != 0) { - if(total_lines > after_xxx_line) + if (total_lines > after_xxx_line) { required_lines = total_lines - after_xxx_line; } @@ -700,7 +700,7 @@ static int cmd_tail(int argc, char **argv) close(fd); return 0; } -MSH_CMD_EXPORT_ALIAS(cmd_tail, tail, print the last N-lines data of the given file); +MSH_CMD_EXPORT_ALIAS(cmd_tail, tail, print the last N - lines data of the given file); -#endif /* defined(FINSH_USING_MSH) && defined(RT_USING_DFS) */ +#endif /* defined(RT_USING_FINSH) && defined(RT_USING_DFS) */ diff --git a/components/finsh/shell.c b/components/finsh/shell.c index 87dc6e0745..48651d2c4f 100644 --- a/components/finsh/shell.c +++ b/components/finsh/shell.c @@ -19,75 +19,62 @@ */ #include +#include +#include #ifdef RT_USING_FINSH -#include "finsh.h" #include "shell.h" - -#ifdef FINSH_USING_MSH #include "msh.h" -#endif -#ifdef _WIN32 -#include /* for putchar */ -#endif +#if defined(RT_USING_DFS) + #include +#endif /* RT_USING_DFS */ /* finsh thread */ #ifndef RT_USING_HEAP -static struct rt_thread finsh_thread; -ALIGN(RT_ALIGN_SIZE) -static char finsh_thread_stack[FINSH_THREAD_STACK_SIZE]; -struct finsh_shell _shell; + static struct rt_thread finsh_thread; + ALIGN(RT_ALIGN_SIZE) + static char finsh_thread_stack[FINSH_THREAD_STACK_SIZE]; + struct finsh_shell _shell; #endif /* finsh symtab */ #ifdef FINSH_USING_SYMTAB -struct finsh_syscall *_syscall_table_begin = NULL; -struct finsh_syscall *_syscall_table_end = NULL; -struct finsh_sysvar *_sysvar_table_begin = NULL; -struct finsh_sysvar *_sysvar_table_end = NULL; + struct finsh_syscall *_syscall_table_begin = NULL; + struct finsh_syscall *_syscall_table_end = NULL; #endif struct finsh_shell *shell; static char *finsh_prompt_custom = RT_NULL; #if defined(_MSC_VER) || (defined(__GNUC__) && defined(__x86_64__)) -struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call) +struct finsh_syscall *finsh_syscall_next(struct finsh_syscall *call) { unsigned int *ptr; - ptr = (unsigned int*) (call + 1); - while ((*ptr == 0) && ((unsigned int*)ptr < (unsigned int*) _syscall_table_end)) + ptr = (unsigned int *)(call + 1); + while ((*ptr == 0) && ((unsigned int *)ptr < (unsigned int *) _syscall_table_end)) ptr ++; - return (struct finsh_syscall*)ptr; + return (struct finsh_syscall *)ptr; } -struct finsh_sysvar* finsh_sysvar_next(struct finsh_sysvar* call) -{ - unsigned int *ptr; - ptr = (unsigned int*) (call + 1); - while ((*ptr == 0) && ((unsigned int*)ptr < (unsigned int*) _sysvar_table_end)) - ptr ++; - - return (struct finsh_sysvar*)ptr; -} #endif /* defined(_MSC_VER) || (defined(__GNUC__) && defined(__x86_64__)) */ #ifdef RT_USING_HEAP -int finsh_set_prompt(const char * prompt) +int finsh_set_prompt(const char *prompt) { - if(finsh_prompt_custom) + if (finsh_prompt_custom) { rt_free(finsh_prompt_custom); finsh_prompt_custom = RT_NULL; } /* strdup */ - if(prompt) + if (prompt) { - finsh_prompt_custom = (char *)rt_malloc(strlen(prompt)+1); - if(finsh_prompt_custom) + finsh_prompt_custom = (char *)rt_malloc(strlen(prompt) + 1); + if (finsh_prompt_custom) { strcpy(finsh_prompt_custom, prompt); } @@ -97,14 +84,10 @@ int finsh_set_prompt(const char * prompt) } #endif /* RT_USING_HEAP */ -#ifdef RT_USING_DFS -#include -#endif /* RT_USING_DFS */ +#define _MSH_PROMPT "msh " const char *finsh_get_prompt(void) { -#define _MSH_PROMPT "msh " -#define _PROMPT "finsh " static char finsh_prompt[RT_CONSOLEBUF_SIZE + 1] = {0}; /* check prompt mode */ @@ -114,17 +97,12 @@ const char *finsh_get_prompt(void) return finsh_prompt; } - if(finsh_prompt_custom) + if (finsh_prompt_custom) { - strncpy(finsh_prompt, finsh_prompt_custom, sizeof(finsh_prompt)-1); + strncpy(finsh_prompt, finsh_prompt_custom, sizeof(finsh_prompt) - 1); return finsh_prompt; } - -#ifdef FINSH_USING_MSH - if (msh_is_used()) strcpy(finsh_prompt, _MSH_PROMPT); - else -#endif - strcpy(finsh_prompt, _PROMPT); + strcpy(finsh_prompt, _MSH_PROMPT); #if defined(RT_USING_DFS) && defined(DFS_USING_WORKDIR) /* get current working directory */ @@ -288,7 +266,8 @@ rt_uint32_t finsh_get_echo() * @return result, RT_EOK on OK, -RT_ERROR on the new password length is less than * FINSH_PASSWORD_MIN or greater than FINSH_PASSWORD_MAX */ -rt_err_t finsh_set_password(const char *password) { +rt_err_t finsh_set_password(const char *password) +{ rt_ubase_t level; rt_size_t pw_len = rt_strlen(password); @@ -372,71 +351,12 @@ static void finsh_wait_auth(void) static void shell_auto_complete(char *prefix) { - rt_kprintf("\n"); -#ifdef FINSH_USING_MSH - if (msh_is_used() == RT_TRUE) - { - msh_auto_complete(prefix); - } - else -#endif - { -#ifndef FINSH_USING_MSH_ONLY - extern void list_prefix(char * prefix); - list_prefix(prefix); -#endif - } + msh_auto_complete(prefix); rt_kprintf("%s%s", FINSH_PROMPT, prefix); } -#ifndef FINSH_USING_MSH_ONLY -void finsh_run_line(struct finsh_parser *parser, const char *line) -{ - const char *err_str; - - if(shell->echo_mode) - rt_kprintf("\n"); - finsh_parser_run(parser, (unsigned char *)line); - - /* compile node root */ - if (finsh_errno() == 0) - { - finsh_compiler_run(parser->root); - } - else - { - err_str = finsh_error_string(finsh_errno()); - rt_kprintf("%s\n", err_str); - } - - /* run virtual machine */ - if (finsh_errno() == 0) - { - char ch; - finsh_vm_run(); - - ch = (unsigned char)finsh_stack_bottom(); - if (ch > 0x20 && ch < 0x7e) - { - rt_kprintf("\t'%c', %d, 0x%08x\n", - (unsigned char)finsh_stack_bottom(), - (unsigned int)finsh_stack_bottom(), - (unsigned int)finsh_stack_bottom()); - } - else - { - rt_kprintf("\t%d, 0x%08x\n", - (unsigned int)finsh_stack_bottom(), - (unsigned int)finsh_stack_bottom()); - } - } - - finsh_flush(parser); -} -#endif - #ifdef FINSH_USING_HISTORY static rt_bool_t shell_handle_history(struct finsh_shell *shell) { @@ -508,10 +428,6 @@ void finsh_thread_entry(void *parameter) shell->echo_mode = 0; #endif -#ifndef FINSH_USING_MSH_ONLY - finsh_init(&shell->parser); -#endif - #if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE) /* set console device as shell device */ if (shell->device == RT_NULL) @@ -694,26 +610,9 @@ void finsh_thread_entry(void *parameter) #ifdef FINSH_USING_HISTORY shell_push_history(shell); #endif - -#ifdef FINSH_USING_MSH - if (msh_is_used() == RT_TRUE) - { - if (shell->echo_mode) - rt_kprintf("\n"); - msh_exec(shell->line, shell->line_position); - } - else -#endif - { -#ifndef FINSH_USING_MSH_ONLY - /* add ';' and run the command line */ - shell->line[shell->line_position] = ';'; - - if (shell->line_position != 0) finsh_run_line(&shell->parser, shell->line); - else - if (shell->echo_mode) rt_kprintf("\n"); -#endif - } + if (shell->echo_mode) + rt_kprintf("\n"); + msh_exec(shell->line, shell->line_position); rt_kprintf(FINSH_PROMPT); memset(shell->line, 0, sizeof(shell->line)); @@ -766,23 +665,14 @@ void finsh_system_function_init(const void *begin, const void *end) _syscall_table_end = (struct finsh_syscall *) end; } -void finsh_system_var_init(const void *begin, const void *end) -{ - _sysvar_table_begin = (struct finsh_sysvar *) begin; - _sysvar_table_end = (struct finsh_sysvar *) end; -} - #if defined(__ICCARM__) || defined(__ICCRX__) /* for IAR compiler */ #ifdef FINSH_USING_SYMTAB -#pragma section="FSymTab" -#pragma section="VSymTab" + #pragma section="FSymTab" #endif #elif defined(__ADSPBLACKFIN__) /* for VisaulDSP++ Compiler*/ #ifdef FINSH_USING_SYMTAB -extern "asm" int __fsymtab_start; -extern "asm" int __fsymtab_end; -extern "asm" int __vsymtab_start; -extern "asm" int __vsymtab_end; + extern "asm" int __fsymtab_start; + extern "asm" int __fsymtab_end; #endif #elif defined(_MSC_VER) #pragma section("FSymTab$a", read) @@ -820,32 +710,21 @@ int finsh_system_init(void) #ifdef __ARMCC_VERSION /* ARM C Compiler */ extern const int FSymTab$$Base; extern const int FSymTab$$Limit; - extern const int VSymTab$$Base; - extern const int VSymTab$$Limit; finsh_system_function_init(&FSymTab$$Base, &FSymTab$$Limit); -#ifndef FINSH_USING_MSH_ONLY - finsh_system_var_init(&VSymTab$$Base, &VSymTab$$Limit); -#endif #elif defined (__ICCARM__) || defined(__ICCRX__) /* for IAR Compiler */ finsh_system_function_init(__section_begin("FSymTab"), __section_end("FSymTab")); - finsh_system_var_init(__section_begin("VSymTab"), - __section_end("VSymTab")); #elif defined (__GNUC__) || defined(__TI_COMPILER_VERSION__) || defined(__TASKING__) /* GNU GCC Compiler and TI CCS */ extern const int __fsymtab_start; extern const int __fsymtab_end; - extern const int __vsymtab_start; - extern const int __vsymtab_end; finsh_system_function_init(&__fsymtab_start, &__fsymtab_end); - finsh_system_var_init(&__vsymtab_start, &__vsymtab_end); #elif defined(__ADSPBLACKFIN__) /* for VisualDSP++ Compiler */ finsh_system_function_init(&__fsymtab_start, &__fsymtab_end); - finsh_system_var_init(&__vsymtab_start, &__vsymtab_end); #elif defined(_MSC_VER) unsigned int *ptr_begin, *ptr_end; - if(shell) + if (shell) { rt_kprintf("finsh shell already init.\n"); return RT_EOK; diff --git a/components/finsh/shell.h b/components/finsh/shell.h index 6a2737f422..b671db0849 100644 --- a/components/finsh/shell.h +++ b/components/finsh/shell.h @@ -15,20 +15,20 @@ #include "finsh.h" #ifndef FINSH_THREAD_PRIORITY -#define FINSH_THREAD_PRIORITY 20 + #define FINSH_THREAD_PRIORITY 20 #endif #ifndef FINSH_THREAD_STACK_SIZE -#define FINSH_THREAD_STACK_SIZE 2048 + #define FINSH_THREAD_STACK_SIZE 2048 #endif #ifndef FINSH_CMD_SIZE -#define FINSH_CMD_SIZE 80 + #define FINSH_CMD_SIZE 80 #endif #define FINSH_OPTION_ECHO 0x01 #define FINSH_PROMPT finsh_get_prompt() -const char* finsh_get_prompt(void); -int finsh_set_prompt(const char * prompt); +const char *finsh_get_prompt(void); +int finsh_set_prompt(const char *prompt); #ifdef FINSH_USING_HISTORY #ifndef FINSH_HISTORY_LINES @@ -49,7 +49,7 @@ int finsh_set_prompt(const char * prompt); #endif /* FINSH_USING_AUTH */ #ifndef FINSH_THREAD_NAME -#define FINSH_THREAD_NAME "tshell" + #define FINSH_THREAD_NAME "tshell" #endif enum input_stat @@ -64,7 +64,7 @@ struct finsh_shell enum input_stat stat; - rt_uint8_t echo_mode:1; + rt_uint8_t echo_mode: 1; rt_uint8_t prompt_mode: 1; #ifdef FINSH_USING_HISTORY @@ -74,10 +74,6 @@ struct finsh_shell char cmd_history[FINSH_HISTORY_LINES][FINSH_CMD_SIZE]; #endif -#ifndef FINSH_USING_MSH_ONLY - struct finsh_parser parser; -#endif - char line[FINSH_CMD_SIZE + 1]; rt_uint16_t line_position; rt_uint16_t line_curpos; @@ -95,16 +91,16 @@ void finsh_set_echo(rt_uint32_t echo); rt_uint32_t finsh_get_echo(void); int finsh_system_init(void); -void finsh_set_device(const char* device_name); -const char* finsh_get_device(void); +void finsh_set_device(const char *device_name); +const char *finsh_get_device(void); char finsh_getchar(void); rt_uint32_t finsh_get_prompt_mode(void); void finsh_set_prompt_mode(rt_uint32_t prompt_mode); #ifdef FINSH_USING_AUTH -rt_err_t finsh_set_password(const char *password); -const char *finsh_get_password(void); + rt_err_t finsh_set_password(const char *password); + const char *finsh_get_password(void); #endif #endif diff --git a/components/finsh/symbol.c b/components/finsh/symbol.c deleted file mode 100644 index c6623e2d82..0000000000 --- a/components/finsh/symbol.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2010-03-22 Bernard first version - */ - -#include - -#if defined(RT_USING_FINSH) && !defined(FINSH_USING_SYMTAB) - -#include "finsh.h" - -long hello(void); -long version(void); -long list(void); -long list_thread(void); -long list_sem(void); -long list_mutex(void); -long list_fevent(void); -long list_event(void); -long list_mailbox(void); -long list_msgqueue(void); -long list_mempool(void); -long list_timer(void); - -struct finsh_syscall _syscall_table[] = -{ - {"hello", hello}, - {"version", version}, - {"list", list}, - {"list_thread", list_thread}, -#ifdef RT_USING_SEMAPHORE - {"list_sem", list_sem}, -#endif -#ifdef RT_USING_MUTEX - {"list_mutex", list_mutex}, -#endif -#ifdef RT_USING_FEVENT - {"list_fevent", list_fevent}, -#endif -#ifdef RT_USING_EVENT - {"list_event", list_event}, -#endif -#ifdef RT_USING_MAILBOX - {"list_mb", list_mailbox}, -#endif -#ifdef RT_USING_MESSAGEQUEUE - {"list_mq", list_msgqueue}, -#endif -#ifdef RT_USING_MEMPOOL - {"list_memp", list_mempool}, -#endif - {"list_timer", list_timer}, -}; -struct finsh_syscall *_syscall_table_begin = &_syscall_table[0]; -struct finsh_syscall *_syscall_table_end = &_syscall_table[sizeof(_syscall_table) / sizeof(struct finsh_syscall)]; - -struct finsh_sysvar *_sysvar_table_begin = NULL; -struct finsh_sysvar *_sysvar_table_end = NULL; - -#endif /* RT_USING_FINSH && !FINSH_USING_SYMTAB */ - diff --git a/components/libc/compilers/armlibc/syscalls.c b/components/libc/compilers/armlibc/syscalls.c index ce4c358993..be6041a663 100644 --- a/components/libc/compilers/armlibc/syscalls.c +++ b/components/libc/compilers/armlibc/syscalls.c @@ -302,7 +302,7 @@ int remove(const char *filename) #endif } -#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) && defined(RT_USING_MODULE) && defined(RT_USING_DFS) +#if defined(RT_USING_FINSH) && defined(RT_USING_MODULE) && defined(RT_USING_DFS) /* use system(const char *string) implementation in the msh */ #else int system(const char *string) diff --git a/components/net/at/Kconfig b/components/net/at/Kconfig index 4aedbb888b..6cf7fdade6 100644 --- a/components/net/at/Kconfig +++ b/components/net/at/Kconfig @@ -68,7 +68,7 @@ if RT_USING_AT config AT_USING_CLI bool "Enable CLI(Command-Line Interface) for AT commands" default y - depends on FINSH_USING_MSH + depends on RT_USING_FINSH config AT_PRINT_RAW_CMD bool "Enable print RAW format AT command communication data" diff --git a/components/net/lwip-2.0.2/src/apps/tftp/tftp_port.c b/components/net/lwip-2.0.2/src/apps/tftp/tftp_port.c index e14e34cfec..59e64c7a3b 100644 --- a/components/net/lwip-2.0.2/src/apps/tftp/tftp_port.c +++ b/components/net/lwip-2.0.2/src/apps/tftp/tftp_port.c @@ -66,8 +66,6 @@ static void tftp_server(uint8_t argc, char **argv) } FINSH_FUNCTION_EXPORT(tftp_server, start tftp server.); -#if defined(FINSH_USING_MSH) MSH_CMD_EXPORT(tftp_server, start tftp server.); -#endif /* defined(FINSH_USING_MSH) */ #endif /* defined(RT_USING_FINSH) */ diff --git a/components/net/lwip-2.0.3/src/apps/tftp/tftp_port.c b/components/net/lwip-2.0.3/src/apps/tftp/tftp_port.c index e14e34cfec..59e64c7a3b 100644 --- a/components/net/lwip-2.0.3/src/apps/tftp/tftp_port.c +++ b/components/net/lwip-2.0.3/src/apps/tftp/tftp_port.c @@ -66,8 +66,6 @@ static void tftp_server(uint8_t argc, char **argv) } FINSH_FUNCTION_EXPORT(tftp_server, start tftp server.); -#if defined(FINSH_USING_MSH) MSH_CMD_EXPORT(tftp_server, start tftp server.); -#endif /* defined(FINSH_USING_MSH) */ #endif /* defined(RT_USING_FINSH) */ diff --git a/components/net/lwip-2.1.2/src/apps/tftp/tftp_port.c b/components/net/lwip-2.1.2/src/apps/tftp/tftp_port.c index e14e34cfec..59e64c7a3b 100644 --- a/components/net/lwip-2.1.2/src/apps/tftp/tftp_port.c +++ b/components/net/lwip-2.1.2/src/apps/tftp/tftp_port.c @@ -66,8 +66,6 @@ static void tftp_server(uint8_t argc, char **argv) } FINSH_FUNCTION_EXPORT(tftp_server, start tftp server.); -#if defined(FINSH_USING_MSH) MSH_CMD_EXPORT(tftp_server, start tftp server.); -#endif /* defined(FINSH_USING_MSH) */ #endif /* defined(RT_USING_FINSH) */ diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index c36fc6ff26..89ba58cf48 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -1075,7 +1075,7 @@ const char *ulog_global_filter_kw_get(void) return ulog.filter.keyword; } -#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) +#ifdef(RT_USING_FINSH) #include static void _print_lvl_info(void) @@ -1250,7 +1250,7 @@ static void ulog_filter(uint8_t argc, char **argv) } } MSH_CMD_EXPORT(ulog_filter, Show ulog filter settings); -#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */ +#endif defined(RT_USING_FINSH) #endif /* ULOG_USING_FILTER */ rt_err_t ulog_backend_register(ulog_backend_t backend, const char *name, rt_bool_t support_color) diff --git a/examples/file/listdir.c b/examples/file/listdir.c index 06c746a642..9649347734 100644 --- a/examples/file/listdir.c +++ b/examples/file/listdir.c @@ -67,7 +67,6 @@ void list_dir(const char* path) #include FINSH_FUNCTION_EXPORT(list_dir, list directory); -#ifdef FINSH_USING_MSH static void cmd_list_dir(int argc, char *argv[]) { char* filename; @@ -84,5 +83,4 @@ static void cmd_list_dir(int argc, char *argv[]) list_dir(filename); } MSH_CMD_EXPORT_ALIAS(cmd_list_dir, list_dir, list directory); -#endif /* FINSH_USING_MSH */ #endif /* RT_USING_FINSH */ diff --git a/examples/file/readspeed.c b/examples/file/readspeed.c index ffc19635cf..61b1a8a696 100644 --- a/examples/file/readspeed.c +++ b/examples/file/readspeed.c @@ -58,7 +58,6 @@ void readspeed(const char* filename, int block_size) #include FINSH_FUNCTION_EXPORT(readspeed, perform file read test); -#ifdef FINSH_USING_MSH static void cmd_readspeed(int argc, char *argv[]) { char* filename; @@ -83,5 +82,4 @@ static void cmd_readspeed(int argc, char *argv[]) readspeed(filename, block_size); } FINSH_FUNCTION_EXPORT_ALIAS(cmd_readspeed, __cmd_readspeed, test file system read speed); -#endif /* FINSH_USING_MSH */ #endif /* RT_USING_FINSH */ diff --git a/examples/file/readwrite.c b/examples/file/readwrite.c index 56f3b7e16c..9b27da1b01 100644 --- a/examples/file/readwrite.c +++ b/examples/file/readwrite.c @@ -147,7 +147,6 @@ __exit: /* export to finsh */ FINSH_FUNCTION_EXPORT(readwrite, perform file read and write test); -#ifdef FINSH_USING_MSH static void cmd_readwrite(int argc, char *argv[]) { char* filename; @@ -164,5 +163,4 @@ static void cmd_readwrite(int argc, char *argv[]) readwrite(filename); } FINSH_FUNCTION_EXPORT_ALIAS(cmd_readwrite, __cmd_readwrite, perform file read and write test); -#endif /* FINSH_USING_MSH */ #endif /* RT_USING_FINSH */ diff --git a/examples/file/writespeed.c b/examples/file/writespeed.c index 680761583c..8ae6f6e5a8 100644 --- a/examples/file/writespeed.c +++ b/examples/file/writespeed.c @@ -66,7 +66,6 @@ void writespeed(const char* filename, int total_length, int block_size) #include FINSH_FUNCTION_EXPORT(writespeed, perform file write test); -#ifdef FINSH_USING_MSH static void cmd_writespeed(int argc, char *argv[]) { char* filename; @@ -94,5 +93,4 @@ static void cmd_writespeed(int argc, char *argv[]) writespeed(filename, length, block_size); } FINSH_FUNCTION_EXPORT_ALIAS(cmd_writespeed, __cmd_writespeed, test file system write speed); -#endif /* FINSH_USING_MSH */ #endif /* RT_USING_FINSH */ diff --git a/examples/kernel/tc_comm.c b/examples/kernel/tc_comm.c index b98c97d9b3..0a43ca3855 100644 --- a/examples/kernel/tc_comm.c +++ b/examples/kernel/tc_comm.c @@ -25,7 +25,6 @@ static const char* _tc_current; static void (*_tc_cleanup)(void) = RT_NULL; static rt_uint32_t _tc_scale = 1; -FINSH_VAR_EXPORT(_tc_scale, finsh_type_int, the testcase timer timeout scale) static rt_uint32_t _tc_loop; diff --git a/examples/libc/termios_test.c b/examples/libc/termios_test.c index f65bff1a9f..f3a6ce3a1c 100644 --- a/examples/libc/termios_test.c +++ b/examples/libc/termios_test.c @@ -356,8 +356,8 @@ int termios_test(int argc, char **argv) #ifdef RT_USING_FINSH #include - #ifdef FINSH_USING_MSH + #ifdef RT_USING_FINSH MSH_CMD_EXPORT_ALIAS(termios_test, termtest, e.g: termtest /dev/uart4 115200); - #endif /* FINSH_USING_MSH */ + #endif /* RT_USING_FINSH */ #endif /* RT_USING_FINSH */ diff --git a/examples/test/hwtimer_test.c b/examples/test/hwtimer_test.c index 15d7aa830f..08b0c5acaf 100644 --- a/examples/test/hwtimer_test.c +++ b/examples/test/hwtimer_test.c @@ -105,7 +105,7 @@ EXIT: return err; } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH MSH_CMD_EXPORT(hwtimer, "Test hardware timer"); #endif #endif /* RT_USING_HWTIMER */ diff --git a/include/rtdef.h b/include/rtdef.h index 278676bcef..c0fcb8fce1 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -277,7 +277,6 @@ typedef int (*init_fn_t)(void); /* define these to empty, even if not include finsh.h file */ #define FINSH_FUNCTION_EXPORT(name, desc) #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) -#define FINSH_VAR_EXPORT(name, type, desc) #define MSH_CMD_EXPORT(command, desc) #define MSH_CMD_EXPORT_ALIAS(command, alias, desc) diff --git a/include/rtthread.h b/include/rtthread.h index cf47a48efe..5e02af3f9e 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -585,7 +585,7 @@ void rt_assert_handler(const char *ex, const char *func, rt_size_t line); #endif /* RT_DEBUG */ #ifdef RT_USING_FINSH -#include +#include #endif /**@}*/ -- cgit v1.3.1 From a1cc3d43e71819b3f12c3673187b6316d083ef6c Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Tue, 23 Nov 2021 22:38:00 -0500 Subject: modify time.h to sys/time.h --- bsp/bluetrum/libraries/hal_drivers/drv_rtc.c | 1 - bsp/ck802/libraries/include/drv_rtc.h | 2 +- bsp/ft2004/libraries/bsp/ft_i2c/ft_i2c_selftest.c | 2 +- bsp/imxrt/libraries/drivers/drv_rtc.c | 2 +- bsp/lpc5410x/Libraries/lpc_chip/chip_common/rtc_ut.h | 2 +- bsp/raspberry-pi/raspi3-64/driver/drv_rtc.h | 2 +- bsp/swm320-lq100/applications/main.c | 2 +- bsp/swm320/applications/main.c | 2 +- components/drivers/include/drivers/alarm.h | 3 ++- components/drivers/rtc/rtc.c | 2 +- examples/kernel/event_simple.c | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) (limited to 'examples/kernel') diff --git a/bsp/bluetrum/libraries/hal_drivers/drv_rtc.c b/bsp/bluetrum/libraries/hal_drivers/drv_rtc.c index 56c75aae59..fab2d749a8 100644 --- a/bsp/bluetrum/libraries/hal_drivers/drv_rtc.c +++ b/bsp/bluetrum/libraries/hal_drivers/drv_rtc.c @@ -11,7 +11,6 @@ */ #include "board.h" -#include #include #ifdef BSP_USING_ONCHIP_RTC diff --git a/bsp/ck802/libraries/include/drv_rtc.h b/bsp/ck802/libraries/include/drv_rtc.h index 182b3df843..b393f13fda 100644 --- a/bsp/ck802/libraries/include/drv_rtc.h +++ b/bsp/ck802/libraries/include/drv_rtc.h @@ -29,7 +29,7 @@ extern "C" { #include #include -#include +#include /// definition for rtc handle. typedef void *rtc_handle_t; diff --git a/bsp/ft2004/libraries/bsp/ft_i2c/ft_i2c_selftest.c b/bsp/ft2004/libraries/bsp/ft_i2c/ft_i2c_selftest.c index 4a43df0ce4..4be275e9ce 100644 --- a/bsp/ft2004/libraries/bsp/ft_i2c/ft_i2c_selftest.c +++ b/bsp/ft2004/libraries/bsp/ft_i2c/ft_i2c_selftest.c @@ -12,7 +12,7 @@ * ----- ------     --------    -------------------------------------- */ -#include +#include #include #include "ft_i2c_hw.h" #include "ft_i2c.h" diff --git a/bsp/imxrt/libraries/drivers/drv_rtc.c b/bsp/imxrt/libraries/drivers/drv_rtc.c index 96ae1006fa..d3f86c5e42 100644 --- a/bsp/imxrt/libraries/drivers/drv_rtc.c +++ b/bsp/imxrt/libraries/drivers/drv_rtc.c @@ -20,7 +20,7 @@ #include "drv_rtc.h" #include "fsl_snvs_hp.h" -#include +#include #if defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL #error "Please don't define 'FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL'!" diff --git a/bsp/lpc5410x/Libraries/lpc_chip/chip_common/rtc_ut.h b/bsp/lpc5410x/Libraries/lpc_chip/chip_common/rtc_ut.h index c88ca598ae..9caffc2dd6 100644 --- a/bsp/lpc5410x/Libraries/lpc_chip/chip_common/rtc_ut.h +++ b/bsp/lpc5410x/Libraries/lpc_chip/chip_common/rtc_ut.h @@ -36,7 +36,7 @@ #include "chip.h" #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/bsp/raspberry-pi/raspi3-64/driver/drv_rtc.h b/bsp/raspberry-pi/raspi3-64/driver/drv_rtc.h index 4af28efa17..35ccaf39d5 100644 --- a/bsp/raspberry-pi/raspi3-64/driver/drv_rtc.h +++ b/bsp/raspberry-pi/raspi3-64/driver/drv_rtc.h @@ -13,7 +13,7 @@ #include #include -#include +#include #include "bcm283x.h" struct rt_rtc_device diff --git a/bsp/swm320-lq100/applications/main.c b/bsp/swm320-lq100/applications/main.c index 3761e8c14d..5685bf6745 100644 --- a/bsp/swm320-lq100/applications/main.c +++ b/bsp/swm320-lq100/applications/main.c @@ -169,7 +169,7 @@ MSH_CMD_EXPORT(pwm_sample, pwm sample); #endif #ifdef RT_USING_RTC -#include +#include static int rtc_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; diff --git a/bsp/swm320/applications/main.c b/bsp/swm320/applications/main.c index 4b42c4936a..0ebd6663f6 100644 --- a/bsp/swm320/applications/main.c +++ b/bsp/swm320/applications/main.c @@ -169,7 +169,7 @@ MSH_CMD_EXPORT(pwm_sample, pwm sample); #endif #ifdef RT_USING_RTC -#include +#include static int rtc_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; diff --git a/components/drivers/include/drivers/alarm.h b/components/drivers/include/drivers/alarm.h index 11637df949..56822b72e1 100644 --- a/components/drivers/include/drivers/alarm.h +++ b/components/drivers/include/drivers/alarm.h @@ -13,7 +13,8 @@ #ifndef __ALARM_H__ #define __ALARM_H__ -#include +#include +#include #define RT_ALARM_TM_NOW -1 /* set the alarm tm_day,tm_mon,tm_sec,etc. to now.we also call it "don't care" value */ diff --git a/components/drivers/rtc/rtc.c b/components/drivers/rtc/rtc.c index 0658d2aaf4..39f82499f5 100644 --- a/components/drivers/rtc/rtc.c +++ b/components/drivers/rtc/rtc.c @@ -14,7 +14,7 @@ * 2021-07-30 Meco Man move rtc_core.c to rtc.c */ -#include +#include #include #include #include diff --git a/examples/kernel/event_simple.c b/examples/kernel/event_simple.c index 8b2f966d3d..78887b6aea 100644 --- a/examples/kernel/event_simple.c +++ b/examples/kernel/event_simple.c @@ -15,7 +15,7 @@ * 一个线程定时发送事件 (事件5) */ #include -#include +#include #include "tc_comm.h" /* 指向线程控制块的指针 */ -- cgit v1.3.1 From 0c4e7337373821161e171057b081767a60c2f892 Mon Sep 17 00:00:00 2001 From: liukangcc Date: Wed, 15 Dec 2021 10:09:31 +0800 Subject: [update] remove RT_USING_TC --- bsp/microblaze/rtconfig.h | 1 - examples/kernel/SConscript | 42 --- examples/kernel/cpuusage.c | 78 ----- examples/kernel/event_simple.c | 161 ---------- examples/kernel/heap_malloc.c | 83 ----- examples/kernel/heap_realloc.c | 111 ------- examples/kernel/mbox_send_wait.c | 150 --------- examples/kernel/mbox_simple.c | 147 --------- examples/kernel/memp_simple.c | 150 --------- examples/kernel/messageq_simple.c | 176 ----------- examples/kernel/mutex_priority.c | 434 -------------------------- examples/kernel/mutex_simple.c | 172 ---------- examples/kernel/semaphore_buffer_worker.c | 282 ----------------- examples/kernel/semaphore_dynamic.c | 144 --------- examples/kernel/semaphore_priority.c | 143 --------- examples/kernel/semaphore_producer_consumer.c | 168 ---------- examples/kernel/semaphore_static.c | 145 --------- examples/kernel/tc_comm.c | 206 ------------ examples/kernel/tc_comm.h | 52 --- examples/kernel/tc_sample.c | 71 ----- examples/kernel/thread_delay.c | 79 ----- examples/kernel/thread_delete.c | 151 --------- examples/kernel/thread_detach.c | 127 -------- examples/kernel/thread_dynamic.c | 53 ---- examples/kernel/thread_dynamic_simple.c | 98 ------ examples/kernel/thread_priority.c | 114 ------- examples/kernel/thread_resume.c | 132 -------- examples/kernel/thread_same_priority.c | 105 ------- examples/kernel/thread_static.c | 61 ---- examples/kernel/thread_static_simple.c | 108 ------- examples/kernel/thread_suspend.c | 110 ------- examples/kernel/thread_yield.c | 107 ------- examples/kernel/timer_control.c | 93 ------ examples/kernel/timer_dynamic.c | 100 ------ examples/kernel/timer_static.c | 91 ------ examples/kernel/timer_stop_self.c | 91 ------ examples/kernel/timer_timeout.c | 131 -------- 37 files changed, 4667 deletions(-) delete mode 100755 examples/kernel/SConscript delete mode 100644 examples/kernel/cpuusage.c delete mode 100644 examples/kernel/event_simple.c delete mode 100644 examples/kernel/heap_malloc.c delete mode 100644 examples/kernel/heap_realloc.c delete mode 100644 examples/kernel/mbox_send_wait.c delete mode 100644 examples/kernel/mbox_simple.c delete mode 100644 examples/kernel/memp_simple.c delete mode 100644 examples/kernel/messageq_simple.c delete mode 100755 examples/kernel/mutex_priority.c delete mode 100644 examples/kernel/mutex_simple.c delete mode 100644 examples/kernel/semaphore_buffer_worker.c delete mode 100644 examples/kernel/semaphore_dynamic.c delete mode 100644 examples/kernel/semaphore_priority.c delete mode 100644 examples/kernel/semaphore_producer_consumer.c delete mode 100644 examples/kernel/semaphore_static.c delete mode 100644 examples/kernel/tc_comm.c delete mode 100644 examples/kernel/tc_comm.h delete mode 100644 examples/kernel/tc_sample.c delete mode 100644 examples/kernel/thread_delay.c delete mode 100644 examples/kernel/thread_delete.c delete mode 100644 examples/kernel/thread_detach.c delete mode 100644 examples/kernel/thread_dynamic.c delete mode 100644 examples/kernel/thread_dynamic_simple.c delete mode 100644 examples/kernel/thread_priority.c delete mode 100644 examples/kernel/thread_resume.c delete mode 100644 examples/kernel/thread_same_priority.c delete mode 100644 examples/kernel/thread_static.c delete mode 100644 examples/kernel/thread_static_simple.c delete mode 100644 examples/kernel/thread_suspend.c delete mode 100644 examples/kernel/thread_yield.c delete mode 100644 examples/kernel/timer_control.c delete mode 100644 examples/kernel/timer_dynamic.c delete mode 100644 examples/kernel/timer_static.c delete mode 100644 examples/kernel/timer_stop_self.c delete mode 100644 examples/kernel/timer_timeout.c (limited to 'examples/kernel') diff --git a/bsp/microblaze/rtconfig.h b/bsp/microblaze/rtconfig.h index bdfe09a4f8..3fd9f8a683 100755 --- a/bsp/microblaze/rtconfig.h +++ b/bsp/microblaze/rtconfig.h @@ -87,7 +87,6 @@ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION #define FINSH_THREAD_STACK_SIZE 8192 -#define RT_USING_TC /* SECTION: a runtime libc library */ diff --git a/examples/kernel/SConscript b/examples/kernel/SConscript deleted file mode 100755 index 24d28cdd43..0000000000 --- a/examples/kernel/SConscript +++ /dev/null @@ -1,42 +0,0 @@ -from building import * - -src = Split(""" -tc_comm.c -thread_static.c -thread_dynamic.c -thread_priority.c -thread_same_priority.c -thread_static_simple.c -thread_dynamic_simple.c -thread_delete.c -thread_detach.c -thread_yield.c -thread_suspend.c -thread_resume.c -semaphore_static.c -semaphore_dynamic.c -semaphore_priority.c -semaphore_buffer_worker.c -semaphore_producer_consumer.c -mutex_simple.c -mutex_priority.c -event_simple.c -mbox_simple.c -mbox_send_wait.c -messageq_simple.c -timer_static.c -timer_dynamic.c -timer_stop_self.c -timer_control.c -timer_timeout.c -heap_malloc.c -heap_realloc.c -memp_simple.c -tc_sample.c -""") - -group = DefineGroup('Examples', src, - depend = ['RT_USING_TC'], - CPPPATH=[GetCurrentDir()]) - -Return('group') diff --git a/examples/kernel/cpuusage.c b/examples/kernel/cpuusage.c deleted file mode 100644 index 5f9d480139..0000000000 --- a/examples/kernel/cpuusage.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ -#include -#include - -#define CPU_USAGE_CALC_TICK 10 -#define CPU_USAGE_LOOP 100 - -static rt_uint8_t cpu_usage_major = 0, cpu_usage_minor= 0; -static rt_uint32_t total_count = 0; - -static void cpu_usage_idle_hook() -{ - rt_tick_t tick; - rt_uint32_t count; - volatile rt_uint32_t loop; - - if (total_count == 0) - { - /* get total count */ - rt_enter_critical(); - tick = rt_tick_get(); - while(rt_tick_get() - tick < CPU_USAGE_CALC_TICK) - { - total_count ++; - loop = 0; - while (loop < CPU_USAGE_LOOP) loop ++; - } - rt_exit_critical(); - } - - count = 0; - /* get CPU usage */ - tick = rt_tick_get(); - while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK) - { - count ++; - loop = 0; - while (loop < CPU_USAGE_LOOP) loop ++; - } - - /* calculate major and minor */ - if (count < total_count) - { - count = total_count - count; - cpu_usage_major = (count * 100) / total_count; - cpu_usage_minor = ((count * 100) % total_count) * 100 / total_count; - } - else - { - total_count = count; - - /* no CPU usage */ - cpu_usage_major = 0; - cpu_usage_minor = 0; - } -} - -void cpu_usage_get(rt_uint8_t *major, rt_uint8_t *minor) -{ - RT_ASSERT(major != RT_NULL); - RT_ASSERT(minor != RT_NULL); - - *major = cpu_usage_major; - *minor = cpu_usage_minor; -} - -void cpu_usage_init() -{ - /* set idle thread hook */ - rt_thread_idle_sethook(cpu_usage_idle_hook); -} diff --git a/examples/kernel/event_simple.c b/examples/kernel/event_simple.c deleted file mode 100644 index 78887b6aea..0000000000 --- a/examples/kernel/event_simple.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ -/* - * 程序清单:事件例程 - * - * 这个程序会创建3个动态线程及初始化一个静态事件对象 - * 一个线程等于事件对象上以接收事件; - * 一个线程定时发送事件 (事件3) - * 一个线程定时发送事件 (事件5) - */ -#include -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; -static rt_thread_t tid3 = RT_NULL; - -/* 事件控制块 */ -static struct rt_event event; - -/* 线程1入口函数 */ -static void thread1_entry(void *param) -{ - rt_uint32_t e; - - while (1) - { - /* receive first event */ - if (rt_event_recv(&event, ((1 << 3) | (1 << 5)), - RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, - RT_WAITING_FOREVER, &e) == RT_EOK) - { - rt_kprintf("thread1: AND recv event 0x%x\n", e); - } - - rt_kprintf("thread1: delay 1s to prepare second event\n"); - rt_thread_delay(10); - - /* receive second event */ - if (rt_event_recv(&event, ((1 << 3) | (1 << 5)), - RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, - RT_WAITING_FOREVER, &e) == RT_EOK) - { - rt_kprintf("thread1: OR recv event 0x%x\n", e); - } - - rt_thread_delay(5); - } -} - -/* 线程2入口函数 */ -static void thread2_entry(void *param) -{ - while (1) - { - rt_kprintf("thread2: send event1\n"); - rt_event_send(&event, (1 << 3)); - - rt_thread_delay(10); - } -} - -/* 线程3入口函数 */ -static void thread3_entry(void *param) -{ - while (1) - { - rt_kprintf("thread3: send event2\n"); - rt_event_send(&event, (1 << 5)); - - rt_thread_delay(20); - } -} - -int event_simple_init() -{ - /* 初始化事件对象 */ - rt_event_init(&event, "event", RT_IPC_FLAG_PRIO); - - /* 创建线程1 */ - tid1 = rt_thread_create("t1", - thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - rt_thread_startup(tid1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("t2", - thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - rt_thread_startup(tid2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程3 */ - tid3 = rt_thread_create("t3", - thread3_entry, RT_NULL, /* 线程入口是thread3_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid3 != RT_NULL) - rt_thread_startup(tid3); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - if (tid3 != RT_NULL && tid3->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid3); - - /* 执行事件对象脱离 */ - rt_event_detach(&event); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_event_simple() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - event_simple_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_event_simple, a simple event example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - event_simple_init(); - - return 0; -} -#endif diff --git a/examples/kernel/heap_malloc.c b/examples/kernel/heap_malloc.c deleted file mode 100644 index e2fa4511e7..0000000000 --- a/examples/kernel/heap_malloc.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -/* - * This is an example for heap malloc - */ - -static rt_bool_t mem_check(rt_uint8_t *ptr, rt_uint8_t value, rt_uint32_t len) -{ - while (len) - { - if (*ptr != value) - return RT_FALSE; - ptr ++; - len --; - } - - return RT_TRUE; -} - -static void heap_malloc_init() -{ - rt_uint8_t res = TC_STAT_PASSED; - rt_uint8_t *ptr1, *ptr2, *ptr3, *ptr4, *ptr5; - - ptr1 = rt_malloc(1); - ptr2 = rt_malloc(13); - ptr3 = rt_malloc(31); - ptr4 = rt_malloc(127); - ptr5 = rt_malloc(0); - - memset(ptr1, 1, 1); - memset(ptr2, 2, 13); - memset(ptr3, 3, 31); - memset(ptr4, 4, 127); - - if (mem_check(ptr1, 1, 1) == RT_FALSE) - res = TC_STAT_FAILED; - if (mem_check(ptr2, 2, 13) == RT_FALSE) - res = TC_STAT_FAILED; - if (mem_check(ptr3, 3, 31) == RT_FALSE) - res = TC_STAT_FAILED; - if (mem_check(ptr4, 4, 127) == RT_FALSE) - res = TC_STAT_FAILED; - - rt_free(ptr4); - rt_free(ptr3); - rt_free(ptr2); - rt_free(ptr1); - - if (ptr5 != RT_NULL) - { - rt_free(ptr5); - } - - tc_done(res); -} - -#ifdef RT_USING_TC -int _tc_heap_malloc() -{ - heap_malloc_init(); - - return 0; -} -FINSH_FUNCTION_EXPORT(_tc_heap_malloc, a heap malloc test); -#else -int rt_application_init() -{ - heap_malloc_init(); - - return 0; -} -#endif diff --git a/examples/kernel/heap_realloc.c b/examples/kernel/heap_realloc.c deleted file mode 100644 index ab603c5d8d..0000000000 --- a/examples/kernel/heap_realloc.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -/* - * This is an example for heap malloc - */ - -static rt_bool_t mem_check(rt_uint8_t *ptr, rt_uint8_t value, rt_uint32_t len) -{ - while (len) - { - if (*ptr != value) return RT_FALSE; - - ptr ++; - len --; - } - - return RT_TRUE; -} - -static void heap_realloc_init() -{ - rt_uint8_t res = TC_STAT_PASSED; - rt_uint8_t *ptr1, *ptr2, *ptr3, *ptr4, *ptr5; - - ptr1 = rt_malloc(1); - ptr2 = rt_malloc(13); - ptr3 = rt_malloc(31); - ptr4 = rt_malloc(127); - ptr5 = rt_malloc(0); - - memset(ptr1, 1, 1); - memset(ptr2, 2, 13); - memset(ptr3, 3, 31); - memset(ptr4, 4, 127); - - if (mem_check(ptr1, 1, 1) == RT_FALSE) - { - res = TC_STAT_FAILED; - goto _free; - } - if (mem_check(ptr2, 2, 13) == RT_FALSE) - { - res = TC_STAT_FAILED; - goto _free; - } - if (mem_check(ptr3, 3, 31) == RT_FALSE) - { - res = TC_STAT_FAILED; - goto _free; - } - if (mem_check(ptr4, 4, 127) == RT_FALSE) - { - res = TC_STAT_FAILED; - goto _free; - } - - ptr1 = rt_realloc(ptr1, 13); - ptr2 = rt_realloc(ptr2, 31); - ptr3 = rt_realloc(ptr3, 127); - ptr4 = rt_realloc(ptr4, 1); - ptr5 = rt_realloc(ptr5, 0); - if (ptr5) - { - rt_kprintf("realloc(ptr, 0) should return NULL\n"); - res = TC_STAT_FAILED; - } - - if (mem_check(ptr1, 1, 1) == RT_FALSE) - res = TC_STAT_FAILED; - if (mem_check(ptr2, 2, 13) == RT_FALSE) - res = TC_STAT_FAILED; - if (mem_check(ptr3, 3, 31) == RT_FALSE) - res = TC_STAT_FAILED; - if (mem_check(ptr4, 4, 1) == RT_FALSE) - res = TC_STAT_FAILED; - -_free: - rt_free(ptr4); - rt_free(ptr3); - rt_free(ptr2); - rt_free(ptr1); - - tc_done(res); -} - -#ifdef RT_USING_TC -int _tc_heap_realloc() -{ - heap_realloc_init(); - - return 0; -} -FINSH_FUNCTION_EXPORT(_tc_heap_realloc, a heap re-malloc test); -#else -int rt_application_init() -{ - heap_realloc_init(); - - return 0; -} -#endif diff --git a/examples/kernel/mbox_send_wait.c b/examples/kernel/mbox_send_wait.c deleted file mode 100644 index 919ceca31d..0000000000 --- a/examples/kernel/mbox_send_wait.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:邮箱例程_发送阻塞 - * - * 这个程序用来测试邮箱发送时候的阻塞情况。 - * - */ -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; - -/* 邮箱控制块 */ -static struct rt_mailbox mb; -/* 用于放邮件的内存池 */ -static char mb_pool[32]; - -static char mb_str1[] = "I'm a mail!"; -static char mb_str2[] = "this is another mail!"; - -/* 线程1入口 */ -static void thread1_entry(void* parameter) -{ - unsigned char* str; - - while (1) - { - /* 从邮箱中收取邮件 */ - if (rt_mb_recv(&mb, (rt_uint32_t*)&str, RT_WAITING_FOREVER) == RT_EOK) - { - rt_kprintf("thread1: get a mail from mailbox, the content:%s\n", str); - - /* 延时20个OS Tick */ - rt_thread_delay(50); - } - } -} - -/* 线程2入口 */ -static void thread2_entry(void* parameter) -{ - rt_uint8_t count; - char *str; - - count = 0; - while (1) - { - count ++; - if (count & 0x1) - { - /* 发送mb_str1地址到邮箱中 */ - str = mb_str1; - } - else - { - /* 发送mb_str2地址到邮箱中 */ - str = mb_str2; - } - - /* 不停的发送邮件,如果满了则等待10个tick,然后超时 */ - if( rt_mb_send_wait(&mb, (rt_uint32_t)str,10) == RT_EOK ) - rt_kprintf("thread2: sent a mail to mailbox, the content:%s\n", str); - else - rt_kprintf("thread2: timeout while waiting to send a mail.\n"); - } -} - -int mbox_send_wait_init() -{ - /* 初始化一个mailbox */ - rt_mb_init(&mb, - "mbt", /* 名称是mbt */ - &mb_pool[0], /* 邮箱用到的内存池是mb_pool */ - sizeof(mb_pool)/4, /* 大小是mb_pool大小除以4,因为一封邮件的大小是4字节 */ - RT_IPC_FLAG_PRIO); /* 采用PRIO方式进行线程等待 */ - - /* 创建线程1 */ - tid1 = rt_thread_create("t1", - thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - rt_thread_startup(tid1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("t2", - thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - rt_thread_startup(tid2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - - /* 执行邮箱对象脱离 */ - rt_mb_detach(&mb); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_mbox_send_wait() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - mbox_send_wait_init(); - - /* 返回TestCase运行的最长时间 */ - return 300; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_mbox_send_wait, a example of mailbox send wait); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - mbox_send_wait_init(); - - return 0; -} -#endif - diff --git a/examples/kernel/mbox_simple.c b/examples/kernel/mbox_simple.c deleted file mode 100644 index 373c5f2817..0000000000 --- a/examples/kernel/mbox_simple.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:邮箱例程 - * - * 这个程序会创建2个动态线程,一个静态的邮箱对象,其中一个线程往邮箱中发送邮件, - * 一个线程往邮箱中收取邮件。 - */ -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; - -/* 邮箱控制块 */ -static struct rt_mailbox mb; -/* 用于放邮件的内存池 */ -static char mb_pool[128]; - -static char mb_str1[] = "I'm a mail!"; -static char mb_str2[] = "this is another mail!"; - -/* 线程1入口 */ -static void thread1_entry(void* parameter) -{ - unsigned char* str; - - while (1) - { - rt_kprintf("thread1: try to recv a mail\n"); - - /* 从邮箱中收取邮件 */ - if (rt_mb_recv(&mb, (rt_uint32_t*)&str, RT_WAITING_FOREVER) == RT_EOK) - { - rt_kprintf("thread1: get a mail from mailbox, the content:%s\n", str); - - /* 延时10个OS Tick */ - rt_thread_delay(10); - } - } -} - -/* 线程2入口 */ -static void thread2_entry(void* parameter) -{ - rt_uint8_t count; - - count = 0; - while (1) - { - count ++; - if (count & 0x1) - { - /* 发送mb_str1地址到邮箱中 */ - rt_mb_send(&mb, (rt_uint32_t)&mb_str1[0]); - } - else - { - /* 发送mb_str2地址到邮箱中 */ - rt_mb_send(&mb, (rt_uint32_t)&mb_str2[0]); - } - - /* 延时20个OS Tick */ - rt_thread_delay(20); - } -} - -int mbox_simple_init() -{ - /* 初始化一个mailbox */ - rt_mb_init(&mb, - "mbt", /* 名称是mbt */ - &mb_pool[0], /* 邮箱用到的内存池是mb_pool */ - sizeof(mb_pool)/4, /* 大小是mb_pool大小除以4,因为一封邮件的大小是4字节 */ - RT_IPC_FLAG_PRIO); /* 采用PRIO方式进行线程等待 */ - - /* 创建线程1 */ - tid1 = rt_thread_create("t1", - thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - rt_thread_startup(tid1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("t2", - thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - rt_thread_startup(tid2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - - /* 执行邮箱对象脱离 */ - rt_mb_detach(&mb); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_mbox_simple() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - mbox_simple_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_mbox_simple, a simple mailbox example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - mbox_simple_init(); - - return 0; -} -#endif diff --git a/examples/kernel/memp_simple.c b/examples/kernel/memp_simple.c deleted file mode 100644 index 055db41912..0000000000 --- a/examples/kernel/memp_simple.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:内存池例程 - * - * 这个程序会创建一个静态的内存池对象,2个动态线程。两个线程会试图分别从内存池中获得 - * 内存块 - */ -#include -#include "tc_comm.h" - -static rt_uint8_t *ptr[48]; -static rt_uint8_t mempool[4096]; -static struct rt_mempool mp; - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; - -/* 线程1入口 */ -static void thread1_entry(void* parameter) -{ - int i; - char *block; - - while(1) - { - for (i = 0; i < 48; i++) - { - /* 申请内存块 */ - rt_kprintf("allocate No.%d\n", i); - if (ptr[i] == RT_NULL) - { - ptr[i] = rt_mp_alloc(&mp, RT_WAITING_FOREVER); - } - } - - /* 继续申请一个内存块,因为已经没有内存块,线程应该被挂起 */ - block = rt_mp_alloc(&mp, RT_WAITING_FOREVER); - rt_kprintf("allocate the block mem\n"); - /* 释放这个内存块 */ - rt_mp_free(block); - block = RT_NULL; - } -} - -/* 线程2入口,线程2的优先级比线程1低,应该线程1先获得执行。*/ -static void thread2_entry(void *parameter) -{ - int i; - - while(1) - { - rt_kprintf("try to release block\n"); - - for (i = 0 ; i < 48; i ++) - { - /* 释放所有分配成功的内存块 */ - if (ptr[i] != RT_NULL) - { - rt_kprintf("release block %d\n", i); - - rt_mp_free(ptr[i]); - ptr[i] = RT_NULL; - } - } - - /* 休眠10个OS Tick */ - rt_thread_delay(10); - } -} - -int mempool_simple_init() -{ - int i; - for (i = 0; i < 48; i ++) ptr[i] = RT_NULL; - - /* 初始化内存池对象 */ - rt_mp_init(&mp, "mp1", &mempool[0], sizeof(mempool), 80); - - /* 创建线程1 */ - tid1 = rt_thread_create("t1", - thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - rt_thread_startup(tid1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("t2", - thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - rt_thread_startup(tid2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - - /* 执行内存池脱离 */ - rt_mp_detach(&mp); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_mempool_simple() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - mempool_simple_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_mempool_simple, a memory pool example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - mempool_simple_init(); - - return 0; -} -#endif diff --git a/examples/kernel/messageq_simple.c b/examples/kernel/messageq_simple.c deleted file mode 100644 index 90bed7dd82..0000000000 --- a/examples/kernel/messageq_simple.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:消息队列例程 - * - * 这个程序会创建3个动态线程,一个线程会从消息队列中收取消息;一个线程会定时给消 - * 息队列发送消息;一个线程会定时给消息队列发送紧急消息。 - */ -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; -static rt_thread_t tid3 = RT_NULL; - -/* 消息队列控制块 */ -static struct rt_messagequeue mq; -/* 消息队列中用到的放置消息的内存池 */ -static char msg_pool[2048]; - -/* 线程1入口函数 */ -static void thread1_entry(void* parameter) -{ - char buf[128]; - - while (1) - { - rt_memset(&buf[0], 0, sizeof(buf)); - - /* 从消息队列中接收消息 */ - if (rt_mq_recv(&mq, &buf[0], sizeof(buf), RT_WAITING_FOREVER) == RT_EOK) - { - rt_kprintf("thread1: recv msg from message queue, the content:%s\n", buf); - } - - /* 延迟10个OS Tick */ - rt_thread_delay(10); - } -} - -/* 线程2入口函数 */ -static void thread2_entry(void* parameter) -{ - int i, result; - char buf[] = "this is message No.x"; - - while (1) - { - for (i = 0; i < 10; i++) - { - buf[sizeof(buf) - 2] = '0' + i; - - rt_kprintf("thread2: send message - %s\n", buf); - /* 发送消息到消息队列中 */ - result = rt_mq_send(&mq, &buf[0], sizeof(buf)); - if ( result == -RT_EFULL) - { - /* 消息队列满, 延迟1s时间 */ - rt_kprintf("message queue full, delay 1s\n"); - rt_thread_delay(100); - } - } - - /* 延时10个OS Tick */ - rt_thread_delay(10); - } -} - -/* 线程3入口函数 */ -static void thread3_entry(void* parameter) -{ - char buf[] = "this is an urgent message!"; - - while (1) - { - rt_kprintf("thread3: send an urgent message\n"); - - /* 发送紧急消息到消息队列中 */ - rt_mq_urgent(&mq, &buf[0], sizeof(buf)); - - /* 延时25个OS Tick */ - rt_thread_delay(25); - } -} - -int messageq_simple_init() -{ - /* 初始化消息队列 */ - rt_mq_init(&mq, "mqt", - &msg_pool[0], /* 内存池指向msg_pool */ - 128 - sizeof(void*), /* 每个消息的大小是 128 - void* */ - sizeof(msg_pool), /* 内存池的大小是msg_pool的大小 */ - RT_IPC_FLAG_PRIO); /* 如果有多个线程等待,按照优先级由高到低的方法分配消息 */ - - /* 创建线程1 */ - tid1 = rt_thread_create("t1", - thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - rt_thread_startup(tid1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("t2", - thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - rt_thread_startup(tid2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程3 */ - tid3 = rt_thread_create("t3", - thread3_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid3 != RT_NULL) - rt_thread_startup(tid3); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - if (tid3 != RT_NULL && tid3->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid3); - - /* 执行消息队列对象脱离 */ - rt_mq_detach(&mq); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_messageq_simple() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - messageq_simple_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_messageq_simple, a simple message queue example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - messageq_simple_init(); - - return 0; -} -#endif diff --git a/examples/kernel/mutex_priority.c b/examples/kernel/mutex_priority.c deleted file mode 100755 index a7702eed6f..0000000000 --- a/examples/kernel/mutex_priority.c +++ /dev/null @@ -1,434 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 创建7个进程,tid20、tid21、tid22、tid23、tid24、tid25、tid26、tid27、tid28、tid29 - * 各任务优先级分别为20、21、22、23、24、25、26、27、28、29, - * 其中tid26最先获得锁,tid22不需要使用到互斥锁,其他所有进程均需要使用互斥锁, - * 通过各个进程的打印信息,观察各个进程获取到互斥锁后,优先级变化情况 - */ -#include -#include "tc_comm.h" - -static rt_thread_t tid20 = RT_NULL; -static rt_thread_t tid21 = RT_NULL; -static rt_thread_t tid22 = RT_NULL; -static rt_thread_t tid23 = RT_NULL; -static rt_thread_t tid24 = RT_NULL; -static rt_thread_t tid25 = RT_NULL; -static rt_thread_t tid26 = RT_NULL; -static rt_thread_t tid27 = RT_NULL; -static rt_thread_t tid28 = RT_NULL; -static rt_thread_t tid29 = RT_NULL; - -static rt_mutex_t mutex = RT_NULL; - -static void thread20_entry(void* parameter) -{ - rt_err_t result; - rt_tick_t tick; - - rt_kprintf("[%d] thread20 run!\n", rt_tick_get()); - rt_thread_delay(30); - rt_kprintf("[%d] thread20 wake!\n", rt_tick_get()); - - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - rt_kprintf("[%d] thread20 take!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 5) - { - rt_kprintf("[%d] thread20, init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid20->init_priority, tid20->current_priority); - } - rt_mutex_release(mutex); - rt_kprintf("[%d] thread20 exit!\n", rt_tick_get()); -} - -static void thread21_entry(void* parameter) -{ - rt_err_t result; - rt_tick_t tick; - rt_kprintf("[%d] thread21 run!\n", rt_tick_get()); - rt_thread_delay(25); - rt_kprintf("[%d] thread21 wake!\n", rt_tick_get()); - - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - rt_kprintf("[%d] thread21 take!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 5) - { - rt_kprintf("[%d] thread21, init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid21->init_priority, tid21->current_priority); - } - rt_mutex_release(mutex); - rt_kprintf("[%d] thread21 exit!\n", rt_tick_get()); - -} - -static void thread22_entry(void* parameter) -{ - rt_tick_t tick; - - rt_kprintf("[%d] thread22 run!\n", rt_tick_get()); - rt_thread_delay(20); - rt_kprintf("[%d] thread22 wake!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 100) - { - rt_kprintf("[%d] thread22 running..., init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid22->init_priority, tid22->current_priority); - rt_thread_delay(2); - } - rt_kprintf("[%d] thread22 exit!\n", rt_tick_get()); -} - -static void thread23_entry(void* parameter) -{ - rt_err_t result; - rt_tick_t tick; - rt_kprintf("[%d] thread23 run!\n", rt_tick_get()); - rt_thread_delay(15); - rt_kprintf("[%d] thread23 wake!\n", rt_tick_get()); - - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - rt_kprintf("[%d] thread23 take!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 5) - { - rt_kprintf("[%d] thread23, init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid23->init_priority, tid23->current_priority); - } - rt_mutex_release(mutex); - rt_kprintf("[%d] thread23 exit!\n", rt_tick_get()); -} - -static void thread24_entry(void* parameter) -{ - rt_err_t result; - rt_tick_t tick; - - rt_kprintf("[%d] thread24 run!\n", rt_tick_get()); - rt_thread_delay(10); - rt_kprintf("[%d] thread24 wake!\n", rt_tick_get()); - - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - rt_kprintf("[%d] thread24 take!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 5) - { - rt_kprintf("[%d] thread24, init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid24->init_priority, tid24->current_priority); - } - rt_mutex_release(mutex); - rt_kprintf("[%d] thread24 exit!\n", rt_tick_get()); -} - -static void thread25_entry(void* parameter) -{ - rt_err_t result; - rt_tick_t tick; - rt_kprintf("[%d] thread25 run!\n", rt_tick_get()); - rt_thread_delay(5); - rt_kprintf("[%d] thread25 wake!\n", rt_tick_get()); - - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - rt_kprintf("[%d] thread25 take!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 5) - { - rt_kprintf("[%d] thread25, init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid25->init_priority, tid25->current_priority); - } - rt_mutex_release(mutex); - rt_kprintf("[%d] thread25 exit!\n", rt_tick_get()); -} - -static void thread26_entry(void* parameter) -{ - rt_tick_t tick; - rt_err_t result; - - rt_kprintf("[%d] thread26 run!\n", rt_tick_get()); - - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - rt_kprintf("[%d] thread26 take!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 50) - { - rt_kprintf("[%d] thread26, init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid26->init_priority, tid26->current_priority); - rt_thread_delay(1); - } - rt_mutex_release(mutex); - rt_kprintf("[%d] thread26 exit!\n", rt_tick_get()); -} - -static void thread27_entry(void* parameter) -{ - rt_tick_t tick; - rt_err_t result; - - rt_kprintf("[%d] thread27 run!\n", rt_tick_get()); - rt_thread_delay(35); - rt_kprintf("[%d] thread27 wake!\n", rt_tick_get()); - - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - rt_kprintf("[%d] thread27 take!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 5) - { - rt_kprintf("[%d] thread27, init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid27->init_priority, tid27->current_priority); - } - rt_mutex_release(mutex); - rt_kprintf("[%d] thread27 exit!\n", rt_tick_get()); -} - -static void thread28_entry(void* parameter) -{ - rt_tick_t tick; - rt_err_t result; - - rt_kprintf("[%d] thread28 run!\n", rt_tick_get()); - rt_thread_delay(40); - rt_kprintf("[%d] thread28 wake!\n", rt_tick_get()); - - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - rt_kprintf("[%d] thread28 take!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 5) - { - rt_kprintf("[%d] thread28, init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid28->init_priority, tid28->current_priority); - } - rt_mutex_release(mutex); - rt_kprintf("[%d] thread28 exit!\n", rt_tick_get()); -} - -static void thread29_entry(void* parameter) -{ - rt_tick_t tick; - rt_err_t result; - - rt_kprintf("[%d] thread29 run!\n", rt_tick_get()); - rt_thread_delay(45); - rt_kprintf("[%d] thread29 wake!\n", rt_tick_get()); - - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - rt_kprintf("[%d] thread29 take!\n", rt_tick_get()); - - tick = rt_tick_get(); - while (rt_tick_get() - tick < 5) - { - rt_kprintf("[%d] thread29, init_priority=%d, current_priority=%d\n", - rt_tick_get(), tid29->init_priority, tid29->current_priority); - } - rt_mutex_release(mutex); - rt_kprintf("[%d] thread29 exit!\n", rt_tick_get()); -} - -static int mutex_simple_init() -{ - /* 创建互斥锁 */ - mutex = rt_mutex_create("mutex", RT_IPC_FLAG_PRIO); - if (mutex == RT_NULL) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - return 0; - } - - tid29 = rt_thread_create("t29", - thread29_entry, RT_NULL, - THREAD_STACK_SIZE, 29, THREAD_TIMESLICE); - if (tid29 != RT_NULL) - rt_thread_startup(tid29); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - tid28 = rt_thread_create("t28", - thread28_entry, RT_NULL, - THREAD_STACK_SIZE, 28, THREAD_TIMESLICE); - if (tid28 != RT_NULL) - rt_thread_startup(tid28); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - tid27 = rt_thread_create("t27", - thread27_entry, RT_NULL, - THREAD_STACK_SIZE, 27, THREAD_TIMESLICE); - if (tid27 != RT_NULL) - rt_thread_startup(tid27); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - tid26 = rt_thread_create("t26", - thread26_entry, RT_NULL, - THREAD_STACK_SIZE, 26, THREAD_TIMESLICE); - if (tid26 != RT_NULL) - rt_thread_startup(tid26); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - tid25 = rt_thread_create("t25", - thread25_entry, RT_NULL, - THREAD_STACK_SIZE, 25, THREAD_TIMESLICE); - if (tid25 != RT_NULL) - rt_thread_startup(tid25); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - tid24 = rt_thread_create("t24", - thread24_entry, RT_NULL, - THREAD_STACK_SIZE, 24, THREAD_TIMESLICE); - if (tid24 != RT_NULL) - rt_thread_startup(tid24); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - tid23 = rt_thread_create("t23", - thread23_entry, RT_NULL, - THREAD_STACK_SIZE, 23, THREAD_TIMESLICE); - if (tid23 != RT_NULL) - rt_thread_startup(tid23); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - tid22 = rt_thread_create("t22", - thread22_entry, RT_NULL, - THREAD_STACK_SIZE, 22, THREAD_TIMESLICE); - if (tid22 != RT_NULL) - rt_thread_startup(tid22); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - tid21 = rt_thread_create("t21", - thread21_entry, RT_NULL, - THREAD_STACK_SIZE, 21, THREAD_TIMESLICE); - if (tid21 != RT_NULL) - rt_thread_startup(tid21); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - tid20 = rt_thread_create("t20", - thread20_entry, RT_NULL, - THREAD_STACK_SIZE, 20, THREAD_TIMESLICE); - if (tid20 != RT_NULL) - rt_thread_startup(tid20); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid20 != RT_NULL && tid20->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid20); - if (tid21 != RT_NULL && tid21->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid21); - if (tid22 != RT_NULL && tid22->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid22); - if (tid23 != RT_NULL && tid23->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid23); - if (tid24 != RT_NULL && tid24->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid24); - if (tid25 != RT_NULL && tid25->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid25); - if (tid26 != RT_NULL && tid26->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid26); - if (tid27 != RT_NULL && tid27->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid27); - if (tid28 != RT_NULL && tid28->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid28); - if (tid29 != RT_NULL && tid29->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid29); - - if (mutex != RT_NULL) - { - rt_mutex_delete(mutex); - } - rt_kprintf("test_done!\n"); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_mutex_priority() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - mutex_simple_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_mutex_priority, a priority rollover example of mutex); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - mutex_simple_init(); - - return 0; -} -#endif diff --git a/examples/kernel/mutex_simple.c b/examples/kernel/mutex_simple.c deleted file mode 100644 index ee875cca7d..0000000000 --- a/examples/kernel/mutex_simple.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; -static rt_thread_t tid3 = RT_NULL; -static rt_mutex_t mutex = RT_NULL; - -/* 线程1入口 */ -static void thread1_entry(void* parameter) -{ - /* 先让低优先级线程运行 */ - rt_thread_delay(10); - - /* 此时thread3持有mutex,并且thread2等待持有mutex */ - - /* 检查thread2与thread3的优先级情况 */ - if (tid2->current_priority != tid3->current_priority) - { - /* 优先级不相同,测试失败 */ - tc_stat(TC_STAT_END | TC_STAT_FAILED); - return; - } -} - -/* 线程2入口 */ -static void thread2_entry(void* parameter) -{ - rt_err_t result; - - /* 先让低优先级线程运行 */ - rt_thread_delay(5); - - while (1) - { - /* - * 试图持有互斥锁,此时thread3持有,应把thread3的优先级提升到thread2相同 - * 的优先级 - */ - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - - if (result == RT_EOK) - { - /* 释放互斥锁 */ - rt_mutex_release(mutex); - } - } -} - -/* 线程3入口 */ -static void thread3_entry(void* parameter) -{ - rt_tick_t tick; - rt_err_t result; - - while (1) - { - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - result = rt_mutex_take(mutex, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - } - - /* 做一个长时间的循环,总共50个OS Tick */ - tick = rt_tick_get(); - while (rt_tick_get() - tick < 50) ; - - rt_mutex_release(mutex); - rt_mutex_release(mutex); - } -} - -int mutex_simple_init() -{ - /* 创建互斥锁 */ - mutex = rt_mutex_create("mutex", RT_IPC_FLAG_PRIO); - if (mutex == RT_NULL) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - return 0; - } - - /* 创建线程1 */ - tid1 = rt_thread_create("t1", - thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - rt_thread_startup(tid1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("t2", - thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - rt_thread_startup(tid2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程3 */ - tid3 = rt_thread_create("t3", - thread3_entry, RT_NULL, /* 线程入口是thread3_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE); - if (tid3 != RT_NULL) - rt_thread_startup(tid3); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - if (tid3 != RT_NULL && tid3->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid3); - - if (mutex != RT_NULL) - { - rt_mutex_delete(mutex); - } - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_mutex_simple() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - mutex_simple_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_mutex_simple, sime mutex example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - mutex_simple_init(); - - return 0; -} -#endif diff --git a/examples/kernel/semaphore_buffer_worker.c b/examples/kernel/semaphore_buffer_worker.c deleted file mode 100644 index bd5a488460..0000000000 --- a/examples/kernel/semaphore_buffer_worker.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:信号量实现生产者消费者间的互斥 - * - * 在这个程序中,会创建两个线程,一个是生成者线程worker一个是消费者线程thread - * - * 在数据信息生产、消费的过程中,worker负责把数据将写入到环形buffer中,而thread - * 则从环形buffer中读出。 - */ -#include -#include "tc_comm.h" - -/* 一个环形buffer的实现 */ -struct rb -{ - rt_uint16_t read_index, write_index; - rt_uint8_t *buffer_ptr; - rt_uint16_t buffer_size; -}; - -/* 指向信号量控制块的指针 */ -static rt_sem_t sem = RT_NULL; -/* 指向线程控制块的指针 */ -static rt_thread_t tid = RT_NULL, worker = RT_NULL; - -/* 环形buffer的内存块(用数组体现出来) */ -#define BUFFER_SIZE 256 -#define BUFFER_ITEM 32 -static rt_uint8_t working_buffer[BUFFER_SIZE]; -struct rb working_rb; - -/* 初始化环形buffer,size指的是buffer的大小。注:这里并没对数据地址对齐做处理 */ -static void rb_init(struct rb* rb, rt_uint8_t *pool, rt_uint16_t size) -{ - RT_ASSERT(rb != RT_NULL); - - /* 对读写指针清零*/ - rb->read_index = rb->write_index = 0; - - /* 设置环形buffer的内存数据块 */ - rb->buffer_ptr = pool; - rb->buffer_size = size; -} - -/* 向环形buffer中写入数据 */ -static rt_bool_t rb_put(struct rb* rb, const rt_uint8_t *ptr, rt_uint16_t length) -{ - rt_size_t size; - - /* 判断是否有足够的剩余空间 */ - if (rb->read_index > rb->write_index) - size = rb->read_index - rb->write_index; - else - size = rb->buffer_size - rb->write_index + rb->read_index; - - /* 没有多余的空间 */ - if (size < length) return RT_FALSE; - - if (rb->read_index > rb->write_index) - { - /* read_index - write_index 即为总的空余空间 */ - memcpy(&rb->buffer_ptr[rb->write_index], ptr, length); - rb->write_index += length; - } - else - { - if (rb->buffer_size - rb->write_index > length) - { - /* write_index 后面剩余的空间有足够的长度 */ - memcpy(&rb->buffer_ptr[rb->write_index], ptr, length); - rb->write_index += length; - } - else - { - /* - * write_index 后面剩余的空间不存在足够的长度,需要把部分数据复制到 - * 前面的剩余空间中 - */ - memcpy(&rb->buffer_ptr[rb->write_index], ptr, - rb->buffer_size - rb->write_index); - memcpy(&rb->buffer_ptr[0], &ptr[rb->buffer_size - rb->write_index], - length - (rb->buffer_size - rb->write_index)); - rb->write_index = length - (rb->buffer_size - rb->write_index); - } - } - - return RT_TRUE; -} - -/* 从环形buffer中读出数据 */ -static rt_bool_t rb_get(struct rb* rb, rt_uint8_t *ptr, rt_uint16_t length) -{ - rt_size_t size; - - /* 判断是否有足够的数据 */ - if (rb->read_index > rb->write_index) - size = rb->buffer_size - rb->read_index + rb->write_index; - else - size = rb->write_index - rb->read_index; - - /* 没有足够的数据 */ - if (size < length) return RT_FALSE; - - if (rb->read_index > rb->write_index) - { - if (rb->buffer_size - rb->read_index > length) - { - /* read_index的数据足够多,直接复制 */ - memcpy(ptr, &rb->buffer_ptr[rb->read_index], length); - rb->read_index += length; - } - else - { - /* read_index的数据不够,需要分段复制 */ - memcpy(ptr, &rb->buffer_ptr[rb->read_index], - rb->buffer_size - rb->read_index); - memcpy(&ptr[rb->buffer_size - rb->read_index], &rb->buffer_ptr[0], - length - rb->buffer_size + rb->read_index); - rb->read_index = length - rb->buffer_size + rb->read_index; - } - } - else - { - /* - * read_index要比write_index小,总的数据量够(前面已经有总数据量的判 - * 断),直接复制出数据。 - */ - memcpy(ptr, &rb->buffer_ptr[rb->read_index], length); - rb->read_index += length; - } - - return RT_TRUE; -} - -/* 生产者线程入口 */ -static void thread_entry(void* parameter) -{ - rt_bool_t result; - rt_uint8_t data_buffer[BUFFER_ITEM + 1]; - - while (1) - { - /* 持有信号量 */ - rt_sem_take(sem, RT_WAITING_FOREVER); - /* 从环buffer中获得数据 */ - result = rb_get(&working_rb, &data_buffer[0], BUFFER_ITEM); - /* 释放信号量 */ - rt_sem_release(sem); - data_buffer[BUFFER_ITEM] = '\0'; - - if (result == RT_TRUE) - { - /* 获取数据成功,打印数据 */ - rt_kprintf("%s\n", data_buffer); - } - - /* 做一个5 OS Tick的休眠 */ - rt_thread_delay(5); - } -} - -/* worker线程入口 */ -static void worker_entry(void* parameter) -{ - rt_bool_t result; - rt_uint32_t index, setchar; - rt_uint8_t data_buffer[BUFFER_ITEM]; - - setchar = 0x21; - while (1) - { - /* 构造数据 */ - for(index = 0; index < BUFFER_ITEM; index++) - { - data_buffer[index] = setchar; - if (++setchar == 0x7f) - setchar = 0x21; - } - - /* 持有信号量 */ - rt_sem_take(sem, RT_WAITING_FOREVER); - - /* 把数据放到环形buffer中 */ - result = rb_put(&working_rb, &data_buffer[0], BUFFER_ITEM); - if (result == RT_FALSE) - { - rt_kprintf("put error\n"); - } - - /* 释放信号量 */ - rt_sem_release(sem); - - /* 放入成功,做一个10 OS Tick的休眠 */ - rt_thread_delay(10); - } -} - -int semaphore_buffer_worker_init() -{ - /* 初始化ring buffer */ - rb_init(&working_rb, working_buffer, BUFFER_SIZE); - - /* 创建信号量 */ - sem = rt_sem_create("sem", 1, RT_IPC_FLAG_PRIO); - if (sem == RT_NULL) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - return 0; - } - - /* 创建线程1 */ - tid = rt_thread_create("thread", - thread_entry, RT_NULL, /* 线程入口是thread_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid != RT_NULL) - rt_thread_startup(tid); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - worker = rt_thread_create("worker", - worker_entry, RT_NULL, /* 线程入口是worker_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (worker != RT_NULL) - rt_thread_startup(worker); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除信号量 */ - if (sem != RT_NULL) - rt_sem_delete(sem); - - /* 删除线程 */ - if (tid != RT_NULL && tid->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid); - if (worker != RT_NULL && worker->stat != RT_THREAD_CLOSE) - rt_thread_delete(worker); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_semaphore_buffer_worker() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - semaphore_buffer_worker_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_semaphore_buffer_worker, a buffer worker with semaphore example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - semaphore_buffer_worker_init(); - - return 0; -} -#endif diff --git a/examples/kernel/semaphore_dynamic.c b/examples/kernel/semaphore_dynamic.c deleted file mode 100644 index dacdf10c37..0000000000 --- a/examples/kernel/semaphore_dynamic.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:动态信号量 - * - * 这个例子中将创建一个动态信号量(初始值为0 )及一个动态线程,在这个动态线程中 - * 将试图采用超时方式去持有信号量,应该超时返回。然后这个线程释放一次信号量,并 - * 在后面继续采用永久等待方式去持有信号量, 成功获得信号量后返回。 - */ -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid = RT_NULL; -/* 指向信号量的指针 */ -static rt_sem_t sem = RT_NULL; -/* 线程入口 */ -static void thread_entry(void* parameter) -{ - rt_err_t result; - rt_tick_t tick; - - /* 获得当前的OS Tick */ - tick = rt_tick_get(); - - /* 试图持有一个信号量,如果10个OS Tick依然没拿到,则超时返回 */ - result = rt_sem_take(sem, 10); - if (result == -RT_ETIMEOUT) - { - rt_tick_t new_tick = rt_tick_get(); - /* 可以有两个 tick 的误差 */ - if (new_tick - tick >= 12) - { - rt_kprintf("tick error to large: expect: 10, get %d\n", - new_tick - tick); - - /* 如果失败,则测试失败 */ - tc_done(TC_STAT_FAILED); - rt_sem_delete(sem); - return; - } - rt_kprintf("take semaphore timeout\n"); - } - else - { - /* 因为并没释放信号量,应该是超时返回,否则测试失败 */ - tc_done(TC_STAT_FAILED); - rt_sem_delete(sem); - return; - } - - /* 释放一次信号量 */ - rt_sem_release(sem); - - /* 继续持有信号量,并永远等待直到持有到信号量 */ - result = rt_sem_take(sem, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - /* 返回不正确,测试失败 */ - tc_done(TC_STAT_FAILED); - rt_sem_delete(sem); - return; - } - - /* 测试成功 */ - tc_done(TC_STAT_PASSED); - /* 删除信号量 */ - rt_sem_delete(sem); -} - -int semaphore_dynamic_init() -{ - /* 创建一个信号量,初始值是0 */ - sem = rt_sem_create("sem", 0, RT_IPC_FLAG_PRIO); - if (sem == RT_NULL) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - return 0; - } - - /* 创建线程 */ - tid = rt_thread_create("thread", - thread_entry, RT_NULL, /* 线程入口是thread_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid != RT_NULL) - rt_thread_startup(tid); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - if (sem) - { - rt_sem_delete(sem); - sem = RT_NULL; - } - - /* 删除线程 */ - if (tid != RT_NULL && tid->stat != RT_THREAD_CLOSE) - { - rt_thread_delete(tid); - } - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_semaphore_dynamic() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - semaphore_dynamic_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_semaphore_dynamic, a dynamic semaphore example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - semaphore_dynamic_init(); - - return 0; -} -#endif diff --git a/examples/kernel/semaphore_priority.c b/examples/kernel/semaphore_priority.c deleted file mode 100644 index 7e37a826cb..0000000000 --- a/examples/kernel/semaphore_priority.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -static rt_sem_t sem; -static rt_uint8_t t1_count, t2_count; -static rt_thread_t t1, t2, worker; -static void thread1_entry(void* parameter) -{ - rt_err_t result; - - while (1) - { - result = rt_sem_take(sem, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_done(TC_STAT_FAILED); - return; - } - - t1_count ++; - rt_kprintf("thread1: got semaphore, count: %d\n", t1_count); - } -} - -static void thread2_entry(void* parameter) -{ - rt_err_t result; - - while (1) - { - result = rt_sem_take(sem, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - tc_done(TC_STAT_FAILED); - return; - } - - t2_count ++; - rt_kprintf("thread2: got semaphore, count: %d\n", t2_count); - } -} - -static void worker_thread_entry(void* parameter) -{ - rt_thread_delay(10); - - while (1) - { - rt_sem_release(sem); - rt_thread_delay(5); - } -} - -int semaphore_priority_init() -{ - sem = rt_sem_create("sem", 0, RT_IPC_FLAG_PRIO); - if (sem == RT_NULL) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - return 0; - } - - t1_count = t2_count = 0; - - t1 = rt_thread_create("t1", - thread1_entry, RT_NULL, - THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE); - if (t1 != RT_NULL) - rt_thread_startup(t1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - t2 = rt_thread_create("t2", - thread2_entry, RT_NULL, - THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE); - if (t2 != RT_NULL) - rt_thread_startup(t2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - worker = rt_thread_create("worker", - worker_thread_entry, RT_NULL, - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (worker != RT_NULL) - rt_thread_startup(worker); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* lock scheduler */ - rt_enter_critical(); - - /* delete t1, t2 and worker thread */ - rt_thread_delete(t1); - rt_thread_delete(t2); - rt_thread_delete(worker); - - if (sem) - { - rt_sem_delete(sem); - sem = RT_NULL; - } - - if (t1_count > t2_count) - tc_done(TC_STAT_FAILED); - else - tc_done(TC_STAT_PASSED); - - /* unlock scheduler */ - rt_exit_critical(); -} - -int _tc_semaphore_priority() -{ - /* set tc cleanup */ - tc_cleanup(_tc_cleanup); - semaphore_priority_init(); - - return 50; -} -FINSH_FUNCTION_EXPORT(_tc_semaphore_priority, a priority semaphore test); -#else -int rt_application_init() -{ - semaphore_priority_init(); - - return 0; -} -#endif diff --git a/examples/kernel/semaphore_producer_consumer.c b/examples/kernel/semaphore_producer_consumer.c deleted file mode 100644 index 4d9eb24e44..0000000000 --- a/examples/kernel/semaphore_producer_consumer.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:生产者消费者例子 - * - * 这个例子中将创建两个线程用于实现生产者消费者问题 - */ -#include -#include "tc_comm.h" - -/* 定义最大5个元素能够被产生 */ -#define MAXSEM 5 - -/* 用于放置生产的整数数组 */ -rt_uint32_t array[MAXSEM]; -/* 指向生产者、消费者在array数组中的读写位置 */ -static rt_uint32_t set, get; - -/* 指向线程控制块的指针 */ -static rt_thread_t producer_tid = RT_NULL; -static rt_thread_t consumer_tid = RT_NULL; - -struct rt_semaphore sem_lock; -struct rt_semaphore sem_empty, sem_full; - -/* 生成者线程入口 */ -void producer_thread_entry(void* parameter) -{ - int cnt = 0; - - /* 运行100次 */ - while( cnt < 100) - { - /* 获取一个空位 */ - rt_sem_take(&sem_empty, RT_WAITING_FOREVER); - - /* 修改array内容,上锁 */ - rt_sem_take(&sem_lock, RT_WAITING_FOREVER); - array[set%MAXSEM] = cnt + 1; - rt_kprintf("the producer generates a number: %d\n", array[set%MAXSEM]); - set++; - rt_sem_release(&sem_lock); - - /* 发布一个满位 */ - rt_sem_release(&sem_full); - cnt++; - - /* 暂停一段时间 */ - rt_thread_delay(50); - } - - rt_kprintf("the producer exit!\n"); -} - -/* 消费者线程入口 */ -void consumer_thread_entry(void* parameter) -{ - rt_uint32_t no; - rt_uint32_t sum; - - /* 第n个线程,由入口参数传进来 */ - no = (rt_uint32_t)parameter; - - sum = 0; - while(1) - { - /* 获取一个满位 */ - rt_sem_take(&sem_full, RT_WAITING_FOREVER); - - /* 临界区,上锁进行操作 */ - rt_sem_take(&sem_lock, RT_WAITING_FOREVER); - sum += array[get%MAXSEM]; - rt_kprintf("the consumer[%d] get a number: %d\n", no, array[get%MAXSEM] ); - get++; - rt_sem_release(&sem_lock); - - /* 释放一个空位 */ - rt_sem_release(&sem_empty); - - /* 生产者生产到100个数目,停止,消费者线程相应停止 */ - if (get == 100) break; - - /* 暂停一小会时间 */ - rt_thread_delay(10); - } - - rt_kprintf("the consumer[%d] sum is %d \n ", no, sum); - rt_kprintf("the consumer[%d] exit!\n"); -} - -int semaphore_producer_consumer_init() -{ - /* 初始化3个信号量 */ - rt_sem_init(&sem_lock , "lock", 1, RT_IPC_FLAG_PRIO); - rt_sem_init(&sem_empty, "empty", MAXSEM, RT_IPC_FLAG_PRIO); - rt_sem_init(&sem_full , "full", 0, RT_IPC_FLAG_PRIO); - - /* 创建线程1 */ - producer_tid = rt_thread_create("producer", - producer_thread_entry, RT_NULL, /* 线程入口是producer_thread_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE); - if (producer_tid != RT_NULL) - rt_thread_startup(producer_tid); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - consumer_tid = rt_thread_create("consumer", - consumer_thread_entry, RT_NULL, /* 线程入口是consumer_thread_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE); - if (consumer_tid != RT_NULL) - rt_thread_startup(consumer_tid); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - rt_sem_detach(&sem_lock); - rt_sem_detach(&sem_empty); - rt_sem_detach(&sem_full); - - /* 删除线程 */ - if (producer_tid != RT_NULL && producer_tid->stat != RT_THREAD_CLOSE) - rt_thread_delete(producer_tid); - if (consumer_tid != RT_NULL && consumer_tid->stat != RT_THREAD_CLOSE) - rt_thread_delete(consumer_tid); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_semaphore_producer_consumer() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - semaphore_producer_consumer_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_semaphore_producer_consumer, producer and consumer example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - semaphore_producer_consumer_init(); - - return 0; -} -#endif diff --git a/examples/kernel/semaphore_static.c b/examples/kernel/semaphore_static.c deleted file mode 100644 index 16b043db9c..0000000000 --- a/examples/kernel/semaphore_static.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:静态信号量 - * - * 这个例子中将创建一个静态信号量(初始值为0 )及一个静态线程,在这个静态线程中 - * 将试图采用超时方式去持有信号量,应该超时返回。然后这个线程释放一次信号量,并 - * 在后面继续采用永久等待方式去持有信号量, 成功获得信号量后返回。 - */ -#include -#include "tc_comm.h" - -/* 线程控制块及栈 */ -static struct rt_thread thread; -static rt_uint8_t thread_stack[THREAD_STACK_SIZE]; -/* 信号量控制块 */ -static struct rt_semaphore sem; - -/* 线程入口 */ -static void thread_entry(void* parameter) -{ - rt_err_t result; - rt_tick_t tick; - - /* 获得当前的OS Tick */ - tick = rt_tick_get(); - - /* 试图持有信号量,最大等待10个OS Tick后返回 */ - result = rt_sem_take(&sem, 10); - if (result == -RT_ETIMEOUT) - { - rt_tick_t new_tick = rt_tick_get(); - /* 可以有两个 tick 的误差 */ - if (new_tick - tick >= 12) - { - rt_kprintf("tick error to large: expect: 10, get %d\n", - new_tick - tick); - - tc_done(TC_STAT_FAILED); - rt_sem_detach(&sem); - return; - } - rt_kprintf("take semaphore timeout\n"); - } - else - { - /* 因为没有其他地方是否信号量,所以不应该成功持有信号量,否则测试失败 */ - tc_done(TC_STAT_FAILED); - rt_sem_detach(&sem); - return; - } - - /* 释放一次信号量 */ - rt_sem_release(&sem); - - /* 永久等待方式持有信号量 */ - result = rt_sem_take(&sem, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - /* 不成功则测试失败 */ - tc_done(TC_STAT_FAILED); - rt_sem_detach(&sem); - return; - } - - /* 测试通过 */ - tc_done(TC_STAT_PASSED); - /* 脱离信号量对象 */ - rt_sem_detach(&sem); -} - -int semaphore_static_init(void) -{ - rt_err_t result; - - /* 初始化信号量,初始值是0 */ - result = rt_sem_init(&sem, "sem", 0, RT_IPC_FLAG_PRIO); - if (result != RT_EOK) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - return 0; - } - - /* 初始化线程1 */ - result = rt_thread_init(&thread, "thread", /* 线程名:thread */ - thread_entry, RT_NULL, /* 线程的入口是thread_entry,入口参数是RT_NULL*/ - &thread_stack[0], sizeof(thread_stack), /* 线程栈是thread_stack */ - THREAD_PRIORITY, 10); - if (result == RT_EOK) /* 如果返回正确,启动线程1 */ - rt_thread_startup(&thread); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup(void) -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 执行线程脱离 */ - if (thread.stat != RT_THREAD_CLOSE) - { - rt_thread_detach(&thread); - - /* 执行信号量对象脱离 */ - rt_sem_detach(&sem); - } - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_semaphore_static(void) -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - semaphore_static_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_semaphore_static, a static semaphore example); -#else -/* 用户应用入口 */ -int rt_application_init(void) -{ - semaphore_static_init(); - - return 0; -} -#endif diff --git a/examples/kernel/tc_comm.c b/examples/kernel/tc_comm.c deleted file mode 100644 index 0a43ca3855..0000000000 --- a/examples/kernel/tc_comm.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include "tc_comm.h" -#ifdef RT_USING_FINSH -#include -#endif - -#ifdef RT_USING_TC -#define TC_PRIORITY 25 -#define TC_STACK_SIZE 0x400 - -static rt_uint8_t _tc_stat; -static struct rt_semaphore _tc_sem; -static struct rt_thread _tc_thread; -static rt_uint8_t _tc_stack[TC_STACK_SIZE]; -static char _tc_prefix[64]; -static const char* _tc_current; -static void (*_tc_cleanup)(void) = RT_NULL; - -static rt_uint32_t _tc_scale = 1; - -static rt_uint32_t _tc_loop; - -void tc_thread_entry(void* parameter) -{ - unsigned int fail_count = 0; - struct finsh_syscall* index; - - /* create tc semaphore */ - rt_sem_init(&_tc_sem, "tc", 0, RT_IPC_FLAG_PRIO); - - do { - for (index = _syscall_table_begin; index < _syscall_table_end; FINSH_NEXT_SYSCALL(index)) - { - /* search testcase */ - if (rt_strstr(index->name, _tc_prefix) == index->name) - { - long tick; - - _tc_current = index->name + 4; - rt_kprintf("Run TestCase: %s\n", _tc_current); - _tc_stat = TC_STAT_PASSED | TC_STAT_RUNNING; - tick = index->func(); - if (tick > 0) - { - /* Make sure we are going to be blocked. */ - rt_sem_control(&_tc_sem, RT_IPC_CMD_RESET, 0); - rt_sem_take(&_tc_sem, tick * _tc_scale); - } - - if (_tc_cleanup != RT_NULL) - { - /* perform testcase cleanup */ - _tc_cleanup(); - _tc_cleanup = RT_NULL; - } - - if (_tc_stat & TC_STAT_RUNNING) - { - rt_kprintf("TestCase[%s] exit with stat TC_STAT_RUNNING." - " Please fix the TC.\n", - _tc_current); - /* If the TC forgot to clear the flag, we do it. */ - _tc_stat &= ~TC_STAT_RUNNING; - } - - if (_tc_stat & TC_STAT_FAILED) - { - rt_kprintf("TestCase[%s] failed\n", _tc_current); - fail_count++; - } - else - { - rt_kprintf("TestCase[%s] passed\n", _tc_current); - } - } - } - } while (_tc_loop); - - rt_kprintf("RT-Thread TestCase Running Done!\n"); - if (fail_count) - { - rt_kprintf("%d tests failed\n", fail_count); - } - else - { - rt_kprintf("All tests passed\n"); - } - /* detach tc semaphore */ - rt_sem_detach(&_tc_sem); -} - -void tc_stop() -{ - _tc_loop = 0; - - rt_thread_delay(10 * RT_TICK_PER_SECOND); - if (_tc_thread.stat != RT_THREAD_INIT) - { - /* lock scheduler */ - rt_enter_critical(); - - /* detach old tc thread */ - rt_thread_detach(&_tc_thread); - rt_sem_detach(&_tc_sem); - - /* unlock scheduler */ - rt_exit_critical(); - } - rt_thread_delay(RT_TICK_PER_SECOND/2); -} -FINSH_FUNCTION_EXPORT(tc_stop, stop testcase thread); - -void tc_done(rt_uint8_t stat) -{ - _tc_stat |= stat; - _tc_stat &= ~TC_STAT_RUNNING; - - /* release semaphore */ - rt_sem_release(&_tc_sem); -} - -void tc_stat(rt_uint8_t stat) -{ - if (stat & TC_STAT_FAILED) - { - rt_kprintf("TestCases[%s] failed\n", _tc_current); - } - _tc_stat |= stat; -} - -void tc_cleanup(void (*cleanup)()) -{ - _tc_cleanup = cleanup; -} - -void tc_start(const char* tc_prefix) -{ - rt_err_t result; - - /* tesecase prefix is null */ - if (tc_prefix == RT_NULL) - { - rt_kprintf("TestCase Usage: tc_start(prefix)\n\n"); - rt_kprintf("list_tc() can list all testcases.\n"); - return ; - } - - /* init tc thread */ - if (_tc_stat & TC_STAT_RUNNING) - { - /* stop old tc thread */ - tc_stop(); - } - - rt_memset(_tc_prefix, 0, sizeof(_tc_prefix)); - rt_snprintf(_tc_prefix, sizeof(_tc_prefix), "_tc_%s", tc_prefix); - - result = rt_thread_init(&_tc_thread, "tc", - tc_thread_entry, RT_NULL, - &_tc_stack[0], sizeof(_tc_stack), - TC_PRIORITY - 3, 5); - - /* set tc stat */ - _tc_stat = TC_STAT_RUNNING | TC_STAT_FAILED; - - if (result == RT_EOK) - rt_thread_startup(&_tc_thread); -} -FINSH_FUNCTION_EXPORT(tc_start, start testcase with testcase prefix or name); - -void tc_loop(const char *tc_prefix) -{ - _tc_loop = 1; - tc_start(tc_prefix); -} -FINSH_FUNCTION_EXPORT(tc_loop, start testcase with testcase prefix or name in loop mode); - -void list_tc() -{ - struct finsh_syscall* index; - - rt_kprintf("TestCases List:\n"); - for (index = _syscall_table_begin; index < _syscall_table_end; FINSH_NEXT_SYSCALL(index)) - { - /* search testcase */ - if (rt_strstr(index->name, "_tc_") == index->name) - { -#ifdef FINSH_USING_DESCRIPTION - rt_kprintf("%-16s -- %s\n", index->name + 4, index->desc); -#else - rt_kprintf("%s\n", index->name + 4); -#endif - } - } -} -FINSH_FUNCTION_EXPORT(list_tc, list all testcases); -#endif - diff --git a/examples/kernel/tc_comm.h b/examples/kernel/tc_comm.h deleted file mode 100644 index 17dd8eb924..0000000000 --- a/examples/kernel/tc_comm.h +++ /dev/null @@ -1,52 +0,0 @@ - -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ -#ifndef __TC_COMM_H__ -#define __TC_COMM_H__ - -/* - * RT-Thread TestCase - * - */ -#include -#ifdef RT_USING_FINSH -#include -#endif - -#if RT_THREAD_PRIORITY_MAX == 8 -#define THREAD_PRIORITY 6 -#elif RT_THREAD_PRIORITY_MAX == 32 -#define THREAD_PRIORITY 25 -#elif RT_THREAD_PRIORITY_MAX == 256 -#define THREAD_PRIORITY 200 -#endif -#define THREAD_STACK_SIZE 512 -#define THREAD_TIMESLICE 5 - -#define TC_STAT_END 0x00 -#define TC_STAT_RUNNING 0x01 -#define TC_STAT_FAILED 0x10 -#define TC_STAT_PASSED 0x00 - -#ifdef RT_USING_TC -void tc_start(const char* tc_prefix); -void tc_stop(void); -void tc_done(rt_uint8_t state); -void tc_stat(rt_uint8_t state); -void tc_cleanup(void (*cleanup)(void)); -#else -#define tc_start(x) -#define tc_stop() -#define tc_done(s) -#define tc_stat(s) -#define tc_cleanup(c) -#endif - -#endif - diff --git a/examples/kernel/tc_sample.c b/examples/kernel/tc_sample.c deleted file mode 100644 index 272edc0e39..0000000000 --- a/examples/kernel/tc_sample.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -static rt_thread_t tid = RT_NULL; -static void sample_thread(void* parameter) -{ - rt_kprintf("I'm sample!\n"); -} -static void sample_thread_cleanup(struct rt_thread *p) -{ - tid = RT_NULL; - tc_done(TC_STAT_PASSED); -} - -int sample_init() -{ - tid = rt_thread_create("t", - sample_thread, RT_NULL, - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid != RT_NULL) - { - rt_thread_startup(tid); - tid->cleanup = sample_thread_cleanup; - } - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* lock scheduler */ - rt_enter_critical(); - /* delete thread */ - if (tid != RT_NULL) - { - rt_kprintf("tid1 is bad\n"); - tc_stat(TC_STAT_FAILED); - } - /* unlock scheduler */ - rt_exit_critical(); -} - -int _tc_sample() -{ - /* set tc cleanup */ - tc_cleanup(_tc_cleanup); - sample_init(); - - return 25; -} -FINSH_FUNCTION_EXPORT(_tc_sample, a thread testcase example); -#else -int rt_application_init() -{ - sample_init(); - - return 0; -} -#endif diff --git a/examples/kernel/thread_delay.c b/examples/kernel/thread_delay.c deleted file mode 100644 index 50740e2c8f..0000000000 --- a/examples/kernel/thread_delay.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -/* - * This is an example for delay thread - */ -static struct rt_thread thread; -static char thread_stack[THREAD_STACK_SIZE]; -static void thread_entry(void* parameter) -{ - rt_tick_t tick; - rt_kprintf("thread inited ok\n"); - - rt_kprintf("thread delay 10 tick\n"); - tick = rt_tick_get(); - rt_thread_delay(10); - if (rt_tick_get() - tick > 11) - { - tc_done(TC_STAT_FAILED); - return; - } - - rt_kprintf("thread delay 15 tick\n"); - tick = rt_tick_get(); - rt_thread_delay(15); - if (rt_tick_get() - tick > 16) - { - tc_done(TC_STAT_FAILED); - return; - } - - rt_kprintf("thread exit\n"); - - tc_done(TC_STAT_PASSED); -} - -rt_err_t thread_delay_init() -{ - rt_err_t result; - - result = rt_thread_init(&thread, - "test", - thread_entry, RT_NULL, - &thread_stack[0], sizeof(thread_stack), - THREAD_PRIORITY, 10); - - if (result == RT_EOK) - rt_thread_startup(&thread); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return result; -} - -#ifdef RT_USING_TC -int _tc_thread_delay() -{ - thread_delay_init(); - - return 30; -} -FINSH_FUNCTION_EXPORT(_tc_thread_delay, a thread delay test); -#else -int rt_application_init() -{ - thread_delay_init(); - - return 0; -} -#endif diff --git a/examples/kernel/thread_delete.c b/examples/kernel/thread_delete.c deleted file mode 100644 index 924a823f35..0000000000 --- a/examples/kernel/thread_delete.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:删除线程 - * - * 这个例子会创建两个线程,在一个线程中删除另外一个线程。 - */ -#include -#include "tc_comm.h" - -/* - * 线程删除(rt_thread_delete)函数仅适合于动态线程,为了在一个线程 - * 中访问另一个线程的控制块,所以把线程块指针声明成全局类型以供全 - * 局访问 - */ -static rt_thread_t tid1 = RT_NULL, tid2 = RT_NULL; -/* 线程1的入口函数 */ -static void thread1_entry(void* parameter) -{ - rt_uint32_t count = 0; - - while (1) - { - /* 线程1采用低优先级运行,一直打印计数值 */ - // rt_kprintf("thread count: %d\n", count ++); - count ++; - } -} -static void thread1_cleanup(struct rt_thread *tid) -{ - if (tid != tid1) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - return ; - } - rt_kprintf("thread1 end\n"); - tid1 = RT_NULL; -} - -/* 线程2的入口函数 */ -static void thread2_entry(void* parameter) -{ - /* 线程2拥有较高的优先级,以抢占线程1而获得执行 */ - - /* 线程2启动后先睡眠10个OS Tick */ - rt_thread_delay(RT_TICK_PER_SECOND); - - /* - * 线程2唤醒后直接删除线程1,删除线程1后,线程1自动脱离就绪线程 - * 队列 - */ - rt_thread_delete(tid1); - - /* - * 线程2继续休眠10个OS Tick然后退出,线程2休眠后应切换到idle线程 - * idle线程将执行真正的线程1控制块和线程栈的删除 - */ - rt_thread_delay(RT_TICK_PER_SECOND); -} - -static void thread2_cleanup(struct rt_thread *tid) -{ - /* - * 线程2运行结束后也将自动被删除(线程控制块和线程栈在idle线 - * 程中释放) - */ - - if (tid != tid2) - { - tc_stat(TC_STAT_END | TC_STAT_FAILED); - return ; - } - rt_kprintf("thread2 end\n"); - tid2 = RT_NULL; - tc_done(TC_STAT_PASSED); -} - -/* 线程删除示例的初始化 */ -int thread_delete_init() -{ - /* 创建线程1 */ - tid1 = rt_thread_create("t1", /* 线程1的名称是t1 */ - thread1_entry, RT_NULL, /* 入口是thread1_entry,参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) /* 如果获得线程控制块,启动这个线程 */ - { - tid1->cleanup = thread1_cleanup; - rt_thread_startup(tid1); - } - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程1 */ - tid2 = rt_thread_create("t2", /* 线程1的名称是t2 */ - thread2_entry, RT_NULL, /* 入口是thread2_entry,参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE); - if (tid2 != RT_NULL) /* 如果获得线程控制块,启动这个线程 */ - { - tid2->cleanup = thread2_cleanup; - rt_thread_startup(tid2); - } - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 10 * RT_TICK_PER_SECOND; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* lock scheduler */ - rt_enter_critical(); - - /* delete thread */ - if (tid1 != RT_NULL) - { - rt_kprintf("tid1 is %p, should be NULL\n", tid1); - tc_stat(TC_STAT_FAILED); - } - if (tid2 != RT_NULL) - { - rt_kprintf("tid2 is %p, should be NULL\n", tid2); - tc_stat(TC_STAT_FAILED); - } - - /* unlock scheduler */ - rt_exit_critical(); -} - -int _tc_thread_delete() -{ - /* set tc cleanup */ - tc_cleanup(_tc_cleanup); - return thread_delete_init(); -} -FINSH_FUNCTION_EXPORT(_tc_thread_delete, a thread delete example); -#else -int rt_application_init() -{ - thread_delete_init(); - - return 0; -} -#endif diff --git a/examples/kernel/thread_detach.c b/examples/kernel/thread_detach.c deleted file mode 100644 index d0d72d017b..0000000000 --- a/examples/kernel/thread_detach.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:线程脱离 - * - * 这个例子会创建两个线程,在其中一个线程中执行对另一个线程的脱离。 - */ -#include -#include "tc_comm.h" - -/* 线程1控制块 */ -static struct rt_thread thread1; -/* 线程1栈 */ -static rt_uint8_t thread1_stack[THREAD_STACK_SIZE]; -/* 线程2控制块 */ -static struct rt_thread thread2; -/* 线程2栈 */ -static rt_uint8_t thread2_stack[THREAD_STACK_SIZE]; - -/* 线程1入口 */ -static void thread1_entry(void* parameter) -{ - rt_uint32_t count = 0; - - while (1) - { - /* 线程1采用低优先级运行,一直打印计数值 */ - rt_kprintf("thread count: %d\n", count ++); - } -} - -/* 线程2入口 */ -static void thread2_entry(void* parameter) -{ - /* 线程2拥有较高的优先级,以抢占线程1而获得执行 */ - - /* 线程2启动后先睡眠10个OS Tick */ - rt_thread_delay(10); - - /* - * 线程2唤醒后直接执行线程1脱离,线程1将从就绪线程队列中删除 - */ - rt_thread_detach(&thread1); - - /* - * 线程2继续休眠10个OS Tick然后退出 - */ - rt_thread_delay(10); - - /* - * 线程2运行结束后也将自动被从就绪队列中删除,并脱离线程队列 - */ -} - -int thread_detach_init() -{ - rt_err_t result; - - /* 初始化线程1 */ - result = rt_thread_init(&thread1, "t1", /* 线程名:t1 */ - thread1_entry, RT_NULL, /* 线程的入口是thread1_entry,入口参数是RT_NULL*/ - &thread1_stack[0], sizeof(thread1_stack), /* 线程栈是thread1_stack */ - THREAD_PRIORITY, 10); - if (result == RT_EOK) /* 如果返回正确,启动线程1 */ - rt_thread_startup(&thread1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 初始化线程2 */ - result = rt_thread_init(&thread2, "t2", /* 线程名:t2 */ - thread2_entry, RT_NULL, /* 线程的入口是thread2_entry,入口参数是RT_NULL*/ - &thread2_stack[0], sizeof(thread2_stack), /* 线程栈是thread2_stack */ - THREAD_PRIORITY - 1, 10); - if (result == RT_EOK) /* 如果返回正确,启动线程2 */ - rt_thread_startup(&thread2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 执行线程脱离 */ - if (thread1.stat != RT_THREAD_CLOSE) - rt_thread_detach(&thread1); - if (thread2.stat != RT_THREAD_CLOSE) - rt_thread_detach(&thread2); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_thread_detach() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - thread_detach_init(); - - /* 返回TestCase运行的最长时间 */ - return 25; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_thread_detach, a static thread example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - thread_detach_init(); - - return 0; -} -#endif diff --git a/examples/kernel/thread_dynamic.c b/examples/kernel/thread_dynamic.c deleted file mode 100644 index 35c67c02fc..0000000000 --- a/examples/kernel/thread_dynamic.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -static void thread_entry(void* parameter) -{ - rt_kprintf("thread dynamicly created ok\n"); - rt_thread_delay(10); - rt_kprintf("thread exit\n"); - - tc_done(TC_STAT_PASSED); -} - -int thread_dynamic_init() -{ - rt_thread_t tid; - - tid = rt_thread_create("test", - thread_entry, RT_NULL, - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid != RT_NULL) - rt_thread_startup(tid); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -int _tc_thread_dynamic() -{ - thread_dynamic_init(); - - return 20; -} -FINSH_FUNCTION_EXPORT(_tc_thread_dynamic, a dynamic thread test); -#else -int rt_application_init() -{ - thread_dynamic_init(); - - return 0; -} -#endif - diff --git a/examples/kernel/thread_dynamic_simple.c b/examples/kernel/thread_dynamic_simple.c deleted file mode 100644 index dc378a6696..0000000000 --- a/examples/kernel/thread_dynamic_simple.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:动态线程 - * - * 这个程序会初始化2个动态线程,它们拥有共同的入口函数,但参数不相同 - */ -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; -/* 线程入口 */ -static void thread_entry(void* parameter) -{ - rt_uint32_t count = 0; - rt_uint32_t no = (rt_uint32_t) parameter; /* 获得正确的入口参数 */ - - while (1) - { - /* 打印线程计数值输出 */ - rt_kprintf("thread%d count: %d\n", no, count ++); - - /* 休眠10个OS Tick */ - rt_thread_delay(10); - } -} - -int thread_dynamic_simple_init() -{ - /* 创建线程1 */ - tid1 = rt_thread_create("t1", - thread_entry, (void*)1, /* 线程入口是thread_entry, 入口参数是1 */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - rt_thread_startup(tid1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("t2", - thread_entry, (void*)2, /* 线程入口是thread_entry, 入口参数是2 */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - rt_thread_startup(tid2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_thread_dynamic_simple() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - thread_dynamic_simple_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_thread_dynamic_simple, a dynamic thread example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - thread_dynamic_simple_init(); - - return 0; -} -#endif diff --git a/examples/kernel/thread_priority.c b/examples/kernel/thread_priority.c deleted file mode 100644 index abf45bbe07..0000000000 --- a/examples/kernel/thread_priority.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -struct rt_thread thread1; -struct rt_thread thread2; -static char thread1_stack[THREAD_STACK_SIZE]; -static char thread2_stack[THREAD_STACK_SIZE]; -static rt_uint32_t count = 0; - -/* - * the priority of thread1 > the priority of thread2 - */ -static void thread1_entry(void* parameter) -{ - while (1) - { - count ++; - rt_kprintf("count = %d\n", count); - - rt_thread_delay(10); - } -} - -static void thread2_entry(void* parameter) -{ - rt_tick_t tick; - - tick = rt_tick_get(); - while (1) - { - if (rt_tick_get() - tick >= 50) - { - if (count == 0) - tc_done(TC_STAT_FAILED); - else - tc_done(TC_STAT_PASSED); - - break; - } - } -} - -int thread_priority_init() -{ - rt_err_t result; - - result = rt_thread_init(&thread1, - "t1", - thread1_entry, RT_NULL, - &thread1_stack[0], sizeof(thread1_stack), - THREAD_PRIORITY - 1, THREAD_TIMESLICE); - - if (result == RT_EOK) - rt_thread_startup(&thread1); - else - tc_stat(TC_STAT_FAILED); - - rt_thread_init(&thread2, - "t2", - thread2_entry, RT_NULL, - &thread2_stack[0], sizeof(thread2_stack), - THREAD_PRIORITY + 1, THREAD_TIMESLICE); - - if (result == RT_EOK) - rt_thread_startup(&thread2); - else - tc_stat(TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* lock scheduler */ - rt_enter_critical(); - - if (thread1.stat != RT_THREAD_CLOSE) - rt_thread_detach(&thread1); - if (thread2.stat != RT_THREAD_CLOSE) - rt_thread_detach(&thread2); - - /* unlock scheduler */ - rt_exit_critical(); -} -int _tc_thread_priority() -{ - count = 0; - - /* set tc cleanup */ - tc_cleanup(_tc_cleanup); - thread_priority_init(); - - return RT_TICK_PER_SECOND; -} -FINSH_FUNCTION_EXPORT(_tc_thread_priority, a priority thread test); -#else -int rt_application_init() -{ - thread_priority_init(); - - return 0; -} -#endif - diff --git a/examples/kernel/thread_resume.c b/examples/kernel/thread_resume.c deleted file mode 100644 index e776466326..0000000000 --- a/examples/kernel/thread_resume.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:唤醒线程 - * - * 这个例子中将创建两个动态线程,低优先级线程将挂起自身,然后 - * 高优先级线程将在一定时刻后唤醒低优先级线程。 - */ -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; -/* 线程1入口 */ -static void thread1_entry(void* parameter) -{ - /* 低优先级线程1开始运行 */ - rt_kprintf("thread1 startup%d\n"); - - /* 挂起自身 */ - rt_kprintf("suspend thread self\n"); - rt_thread_suspend(tid1); - /* 主动执行线程调度 */ - rt_schedule(); - - /* 当线程1被唤醒时 */ - rt_kprintf("thread1 resumed\n"); -} -static void thread_cleanup(rt_thread_t tid) -{ - if (tid == tid1) - { - tid1 = RT_NULL; - } - if (tid == tid2) - { - tid = RT_NULL; - } -} - -/* 线程2入口 */ -static void thread2_entry(void* parameter) -{ - /* 延时10个OS Tick */ - rt_thread_delay(10); - - /* 唤醒线程1 */ - rt_thread_resume(tid1); - rt_kprintf("thread2: to resume thread1\n"); - - /* 延时10个OS Tick */ - rt_thread_delay(10); - - /* 线程2自动退出 */ -} - -int thread_resume_init() -{ - /* 创建线程1 */ - tid1 = rt_thread_create("thread", - thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - { - tid1->cleanup = thread_cleanup; - rt_thread_startup(tid1); - } - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("thread", - thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - { - tid2->cleanup = thread_cleanup; - rt_thread_startup(tid2); - } - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_thread_resume() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - thread_resume_init(); - - /* 返回TestCase运行的最长时间 */ - return 25; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_thread_resume, a thread resume example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - thread_resume_init(); - - return 0; -} -#endif diff --git a/examples/kernel/thread_same_priority.c b/examples/kernel/thread_same_priority.c deleted file mode 100644 index a238e24932..0000000000 --- a/examples/kernel/thread_same_priority.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -static struct rt_thread thread1; -static struct rt_thread thread2; -static char thread1_stack[THREAD_STACK_SIZE]; -static char thread2_stack[THREAD_STACK_SIZE]; - -volatile static rt_uint32_t t1_count = 0; -volatile static rt_uint32_t t2_count = 0; -static void thread1_entry(void* parameter) -{ - while (1) - { - t1_count ++; - } -} - -static void thread2_entry(void* parameter) -{ - while (1) - { - t2_count ++; - } -} - -rt_err_t thread_same_priority_init() -{ - rt_err_t result; - - result = rt_thread_init(&thread1, - "t1", - thread1_entry, RT_NULL, - &thread1_stack[0], sizeof(thread1_stack), - THREAD_PRIORITY, 10); - if (result == RT_EOK) - rt_thread_startup(&thread1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - result = rt_thread_init(&thread2, - "t2", - thread2_entry, RT_NULL, - &thread2_stack[0], sizeof(thread2_stack), - THREAD_PRIORITY, 5); - if (result == RT_EOK) - rt_thread_startup(&thread2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return result; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* lock scheduler */ - rt_enter_critical(); - - if (thread1.stat != RT_THREAD_CLOSE) - rt_thread_detach(&thread1); - if (thread2.stat != RT_THREAD_CLOSE) - rt_thread_detach(&thread2); - - /* unlock scheduler */ - rt_exit_critical(); - - rt_kprintf("t1_count=%d t2_count=%d\n",t1_count,t2_count); - - if (t1_count / t2_count != 2) - tc_stat(TC_STAT_END | TC_STAT_FAILED); - else - tc_done(TC_STAT_PASSED); -} - -int _tc_thread_same_priority() -{ - t1_count = 0; - t2_count = 0; - - /* set tc cleanup */ - tc_cleanup(_tc_cleanup); - - thread_same_priority_init(); - - return 100; -} -FINSH_FUNCTION_EXPORT(_tc_thread_same_priority, a same priority thread test); -#else -int rt_application_init() -{ - thread_same_priority_init(); - - return 0; -} -#endif diff --git a/examples/kernel/thread_static.c b/examples/kernel/thread_static.c deleted file mode 100644 index 9234255679..0000000000 --- a/examples/kernel/thread_static.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -/* - * This is an example for static thread - */ -static struct rt_thread thread; -static char thread_stack[THREAD_STACK_SIZE]; -static void thread_entry(void* parameter) -{ - rt_kprintf("thread staticly inited ok\n"); - rt_thread_delay(10); - rt_kprintf("thread exit\n"); - - tc_done(TC_STAT_PASSED); -} - -rt_err_t thread_static_init() -{ - rt_err_t result; - - result = rt_thread_init(&thread, - "test", - thread_entry, RT_NULL, - &thread_stack[0], sizeof(thread_stack), - THREAD_PRIORITY, 10); - - if (result == RT_EOK) - rt_thread_startup(&thread); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return result; -} - -#ifdef RT_USING_TC -int _tc_thread_static() -{ - thread_static_init(); - - return 20; -} -FINSH_FUNCTION_EXPORT(_tc_thread_static, a static thread test); -#else -int rt_application_init() -{ - thread_static_init(); - - return 0; -} -#endif - diff --git a/examples/kernel/thread_static_simple.c b/examples/kernel/thread_static_simple.c deleted file mode 100644 index e0021d2c5f..0000000000 --- a/examples/kernel/thread_static_simple.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:静态线程 - * - * 这个程序会初始化2个静态线程,它们拥有共同的入口函数,但参数不相同 - */ -#include -#include "tc_comm.h" - -/* 线程1控制块 */ -static struct rt_thread thread1; -/* 线程1栈 */ -static rt_uint8_t thread1_stack[THREAD_STACK_SIZE]; -/* 线程2控制块 */ -static struct rt_thread thread2; -/* 线程2栈 */ -static rt_uint8_t thread2_stack[THREAD_STACK_SIZE]; - -/* 线程入口 */ -static void thread_entry(void* parameter) -{ - rt_uint32_t count = 0; - rt_uint32_t no = (rt_uint32_t) parameter; /* 获得正确的入口参数 */ - - while (1) - { - /* 打印线程计数值输出 */ - rt_kprintf("thread%d count: %d\n", no, count ++); - - /* 休眠10个OS Tick */ - rt_thread_delay(10); - } -} - -int thread_static_simple_init() -{ - rt_err_t result; - - /* 初始化线程1 */ - result = rt_thread_init(&thread1, "t1", /* 线程名:t1 */ - thread_entry, (void*)1, /* 线程的入口是thread_entry,入口参数是1 */ - &thread1_stack[0], sizeof(thread1_stack), /* 线程栈是thread1_stack */ - THREAD_PRIORITY, 10); - if (result == RT_EOK) /* 如果返回正确,启动线程1 */ - rt_thread_startup(&thread1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 初始化线程2 */ - result = rt_thread_init(&thread2, "t2", /* 线程名:t2 */ - thread_entry, RT_NULL, /* 线程的入口是thread_entry,入口参数是2 */ - &thread2_stack[0], sizeof(thread2_stack), /* 线程栈是thread2_stack */ - THREAD_PRIORITY + 1, 10); - if (result == RT_EOK) /* 如果返回正确,启动线程2 */ - rt_thread_startup(&thread2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 执行线程脱离 */ - if (thread1.stat != RT_THREAD_CLOSE) - rt_thread_detach(&thread1); - if (thread2.stat != RT_THREAD_CLOSE) - rt_thread_detach(&thread2); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_thread_static_simple() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - thread_static_simple_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_thread_static_simple, a static thread example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - thread_static_simple_init(); - - return 0; -} -#endif diff --git a/examples/kernel/thread_suspend.c b/examples/kernel/thread_suspend.c deleted file mode 100644 index 2219c7b8d6..0000000000 --- a/examples/kernel/thread_suspend.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:挂起线程 - * - * 这个例子中将创建两个动态线程,高优先级线程将在一定时刻后挂起低优先级线程。 - */ -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; -/* 线程1入口 */ -static void thread1_entry(void* parameter) -{ - rt_uint32_t count = 0; - - while (1) - { - /* 线程1采用低优先级运行,一直打印计数值 */ - rt_kprintf("thread count: %d\n", count ++); - } -} - -/* 线程2入口 */ -static void thread2_entry(void* parameter) -{ - /* 延时10个OS Tick */ - rt_thread_delay(10); - - /* 挂起线程1 */ - rt_thread_suspend(tid1); - - /* 延时10个OS Tick */ - rt_thread_delay(10); - - /* 线程2自动退出 */ - tid2 = RT_NULL; -} - -int thread_suspend_init() -{ - /* 创建线程1 */ - tid1 = rt_thread_create("thread", - thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - rt_thread_startup(tid1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("thread", - thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - rt_thread_startup(tid2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_thread_suspend() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - thread_suspend_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_thread_suspend, a thread suspend example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - thread_suspend_init(); - - return 0; -} -#endif diff --git a/examples/kernel/thread_yield.c b/examples/kernel/thread_yield.c deleted file mode 100644 index 97e57ba841..0000000000 --- a/examples/kernel/thread_yield.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid1 = RT_NULL; -static rt_thread_t tid2 = RT_NULL; -/* 线程1入口 */ -static void thread1_entry(void* parameter) -{ - rt_uint32_t count = 0; - - while (1) - { - /* 打印线程1的输出 */ - rt_kprintf("thread1: count = %d\n", count ++); - - /* 执行yield后应该切换到thread2执行 */ - rt_thread_yield(); - } -} - -/* 线程2入口 */ -static void thread2_entry(void* parameter) -{ - rt_uint32_t count = 0; - - while (1) - { - /* 打印线程2的输出 */ - rt_kprintf("thread2: count = %d\n", count ++); - - /* 执行yield后应该切换到thread1执行 */ - rt_thread_yield(); - } -} - -int thread_yield_init() -{ - /* 创建线程1 */ - tid1 = rt_thread_create("thread", - thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid1 != RT_NULL) - rt_thread_startup(tid1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建线程2 */ - tid2 = rt_thread_create("thread", - thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid2 != RT_NULL) - rt_thread_startup(tid2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid1); - if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid2); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_thread_yield() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - thread_yield_init(); - - /* 返回TestCase运行的最长时间 */ - return 30; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_thread_yield, a thread yield example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - thread_yield_init(); - - return 0; -} -#endif diff --git a/examples/kernel/timer_control.c b/examples/kernel/timer_control.c deleted file mode 100644 index c92d558d5c..0000000000 --- a/examples/kernel/timer_control.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:动态定时器例程 - * - * 这个例程会创建1个动态周期型定时器对象,然后控制它进行定时时间长度的更改。 - */ -#include -#include "tc_comm.h" - -/* 定时器的控制块 */ -static rt_timer_t timer1; -static rt_uint8_t count; - -/* 定时器超时函数 */ -static void timeout1(void* parameter) -{ - rt_tick_t timeout = 50; - - rt_kprintf("periodic timer is timeout\n"); - - count ++; - /* 停止定时器自身 */ - if (count >= 8) - { - /* 控制定时器然后更改超时时间长度 */ - rt_timer_control(timer1, RT_TIMER_CTRL_SET_TIME, (void *)&timeout); - count = 0; - } -} - -void timer_control_init() -{ - /* 创建定时器1 */ - timer1 = rt_timer_create("timer1", /* 定时器名字是 timer1 */ - timeout1, /* 超时时回调的处理函数 */ - RT_NULL, /* 超时函数的入口参数 */ - 10, /* 定时长度,以OS Tick为单位,即10个OS Tick */ - RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */ - /* 启动定时器 */ - if (timer1 != RT_NULL) - rt_timer_start(timer1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除定时器对象 */ - rt_timer_delete(timer1); - timer1 = RT_NULL; - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_timer_control() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - - /* 执行定时器例程 */ - count = 0; - timer_control_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_timer_control, a timer control example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - timer_control_init(); - - return 0; -} -#endif diff --git a/examples/kernel/timer_dynamic.c b/examples/kernel/timer_dynamic.c deleted file mode 100644 index 35d7b845dd..0000000000 --- a/examples/kernel/timer_dynamic.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:动态定时器例程 - * - * 这个例程会创建两个动态定时器对象,一个是单次定时,一个是周期性的定时 - */ -#include -#include "tc_comm.h" - -/* 定时器的控制块 */ -static rt_timer_t timer1; -static rt_timer_t timer2; - -/* 定时器1超时函数 */ -static void timeout1(void* parameter) -{ - rt_kprintf("periodic timer is timeout\n"); -} - -/* 定时器2超时函数 */ -static void timeout2(void* parameter) -{ - rt_kprintf("one shot timer is timeout\n"); -} - -void timer_create_init() -{ - /* 创建定时器1 */ - timer1 = rt_timer_create("timer1", /* 定时器名字是 timer1 */ - timeout1, /* 超时时回调的处理函数 */ - RT_NULL, /* 超时函数的入口参数 */ - 10, /* 定时长度,以OS Tick为单位,即10个OS Tick */ - RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */ - /* 启动定时器 */ - if (timer1 != RT_NULL) - rt_timer_start(timer1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - /* 创建定时器2 */ - timer2 = rt_timer_create("timer2", /* 定时器名字是 timer2 */ - timeout2, /* 超时时回调的处理函数 */ - RT_NULL, /* 超时函数的入口参数 */ - 30, /* 定时长度为30个OS Tick */ - RT_TIMER_FLAG_ONE_SHOT); /* 单次定时器 */ - - /* 启动定时器 */ - if (timer2 != RT_NULL) - rt_timer_start(timer2); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除定时器对象 */ - rt_timer_delete(timer1); - rt_timer_delete(timer2); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_timer_create() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - - /* 执行定时器例程 */ - timer_create_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_timer_create, a dynamic timer example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - timer_create_init(); - - return 0; -} -#endif diff --git a/examples/kernel/timer_static.c b/examples/kernel/timer_static.c deleted file mode 100644 index 1523869b9a..0000000000 --- a/examples/kernel/timer_static.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:定时器例程 - * - * 这个程序会初始化2个静态定时器,一个是单次定时,一个是周期性的定时 - */ -#include -#include "tc_comm.h" - -/* 定时器的控制块 */ -static struct rt_timer timer1; -static struct rt_timer timer2; - -/* 定时器1超时函数 */ -static void timeout1(void* parameter) -{ - rt_kprintf("periodic timer is timeout\n"); -} - -/* 定时器2超时函数 */ -static void timeout2(void* parameter) -{ - rt_kprintf("one shot timer is timeout\n"); -} - -void timer_static_init() -{ - /* 初始化定时器 */ - rt_timer_init(&timer1, "timer1", /* 定时器名字是 timer1 */ - timeout1, /* 超时时回调的处理函数 */ - RT_NULL, /* 超时函数的入口参数 */ - 10, /* 定时长度,以OS Tick为单位,即10个OS Tick */ - RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */ - rt_timer_init(&timer2, "timer2", /* 定时器名字是 timer2 */ - timeout2, /* 超时时回调的处理函数 */ - RT_NULL, /* 超时函数的入口参数 */ - 30, /* 定时长度为30个OS Tick */ - RT_TIMER_FLAG_ONE_SHOT); /* 单次定时器 */ - - /* 启动定时器 */ - rt_timer_start(&timer1); - rt_timer_start(&timer2); -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 执行定时器脱离 */ - rt_timer_detach(&timer1); - rt_timer_detach(&timer2); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_timer_static() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - - /* 执行定时器例程 */ - timer_static_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_timer_static, a static timer example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - timer_static_init(); - - return 0; -} -#endif diff --git a/examples/kernel/timer_stop_self.c b/examples/kernel/timer_stop_self.c deleted file mode 100644 index 584bc4128e..0000000000 --- a/examples/kernel/timer_stop_self.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:动态定时器例程 - * - * 这个例程会创建1个动态周期型定时器对象 - */ -#include -#include "tc_comm.h" - -/* 定时器的控制块 */ -static rt_timer_t timer1; -static rt_uint8_t count; - -/* 定时器超时函数 */ -static void timeout1(void* parameter) -{ - rt_kprintf("periodic timer is timeout\n"); - - count ++; - /* 停止定时器自身 */ - if (count >= 8) - { - /* 停止定时器 */ - rt_timer_stop(timer1); - count = 0; - } -} - -void timer_stop_self_init() -{ - /* 创建定时器1 */ - timer1 = rt_timer_create("timer1", /* 定时器名字是 timer1 */ - timeout1, /* 超时时回调的处理函数 */ - RT_NULL, /* 超时函数的入口参数 */ - 10, /* 定时长度,以OS Tick为单位,即10个OS Tick */ - RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */ - /* 启动定时器 */ - if (timer1 != RT_NULL) - rt_timer_start(timer1); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除定时器对象 */ - rt_timer_delete(timer1); - timer1 = RT_NULL; - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_timer_stop_self() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - - /* 执行定时器例程 */ - count = 0; - timer_stop_self_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_timer_stop_self, a dynamic timer example); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - timer_stop_self_init(); - - return 0; -} -#endif diff --git a/examples/kernel/timer_timeout.c b/examples/kernel/timer_timeout.c deleted file mode 100644 index f72b45be3c..0000000000 --- a/examples/kernel/timer_timeout.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * - */ - -/* - * 程序清单:消息队列例程 - * - * 这个程序会创建3个动态线程,一个线程会从消息队列中收取消息;一个线程会定时给消 - * 息队列发送消息;一个线程会定时给消息队列发送紧急消息。 - */ -#include -#include "tc_comm.h" - -/* 指向线程控制块的指针 */ -static rt_thread_t tid = RT_NULL; - -/* 消息队列控制块 */ -static struct rt_messagequeue mq; -/* 消息队列中用到的放置消息的内存池 */ -static char msg_pool[2048]; - -/* 定时器的控制块 */ -static struct rt_timer timer; -static rt_uint16_t no = 0; -static void timer_timeout(void* parameter) -{ - char buf[32]; - rt_uint32_t length; - - length = rt_snprintf(buf, sizeof(buf), "message %d", no++); - rt_mq_send(&mq, &buf[0], length); -} - -/* 线程入口函数 */ -static void thread_entry(void* parameter) -{ - char buf[64]; - rt_err_t result; - - /* 初始化定时器 */ - rt_timer_init(&timer, "timer", /* 定时器名字是 timer1 */ - timer_timeout, /* 超时时回调的处理函数 */ - RT_NULL, /* 超时函数的入口参数 */ - 1, /* 定时长度,以OS Tick为单位,即1个OS Tick */ - RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */ - - while (1) - { - rt_memset(&buf[0], 0, sizeof(buf)); - - /* 从消息队列中接收消息 */ - result = rt_mq_recv(&mq, &buf[0], sizeof(buf), 1); - if (result == RT_EOK) - { - rt_kprintf("recv msg: %s\n", buf); - } - else if (result == -RT_ETIMEOUT) - { - rt_kprintf("recv msg timeout\n"); - } - } -} - -int timer_timeout_init() -{ - /* 初始化消息队列 */ - rt_mq_init(&mq, "mqt", - &msg_pool[0], /* 内存池指向msg_pool */ - 128 - sizeof(void*), /* 每个消息的大小是 128 - void* */ - sizeof(msg_pool), /* 内存池的大小是msg_pool的大小 */ - RT_IPC_FLAG_PRIO); /* 如果有多个线程等待,按照优先级由高到低的方法分配消息 */ - - /* 创建线程 */ - tid = rt_thread_create("t", - thread_entry, RT_NULL, /* 线程入口是thread_entry, 入口参数是RT_NULL */ - THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); - if (tid != RT_NULL) - rt_thread_startup(tid); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); - - return 0; -} - -#ifdef RT_USING_TC -static void _tc_cleanup() -{ - /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ - rt_enter_critical(); - - /* 删除线程 */ - if (tid != RT_NULL && tid->stat != RT_THREAD_CLOSE) - rt_thread_delete(tid); - - /* 执行消息队列对象脱离 */ - rt_mq_detach(&mq); - /* 执行定时器脱离 */ - rt_timer_detach(&timer); - - /* 调度器解锁 */ - rt_exit_critical(); - - /* 设置TestCase状态 */ - tc_done(TC_STAT_PASSED); -} - -int _tc_timer_timeout() -{ - /* 设置TestCase清理回调函数 */ - tc_cleanup(_tc_cleanup); - timer_timeout_init(); - - /* 返回TestCase运行的最长时间 */ - return 100; -} -/* 输出函数命令到finsh shell中 */ -FINSH_FUNCTION_EXPORT(_tc_timer_timeout, a thread timer testcase); -#else -/* 用户应用入口 */ -int rt_application_init() -{ - timer_timeout_init(); - - return 0; -} -#endif -- cgit v1.3.1