From eb558a5d4acfdae05d7fbb939a148fdbe14fee2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B6=E4=B8=AD=E6=96=AD=E5=BB=B6=E8=BF=9F=E7=9A=84RTOS?= Date: Sat, 1 Jun 2024 06:26:48 +0000 Subject: [PATCH] =?UTF-8?q?update=20CosyOS=E5=86=85=E6=A0=B8=E6=96=87?= =?UTF-8?q?=E4=BB=B6.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 零中断延迟的RTOS --- System/os_timing.c | 850 ++++++++++++++++++++++++++++++++++++++ System/os_var.c | 80 ++++ System/os_var.h | 86 ++++ System/sv_create.h | 282 +++++++++++++ System/sv_int_loc.c | 137 ++++++ System/sv_int_loc.h | 96 +++++ System/sv_int_pend_fifo.c | 260 ++++++++++++ System/sv_int_pend_fifo.h | 223 ++++++++++ System/sv_int_pend_flag.c | 91 ++++ System/sv_int_pend_flag.h | 63 +++ System/sv_task.c | 820 ++++++++++++++++++++++++++++++++++++ System/sv_task.h | 403 ++++++++++++++++++ System/sv_tick.c | 282 +++++++++++++ System/sv_tick.h | 188 +++++++++ 14 files changed, 3861 insertions(+) create mode 100644 System/os_timing.c create mode 100644 System/os_var.c create mode 100644 System/os_var.h create mode 100644 System/sv_create.h create mode 100644 System/sv_int_loc.c create mode 100644 System/sv_int_loc.h create mode 100644 System/sv_int_pend_fifo.c create mode 100644 System/sv_int_pend_fifo.h create mode 100644 System/sv_int_pend_flag.c create mode 100644 System/sv_int_pend_flag.h create mode 100644 System/sv_task.c create mode 100644 System/sv_task.h create mode 100644 System/sv_tick.c create mode 100644 System/sv_tick.h diff --git a/System/os_timing.c b/System/os_timing.c new file mode 100644 index 00000000..bc37b187 --- /dev/null +++ b/System/os_timing.c @@ -0,0 +1,850 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_timing.c + * @brief 初始化定时任务/钩子(包括定时中断任务/钩子和定时查询任务/钩子) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#include "os_var.h" + +#if OS_TIMINTTOTAL || OS_TIMQRYTOTAL + +#define __EXT_TIMINT(tmid) \ + extern const s_timinthand_ts _CONST_MEM_ u_timinthand_##tmid; + +#define __EXT_TIMQRY(tmid) \ + extern const s_timqryhand_ts _CONST_MEM_ u_timqryhand_##tmid; + +#define __INIT_TIMINT(tmid) \ + s_timint_autoreload[tmid] = u_timinthand_##tmid.hookortask_autoreload & 0x01; \ + s_timint_hookortask[tmid] = u_timinthand_##tmid.hookortask_autoreload & 0x80 ? true : false; \ + s_timint_handle[tmid] = &u_timinthand_##tmid; + +#define __INIT_TIMQRY(tmid) \ + s_timqry_autoreload[tmid] = u_timqryhand_##tmid.hookortask_autoreload & 0x01; \ + s_timqry_hookortask[tmid] = u_timqryhand_##tmid.hookortask_autoreload & 0x80 ? true : false; \ + s_timqry_handle[tmid] = &u_timqryhand_##tmid; + +#if OS_TIMINTTOTAL +#if OS_TIMINTTOTAL > 0 +__EXT_TIMINT(0) +#if OS_TIMINTTOTAL > 1 +__EXT_TIMINT(1) +#if OS_TIMINTTOTAL > 2 +__EXT_TIMINT(2) +#if OS_TIMINTTOTAL > 3 +__EXT_TIMINT(3) +#if OS_TIMINTTOTAL > 4 +__EXT_TIMINT(4) +#if OS_TIMINTTOTAL > 5 +__EXT_TIMINT(5) +#if OS_TIMINTTOTAL > 6 +__EXT_TIMINT(6) +#if OS_TIMINTTOTAL > 7 +__EXT_TIMINT(7) +#if OS_TIMINTTOTAL > 8 +__EXT_TIMINT(8) +#if OS_TIMINTTOTAL > 9 +__EXT_TIMINT(9) +#if OS_TIMINTTOTAL > 10 +__EXT_TIMINT(10) +#if OS_TIMINTTOTAL > 11 +__EXT_TIMINT(11) +#if OS_TIMINTTOTAL > 12 +__EXT_TIMINT(12) +#if OS_TIMINTTOTAL > 13 +__EXT_TIMINT(13) +#if OS_TIMINTTOTAL > 14 +__EXT_TIMINT(14) +#if OS_TIMINTTOTAL > 15 +__EXT_TIMINT(15) +#if OS_TIMINTTOTAL > 16 +__EXT_TIMINT(16) +#if OS_TIMINTTOTAL > 17 +__EXT_TIMINT(17) +#if OS_TIMINTTOTAL > 18 +__EXT_TIMINT(18) +#if OS_TIMINTTOTAL > 19 +__EXT_TIMINT(19) +#if OS_TIMINTTOTAL > 20 +__EXT_TIMINT(20) +#if OS_TIMINTTOTAL > 21 +__EXT_TIMINT(21) +#if OS_TIMINTTOTAL > 22 +__EXT_TIMINT(22) +#if OS_TIMINTTOTAL > 23 +__EXT_TIMINT(23) +#if OS_TIMINTTOTAL > 24 +__EXT_TIMINT(24) +#if OS_TIMINTTOTAL > 25 +__EXT_TIMINT(25) +#if OS_TIMINTTOTAL > 26 +__EXT_TIMINT(26) +#if OS_TIMINTTOTAL > 27 +__EXT_TIMINT(27) +#if OS_TIMINTTOTAL > 28 +__EXT_TIMINT(28) +#if OS_TIMINTTOTAL > 29 +__EXT_TIMINT(29) +#if OS_TIMINTTOTAL > 30 +__EXT_TIMINT(30) +#if OS_TIMINTTOTAL > 31 +__EXT_TIMINT(31) +#if OS_TIMINTTOTAL > 32 +__EXT_TIMINT(32) +#if OS_TIMINTTOTAL > 33 +__EXT_TIMINT(33) +#if OS_TIMINTTOTAL > 34 +__EXT_TIMINT(34) +#if OS_TIMINTTOTAL > 35 +__EXT_TIMINT(35) +#if OS_TIMINTTOTAL > 36 +__EXT_TIMINT(36) +#if OS_TIMINTTOTAL > 37 +__EXT_TIMINT(37) +#if OS_TIMINTTOTAL > 38 +__EXT_TIMINT(38) +#if OS_TIMINTTOTAL > 39 +__EXT_TIMINT(39) +#if OS_TIMINTTOTAL > 40 +__EXT_TIMINT(40) +#if OS_TIMINTTOTAL > 41 +__EXT_TIMINT(41) +#if OS_TIMINTTOTAL > 42 +__EXT_TIMINT(42) +#if OS_TIMINTTOTAL > 43 +__EXT_TIMINT(43) +#if OS_TIMINTTOTAL > 44 +__EXT_TIMINT(44) +#if OS_TIMINTTOTAL > 45 +__EXT_TIMINT(45) +#if OS_TIMINTTOTAL > 46 +__EXT_TIMINT(46) +#if OS_TIMINTTOTAL > 47 +__EXT_TIMINT(47) +#if OS_TIMINTTOTAL > 48 +__EXT_TIMINT(48) +#if OS_TIMINTTOTAL > 49 +__EXT_TIMINT(49) +#if OS_TIMINTTOTAL > 50 +__EXT_TIMINT(50) +#if OS_TIMINTTOTAL > 51 +__EXT_TIMINT(51) +#if OS_TIMINTTOTAL > 52 +__EXT_TIMINT(52) +#if OS_TIMINTTOTAL > 53 +__EXT_TIMINT(53) +#if OS_TIMINTTOTAL > 54 +__EXT_TIMINT(54) +#if OS_TIMINTTOTAL > 55 +__EXT_TIMINT(55) +#if OS_TIMINTTOTAL > 56 +__EXT_TIMINT(56) +#if OS_TIMINTTOTAL > 57 +__EXT_TIMINT(57) +#if OS_TIMINTTOTAL > 58 +__EXT_TIMINT(58) +#if OS_TIMINTTOTAL > 59 +__EXT_TIMINT(59) +#if OS_TIMINTTOTAL > 60 +__EXT_TIMINT(60) +#if OS_TIMINTTOTAL > 61 +__EXT_TIMINT(61) +#if OS_TIMINTTOTAL > 62 +__EXT_TIMINT(62) +#if OS_TIMINTTOTAL > 63 +__EXT_TIMINT(63) +#if OS_TIMINTTOTAL > 64 +__EXT_TIMINT(64) +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif + +#if OS_TIMQRYTOTAL +#if OS_TIMQRYTOTAL > 0 +__EXT_TIMQRY(0) +#if OS_TIMQRYTOTAL > 1 +__EXT_TIMQRY(1) +#if OS_TIMQRYTOTAL > 2 +__EXT_TIMQRY(2) +#if OS_TIMQRYTOTAL > 3 +__EXT_TIMQRY(3) +#if OS_TIMQRYTOTAL > 4 +__EXT_TIMQRY(4) +#if OS_TIMQRYTOTAL > 5 +__EXT_TIMQRY(5) +#if OS_TIMQRYTOTAL > 6 +__EXT_TIMQRY(6) +#if OS_TIMQRYTOTAL > 7 +__EXT_TIMQRY(7) +#if OS_TIMQRYTOTAL > 8 +__EXT_TIMQRY(8) +#if OS_TIMQRYTOTAL > 9 +__EXT_TIMQRY(9) +#if OS_TIMQRYTOTAL > 10 +__EXT_TIMQRY(10) +#if OS_TIMQRYTOTAL > 11 +__EXT_TIMQRY(11) +#if OS_TIMQRYTOTAL > 12 +__EXT_TIMQRY(12) +#if OS_TIMQRYTOTAL > 13 +__EXT_TIMQRY(13) +#if OS_TIMQRYTOTAL > 14 +__EXT_TIMQRY(14) +#if OS_TIMQRYTOTAL > 15 +__EXT_TIMQRY(15) +#if OS_TIMQRYTOTAL > 16 +__EXT_TIMQRY(16) +#if OS_TIMQRYTOTAL > 17 +__EXT_TIMQRY(17) +#if OS_TIMQRYTOTAL > 18 +__EXT_TIMQRY(18) +#if OS_TIMQRYTOTAL > 19 +__EXT_TIMQRY(19) +#if OS_TIMQRYTOTAL > 20 +__EXT_TIMQRY(20) +#if OS_TIMQRYTOTAL > 21 +__EXT_TIMQRY(21) +#if OS_TIMQRYTOTAL > 22 +__EXT_TIMQRY(22) +#if OS_TIMQRYTOTAL > 23 +__EXT_TIMQRY(23) +#if OS_TIMQRYTOTAL > 24 +__EXT_TIMQRY(24) +#if OS_TIMQRYTOTAL > 25 +__EXT_TIMQRY(25) +#if OS_TIMQRYTOTAL > 26 +__EXT_TIMQRY(26) +#if OS_TIMQRYTOTAL > 27 +__EXT_TIMQRY(27) +#if OS_TIMQRYTOTAL > 28 +__EXT_TIMQRY(28) +#if OS_TIMQRYTOTAL > 29 +__EXT_TIMQRY(29) +#if OS_TIMQRYTOTAL > 30 +__EXT_TIMQRY(30) +#if OS_TIMQRYTOTAL > 31 +__EXT_TIMQRY(31) +#if OS_TIMQRYTOTAL > 32 +__EXT_TIMQRY(32) +#if OS_TIMQRYTOTAL > 33 +__EXT_TIMQRY(33) +#if OS_TIMQRYTOTAL > 34 +__EXT_TIMQRY(34) +#if OS_TIMQRYTOTAL > 35 +__EXT_TIMQRY(35) +#if OS_TIMQRYTOTAL > 36 +__EXT_TIMQRY(36) +#if OS_TIMQRYTOTAL > 37 +__EXT_TIMQRY(37) +#if OS_TIMQRYTOTAL > 38 +__EXT_TIMQRY(38) +#if OS_TIMQRYTOTAL > 39 +__EXT_TIMQRY(39) +#if OS_TIMQRYTOTAL > 40 +__EXT_TIMQRY(40) +#if OS_TIMQRYTOTAL > 41 +__EXT_TIMQRY(41) +#if OS_TIMQRYTOTAL > 42 +__EXT_TIMQRY(42) +#if OS_TIMQRYTOTAL > 43 +__EXT_TIMQRY(43) +#if OS_TIMQRYTOTAL > 44 +__EXT_TIMQRY(44) +#if OS_TIMQRYTOTAL > 45 +__EXT_TIMQRY(45) +#if OS_TIMQRYTOTAL > 46 +__EXT_TIMQRY(46) +#if OS_TIMQRYTOTAL > 47 +__EXT_TIMQRY(47) +#if OS_TIMQRYTOTAL > 48 +__EXT_TIMQRY(48) +#if OS_TIMQRYTOTAL > 49 +__EXT_TIMQRY(49) +#if OS_TIMQRYTOTAL > 50 +__EXT_TIMQRY(50) +#if OS_TIMQRYTOTAL > 51 +__EXT_TIMQRY(51) +#if OS_TIMQRYTOTAL > 52 +__EXT_TIMQRY(52) +#if OS_TIMQRYTOTAL > 53 +__EXT_TIMQRY(53) +#if OS_TIMQRYTOTAL > 54 +__EXT_TIMQRY(54) +#if OS_TIMQRYTOTAL > 55 +__EXT_TIMQRY(55) +#if OS_TIMQRYTOTAL > 56 +__EXT_TIMQRY(56) +#if OS_TIMQRYTOTAL > 57 +__EXT_TIMQRY(57) +#if OS_TIMQRYTOTAL > 58 +__EXT_TIMQRY(58) +#if OS_TIMQRYTOTAL > 59 +__EXT_TIMQRY(59) +#if OS_TIMQRYTOTAL > 60 +__EXT_TIMQRY(60) +#if OS_TIMQRYTOTAL > 61 +__EXT_TIMQRY(61) +#if OS_TIMQRYTOTAL > 62 +__EXT_TIMQRY(62) +#if OS_TIMQRYTOTAL > 63 +__EXT_TIMQRY(63) +#if OS_TIMQRYTOTAL > 64 +__EXT_TIMQRY(64) +#if OS_TIMQRYTOTAL > 65 +__EXT_TIMQRY(65) +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif + +void s_init_timing(void) +{ + s_u8_t i; + #if OS_TIMINTTOTAL + for(i = 0; i < OS_TIMINTTOTAL; i++){ + s_timint_loader[i] = 0; + s_timint_reload[i] = 0; + } + #if OS_TIMINTTOTAL > 0 + __INIT_TIMINT(0) + #if OS_TIMINTTOTAL > 1 + __INIT_TIMINT(1) + #if OS_TIMINTTOTAL > 2 + __INIT_TIMINT(2) + #if OS_TIMINTTOTAL > 3 + __INIT_TIMINT(3) + #if OS_TIMINTTOTAL > 4 + __INIT_TIMINT(4) + #if OS_TIMINTTOTAL > 5 + __INIT_TIMINT(5) + #if OS_TIMINTTOTAL > 6 + __INIT_TIMINT(6) + #if OS_TIMINTTOTAL > 7 + __INIT_TIMINT(7) + #if OS_TIMINTTOTAL > 8 + __INIT_TIMINT(8) + #if OS_TIMINTTOTAL > 9 + __INIT_TIMINT(9) + #if OS_TIMINTTOTAL > 10 + __INIT_TIMINT(10) + #if OS_TIMINTTOTAL > 11 + __INIT_TIMINT(11) + #if OS_TIMINTTOTAL > 12 + __INIT_TIMINT(12) + #if OS_TIMINTTOTAL > 13 + __INIT_TIMINT(13) + #if OS_TIMINTTOTAL > 14 + __INIT_TIMINT(14) + #if OS_TIMINTTOTAL > 15 + __INIT_TIMINT(15) + #if OS_TIMINTTOTAL > 16 + __INIT_TIMINT(16) + #if OS_TIMINTTOTAL > 17 + __INIT_TIMINT(17) + #if OS_TIMINTTOTAL > 18 + __INIT_TIMINT(18) + #if OS_TIMINTTOTAL > 19 + __INIT_TIMINT(19) + #if OS_TIMINTTOTAL > 20 + __INIT_TIMINT(20) + #if OS_TIMINTTOTAL > 21 + __INIT_TIMINT(21) + #if OS_TIMINTTOTAL > 22 + __INIT_TIMINT(22) + #if OS_TIMINTTOTAL > 23 + __INIT_TIMINT(23) + #if OS_TIMINTTOTAL > 24 + __INIT_TIMINT(24) + #if OS_TIMINTTOTAL > 25 + __INIT_TIMINT(25) + #if OS_TIMINTTOTAL > 26 + __INIT_TIMINT(26) + #if OS_TIMINTTOTAL > 27 + __INIT_TIMINT(27) + #if OS_TIMINTTOTAL > 28 + __INIT_TIMINT(28) + #if OS_TIMINTTOTAL > 29 + __INIT_TIMINT(29) + #if OS_TIMINTTOTAL > 30 + __INIT_TIMINT(30) + #if OS_TIMINTTOTAL > 31 + __INIT_TIMINT(31) + #if OS_TIMINTTOTAL > 32 + __INIT_TIMINT(32) + #if OS_TIMINTTOTAL > 33 + __INIT_TIMINT(33) + #if OS_TIMINTTOTAL > 34 + __INIT_TIMINT(34) + #if OS_TIMINTTOTAL > 35 + __INIT_TIMINT(35) + #if OS_TIMINTTOTAL > 36 + __INIT_TIMINT(36) + #if OS_TIMINTTOTAL > 37 + __INIT_TIMINT(37) + #if OS_TIMINTTOTAL > 38 + __INIT_TIMINT(38) + #if OS_TIMINTTOTAL > 39 + __INIT_TIMINT(39) + #if OS_TIMINTTOTAL > 40 + __INIT_TIMINT(40) + #if OS_TIMINTTOTAL > 41 + __INIT_TIMINT(41) + #if OS_TIMINTTOTAL > 42 + __INIT_TIMINT(42) + #if OS_TIMINTTOTAL > 43 + __INIT_TIMINT(43) + #if OS_TIMINTTOTAL > 44 + __INIT_TIMINT(44) + #if OS_TIMINTTOTAL > 45 + __INIT_TIMINT(45) + #if OS_TIMINTTOTAL > 46 + __INIT_TIMINT(46) + #if OS_TIMINTTOTAL > 47 + __INIT_TIMINT(47) + #if OS_TIMINTTOTAL > 48 + __INIT_TIMINT(48) + #if OS_TIMINTTOTAL > 49 + __INIT_TIMINT(49) + #if OS_TIMINTTOTAL > 50 + __INIT_TIMINT(50) + #if OS_TIMINTTOTAL > 51 + __INIT_TIMINT(51) + #if OS_TIMINTTOTAL > 52 + __INIT_TIMINT(52) + #if OS_TIMINTTOTAL > 53 + __INIT_TIMINT(53) + #if OS_TIMINTTOTAL > 54 + __INIT_TIMINT(54) + #if OS_TIMINTTOTAL > 55 + __INIT_TIMINT(55) + #if OS_TIMINTTOTAL > 56 + __INIT_TIMINT(56) + #if OS_TIMINTTOTAL > 57 + __INIT_TIMINT(57) + #if OS_TIMINTTOTAL > 58 + __INIT_TIMINT(58) + #if OS_TIMINTTOTAL > 59 + __INIT_TIMINT(59) + #if OS_TIMINTTOTAL > 60 + __INIT_TIMINT(60) + #if OS_TIMINTTOTAL > 61 + __INIT_TIMINT(61) + #if OS_TIMINTTOTAL > 62 + __INIT_TIMINT(62) + #if OS_TIMINTTOTAL > 63 + __INIT_TIMINT(63) + #if OS_TIMINTTOTAL > 64 + __INIT_TIMINT(64) + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + + #if OS_TIMQRYTOTAL + for(i = 0; i < OS_TIMQRYTOTAL; i++){ + s_timqry_loader[i] = SYSCFG_USERTIMQRYINIT - 1; + s_timqry_reload[i] = SYSCFG_USERTIMQRYINIT - 1; + } + #if OS_TIMQRYTOTAL > 0 + __INIT_TIMQRY(0) + #if OS_TIMQRYTOTAL > 1 + __INIT_TIMQRY(1) + #if OS_TIMQRYTOTAL > 2 + __INIT_TIMQRY(2) + #if OS_TIMQRYTOTAL > 3 + __INIT_TIMQRY(3) + #if OS_TIMQRYTOTAL > 4 + __INIT_TIMQRY(4) + #if OS_TIMQRYTOTAL > 5 + __INIT_TIMQRY(5) + #if OS_TIMQRYTOTAL > 6 + __INIT_TIMQRY(6) + #if OS_TIMQRYTOTAL > 7 + __INIT_TIMQRY(7) + #if OS_TIMQRYTOTAL > 8 + __INIT_TIMQRY(8) + #if OS_TIMQRYTOTAL > 9 + __INIT_TIMQRY(9) + #if OS_TIMQRYTOTAL > 10 + __INIT_TIMQRY(10) + #if OS_TIMQRYTOTAL > 11 + __INIT_TIMQRY(11) + #if OS_TIMQRYTOTAL > 12 + __INIT_TIMQRY(12) + #if OS_TIMQRYTOTAL > 13 + __INIT_TIMQRY(13) + #if OS_TIMQRYTOTAL > 14 + __INIT_TIMQRY(14) + #if OS_TIMQRYTOTAL > 15 + __INIT_TIMQRY(15) + #if OS_TIMQRYTOTAL > 16 + __INIT_TIMQRY(16) + #if OS_TIMQRYTOTAL > 17 + __INIT_TIMQRY(17) + #if OS_TIMQRYTOTAL > 18 + __INIT_TIMQRY(18) + #if OS_TIMQRYTOTAL > 19 + __INIT_TIMQRY(19) + #if OS_TIMQRYTOTAL > 20 + __INIT_TIMQRY(20) + #if OS_TIMQRYTOTAL > 21 + __INIT_TIMQRY(21) + #if OS_TIMQRYTOTAL > 22 + __INIT_TIMQRY(22) + #if OS_TIMQRYTOTAL > 23 + __INIT_TIMQRY(23) + #if OS_TIMQRYTOTAL > 24 + __INIT_TIMQRY(24) + #if OS_TIMQRYTOTAL > 25 + __INIT_TIMQRY(25) + #if OS_TIMQRYTOTAL > 26 + __INIT_TIMQRY(26) + #if OS_TIMQRYTOTAL > 27 + __INIT_TIMQRY(27) + #if OS_TIMQRYTOTAL > 28 + __INIT_TIMQRY(28) + #if OS_TIMQRYTOTAL > 29 + __INIT_TIMQRY(29) + #if OS_TIMQRYTOTAL > 30 + __INIT_TIMQRY(30) + #if OS_TIMQRYTOTAL > 31 + __INIT_TIMQRY(31) + #if OS_TIMQRYTOTAL > 32 + __INIT_TIMQRY(32) + #if OS_TIMQRYTOTAL > 33 + __INIT_TIMQRY(33) + #if OS_TIMQRYTOTAL > 34 + __INIT_TIMQRY(34) + #if OS_TIMQRYTOTAL > 35 + __INIT_TIMQRY(35) + #if OS_TIMQRYTOTAL > 36 + __INIT_TIMQRY(36) + #if OS_TIMQRYTOTAL > 37 + __INIT_TIMQRY(37) + #if OS_TIMQRYTOTAL > 38 + __INIT_TIMQRY(38) + #if OS_TIMQRYTOTAL > 39 + __INIT_TIMQRY(39) + #if OS_TIMQRYTOTAL > 40 + __INIT_TIMQRY(40) + #if OS_TIMQRYTOTAL > 41 + __INIT_TIMQRY(41) + #if OS_TIMQRYTOTAL > 42 + __INIT_TIMQRY(42) + #if OS_TIMQRYTOTAL > 43 + __INIT_TIMQRY(43) + #if OS_TIMQRYTOTAL > 44 + __INIT_TIMQRY(44) + #if OS_TIMQRYTOTAL > 45 + __INIT_TIMQRY(45) + #if OS_TIMQRYTOTAL > 46 + __INIT_TIMQRY(46) + #if OS_TIMQRYTOTAL > 47 + __INIT_TIMQRY(47) + #if OS_TIMQRYTOTAL > 48 + __INIT_TIMQRY(48) + #if OS_TIMQRYTOTAL > 49 + __INIT_TIMQRY(49) + #if OS_TIMQRYTOTAL > 50 + __INIT_TIMQRY(50) + #if OS_TIMQRYTOTAL > 51 + __INIT_TIMQRY(51) + #if OS_TIMQRYTOTAL > 52 + __INIT_TIMQRY(52) + #if OS_TIMQRYTOTAL > 53 + __INIT_TIMQRY(53) + #if OS_TIMQRYTOTAL > 54 + __INIT_TIMQRY(54) + #if OS_TIMQRYTOTAL > 55 + __INIT_TIMQRY(55) + #if OS_TIMQRYTOTAL > 56 + __INIT_TIMQRY(56) + #if OS_TIMQRYTOTAL > 57 + __INIT_TIMQRY(57) + #if OS_TIMQRYTOTAL > 58 + __INIT_TIMQRY(58) + #if OS_TIMQRYTOTAL > 59 + __INIT_TIMQRY(59) + #if OS_TIMQRYTOTAL > 60 + __INIT_TIMQRY(60) + #if OS_TIMQRYTOTAL > 61 + __INIT_TIMQRY(61) + #if OS_TIMQRYTOTAL > 62 + __INIT_TIMQRY(62) + #if OS_TIMQRYTOTAL > 63 + __INIT_TIMQRY(63) + #if OS_TIMQRYTOTAL > 64 + __INIT_TIMQRY(64) + #if OS_TIMQRYTOTAL > 65 + __INIT_TIMQRY(65) + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #if SYSCFG_DEBUGGING == __ENABLED__ + #if SYSCFG_USERTIMQRYINIT - 1 + s_timqry_loader[OS_TMID_DEBUGHOOK] + = s_timqry_reload[OS_TMID_DEBUGHOOK] + = 0; + #endif + s_timqry_loader[OS_TMID_TASKMGR] + = s_timqry_reload[OS_TMID_TASKMGR] + = (1000UL * SYSCFG_TASKMGRUPSPEED) / SYSCFG_SYSTICKCYCLE; + #endif + #endif +} + +#endif diff --git a/System/os_var.c b/System/os_var.c new file mode 100644 index 00000000..e6d3ab32 --- /dev/null +++ b/System/os_var.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_var.c + * @brief 系统全局变量定义 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#include "os_redef.h" + +/* The Soft-RTC */ +#if SYSCFG_SOFTRTC == __ENABLED__ +volatile m_bit_t /*_SYS_MEM_*/ s_sign_rtc = false; +volatile s_every_ts _SYS_MEM_ s_sign_every = {0, 0, 0, 0, 0, 0}; + s_u8_t _SYS_MEM_ s_rtc[2][7] = {sInitRealTime, sInitRealTime}; + s_u8_t _SYS_MEM_ s_month2day = 28; +const s_u8_t _CONST_MEM_ s_month0day[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; +#endif +/* The Task */ + m_bit_t /*_SYS_MEM_*/ s_sign_return = true; +volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule = false; +volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule_all = false; + s_u8_t _SYS_MEM_ s_taskcri_counter = 0; + s_sharing_t _SYS_MEM_ s_tick_counter = 0; + s_taskhand_tsp _SYS_MEM_ s_task_starter = OS_NULL; + s_tasknode_tsp _SYS_MEM_ s_task_current = OS_NULL; + s_tasknode_tsp _SYS_MEM_ s_task_switch = OS_NULL; + s_tasknode_tsp _SYS_MEM_ s_taskpri_tail = OS_NULL; + s_ecode_t _SYS_MEM_ s_startup_code = OS_ECODE_NOERROR; + s_u8_t _SYS_MEM_ s_task_status0 = OS_STATUS_DELETED; +#if SYSCFG_SAFERUNTIME == __ENABLED__ + s_bool_t s_sign_timeout[OS_TASKTOTAL + 1]; +#endif +#if SYSCFG_TIMESHARINGMODE == 2 +const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY] = {SYSCFG_CUSTOMTIMESHARING}; +#endif +/* The Timing Interrupt-Task/Hook */ +#if OS_TIMINTTOTAL + s_bool_t s_timint_hookortask[OS_TIMINTTOTAL]; + s_bool_t s_timint_autoreload[OS_TIMINTTOTAL]; + s_timint_t s_timint_reload[OS_TIMINTTOTAL]; + s_timint_t s_timint_loader[OS_TIMINTTOTAL]; + s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL]; +#endif +/* The Timing Query-Task/Hook */ +#if OS_TIMQRYTOTAL + s_bool_t s_timqry_hookortask[OS_TIMQRYTOTAL]; + s_bool_t s_timqry_autoreload[OS_TIMQRYTOTAL]; + s_timqry_t s_timqry_reload[OS_TIMQRYTOTAL]; + s_timqry_t s_timqry_loader[OS_TIMQRYTOTAL]; + s_timqryhand_tsp s_timqry_handle[OS_TIMQRYTOTAL]; +#endif +/* The Global Variable Accessor */ +volatile m_bit_t /*_SYS_MEM_*/ s_sign_updatecopy = false; +/* The Task Message */ +#if SYSCFG_TASKMSG == __ENABLED__ +volatile m_bit_t /*_SYS_MEM_*/ s_sign_send_taskmsg = false; +#endif +/* The Debug Interface */ +#if SYSCFG_DEBUGGING == __ENABLED__ +volatile m_bit_t /*_SYS_MEM_*/ s_sign_taskmgr = SYSCFG_TASKMGRAUTOSTART; +volatile m_bit_t /*_SYS_MEM_*/ s_sign_debug_send = false; +volatile m_bit_t /*_SYS_MEM_*/ s_sign_debug_recv = false; +volatile s_u8_t _SYS_MEM_ s_debug_sendtype = 0; + char _XDATA_MEM_ s_debug_recvbuff[OS_DEBUGRECVBUFFSIZE]; + char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE]; + char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE]; + char _XDATA_MEM_ * _SYS_MEM_ s_debug_recvptr = s_debug_recvbuff; + char _XDATA_MEM_ * _SYS_MEM_ s_debug_sendptr; + s_alarm_ts s_alarm = {0, 0, 0, 0}; + s_fault_ts s_fault = {0, 0, 0, 0, 0, 0, 0, 0}; +#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__ + s_u32_t s_tick_counter1 = 0; + s_u32_t s_tick_counter2 = 0; +#endif +#if SYSCFG_TASKPC_MONITOR == __ENABLED__ + m_pc_t s_pc = 0; +#endif +#endif diff --git a/System/os_var.h b/System/os_var.h new file mode 100644 index 00000000..154bf583 --- /dev/null +++ b/System/os_var.h @@ -0,0 +1,86 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_var.h + * @brief 系统全局变量声明 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#ifndef __OS_VAR_H +#define __OS_VAR_H +#include "os_redef.h" + +/* The Soft-RTC */ +#if SYSCFG_SOFTRTC == __ENABLED__ +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_rtc; +extern volatile s_every_ts _SYS_MEM_ s_sign_every; +extern s_u8_t _SYS_MEM_ s_rtc[2][7]; +extern s_u8_t _SYS_MEM_ s_month2day; +extern const s_u8_t _CONST_MEM_ s_month0day[13]; +#endif +/* The Task */ +extern m_bit_t /*_SYS_MEM_*/ s_sign_return; +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule; +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule_all; +extern s_u8_t _SYS_MEM_ s_taskcri_counter; +extern s_sharing_t _SYS_MEM_ s_tick_counter; +extern s_taskhand_tsp _SYS_MEM_ s_task_starter; +extern s_tasknode_tsp _SYS_MEM_ s_task_current; +extern s_tasknode_tsp _SYS_MEM_ s_task_switch; +extern s_tasknode_tsp _SYS_MEM_ s_taskpri_tail; +extern s_ecode_t _SYS_MEM_ s_startup_code; +extern s_u8_t _SYS_MEM_ s_task_status0; +#if SYSCFG_SAFERUNTIME == __ENABLED__ +extern s_bool_t s_sign_timeout[OS_TASKTOTAL + 1]; +#endif +#if SYSCFG_TIMESHARINGMODE == 2 +extern const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY]; +#endif +/* The Timing Interrupt-Task/Hook */ +#if OS_TIMINTTOTAL +extern s_bool_t s_timint_hookortask[OS_TIMINTTOTAL]; +extern s_bool_t s_timint_autoreload[OS_TIMINTTOTAL]; +extern s_timint_t s_timint_reload[OS_TIMINTTOTAL]; +extern s_timint_t s_timint_loader[OS_TIMINTTOTAL]; +extern s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL]; +#endif +/* The Timing Query-Task/Hook */ +#if OS_TIMQRYTOTAL +extern s_bool_t s_timqry_hookortask[OS_TIMQRYTOTAL]; +extern s_bool_t s_timqry_autoreload[OS_TIMQRYTOTAL]; +extern s_timqry_t s_timqry_reload[OS_TIMQRYTOTAL]; +extern s_timqry_t s_timqry_loader[OS_TIMQRYTOTAL]; +extern s_timqryhand_tsp s_timqry_handle[OS_TIMQRYTOTAL]; +#endif +/* The Global Variable Accessor */ +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_updatecopy; +/* The Task Message */ +#if SYSCFG_TASKMSG == __ENABLED__ +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_send_taskmsg; +#endif +/* The Debug Interface */ +#if SYSCFG_DEBUGGING == __ENABLED__ +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_taskmgr; +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_debug_send; +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_debug_recv; +extern volatile s_u8_t _SYS_MEM_ s_debug_sendtype; +extern char _XDATA_MEM_ s_debug_recvbuff[OS_DEBUGRECVBUFFSIZE]; +extern char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE]; +extern char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE]; +extern char _XDATA_MEM_ * _SYS_MEM_ s_debug_recvptr; +extern char _XDATA_MEM_ * _SYS_MEM_ s_debug_sendptr; +extern s_alarm_ts s_alarm; +extern s_fault_ts s_fault; +#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__ +extern s_u32_t s_tick_counter1; +extern s_u32_t s_tick_counter2; +#endif +#if SYSCFG_TASKPC_MONITOR == __ENABLED__ +extern m_pc_t s_pc; +#endif +#endif + +extern void (_CODE_MEM_ * const _CONST_MEM_ sPendSV_FIFOHandler[OS_SVID_END])(void _OBJ_MEM_ *); + +#endif diff --git a/System/sv_create.h b/System/sv_create.h new file mode 100644 index 00000000..1d13a8ee --- /dev/null +++ b/System/sv_create.h @@ -0,0 +1,282 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_create.h + * @brief 创建服务(用于创建各种内核对象) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#ifndef __SV_CREATE_H +#define __SV_CREATE_H + + + +/* + * 声明任务 + */ + +/* 无私信 */ +#define sCSV_ExternTask(name) \ + extern s_tasknode_tsp u_taskhandle_##name; \ + extern s_tasknode_ts u_taskhand_##name; \ + void name(void) + +#define dCSV_ExternTask(name) \ + extern s_tasknode_tsp u_taskhandle_##name; \ + extern s_taskhand_ts u_taskhand_##name; \ + void name(void) + +/* 有私信 */ +#define sCSV_ExternTask_Msg(name) \ + extern s_tasknode_tsp u_taskhandle_##name; \ + extern s_tasknode_ts u_taskhand_##name; \ + void name(MCUCFG_TASKMSG_VAR, + +#define dCSV_ExternTask_Msg(name) \ + extern s_tasknode_tsp u_taskhandle_##name; \ + extern s_taskhand_ts u_taskhand_##name; \ + void name(MCUCFG_TASKMSG_VAR, + + + +/* + * 创建任务 + */ + +/* 创建一般任务(静态)*/ +#if SYSCFG_DEBUGGING == __ENABLED__ + #if SYSCFG_SAFERUNTIME == __ENABLED__ + #define sCSV_CreateTask(name, pri, tss, srt, ntm, ent) \ + s_tasknode_ts u_taskhand_##name; \ + s_tasknode_tsp u_taskhandle_##name = &u_taskhand_##name; \ + MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \ + s_tasknode_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, #name, srt, u_taskstack_##name, 0}; \ + void name \ + sCreateTaskMsg_##ntm + #else + #define sCSV_CreateTask(name, pri, tss, srt, ntm, ent) \ + s_tasknode_ts u_taskhand_##name; \ + s_tasknode_tsp u_taskhandle_##name = &u_taskhand_##name; \ + MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \ + s_tasknode_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, #name, /**/ u_taskstack_##name, 0}; \ + void name \ + sCreateTaskMsg_##ntm + #endif +#else + #if SYSCFG_SAFERUNTIME == __ENABLED__ + #define sCSV_CreateTask(name, pri, tss, srt, ntm, ent) \ + s_tasknode_ts u_taskhand_##name; \ + s_tasknode_tsp u_taskhandle_##name = &u_taskhand_##name; \ + MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \ + s_tasknode_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, /****/ srt, u_taskstack_##name, 0}; \ + void name \ + sCreateTaskMsg_##ntm + #else + #define sCSV_CreateTask(name, pri, tss, srt, ntm, ent) \ + s_tasknode_ts u_taskhand_##name; \ + s_tasknode_tsp u_taskhandle_##name = &u_taskhand_##name; \ + MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \ + s_tasknode_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, /****/ /**/ u_taskstack_##name, 0}; \ + void name \ + sCreateTaskMsg_##ntm + #endif +#endif +/* 创建一般任务(动态)*/ +#if SYSCFG_DEBUGGING == __ENABLED__ + #if SYSCFG_SAFERUNTIME == __ENABLED__ + #define dCSV_CreateTask(name, pri, tss, srt, ntm, ent) \ + s_tasknode_tsp u_taskhandle_##name = OS_NULL; \ + s_taskhand_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, #name, srt}; \ + void name \ + sCreateTaskMsg_##ntm + #else + #define dCSV_CreateTask(name, pri, tss, srt, ntm, ent) \ + s_tasknode_tsp u_taskhandle_##name = OS_NULL; \ + s_taskhand_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, #name}; \ + void name \ + sCreateTaskMsg_##ntm + #endif +#else + #if SYSCFG_SAFERUNTIME == __ENABLED__ + #define dCSV_CreateTask(name, pri, tss, srt, ntm, ent) \ + s_tasknode_tsp u_taskhandle_##name = OS_NULL; \ + s_taskhand_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, srt}; \ + void name \ + sCreateTaskMsg_##ntm + #else + #define dCSV_CreateTask(name, pri, tss, srt, ntm, ent) \ + s_tasknode_tsp u_taskhandle_##name = OS_NULL; \ + s_taskhand_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent}; \ + void name \ + sCreateTaskMsg_##ntm + #endif +#endif +/* 创建定时中断任务 */ +#define sCSV_CreateTask_TimInt(tmid, arl, name, pri, tss, srt, ntm) \ + void name(void); \ + s_tasknode_ts u_taskhand_##name; \ + const s_timinthand_ts _CONST_MEM_ u_timinthand_##tmid = {0x80 | arl, &u_taskhand_##name}; \ + sCSV_CreateTask(name, pri, tss, srt, ntm, name) + +#define dCSV_CreateTask_TimInt(tmid, arl, name, pri, tss, srt, ntm) \ + void name(void); \ + s_taskhand_ts u_taskhand_##name; \ + const s_timinthand_ts _CONST_MEM_ u_timinthand_##tmid = {0x80 | arl, &u_taskhand_##name}; \ + dCSV_CreateTask(name, pri, tss, srt, ntm, name) + +/* 创建定时查询任务 */ +#define sCSV_CreateTask_TimQry(tmid, event, arl, name, pri, tss, srt, ntm) \ + void name(void); \ + s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING {return (event ? true : false);} \ + s_tasknode_ts u_taskhand_##name; \ + const s_timqryhand_ts _CONST_MEM_ u_timqryhand_##tmid = {0x80 | arl, &u_taskhand_##name, u_timqryevent_##tmid}; \ + sCSV_CreateTask(name, pri, tss, srt, ntm, name) + +#define dCSV_CreateTask_TimQry(tmid, event, arl, name, pri, tss, srt, ntm) \ + void name(void); \ + s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING {return (event ? true : false);} \ + s_taskhand_ts u_taskhand_##name; \ + const s_timqryhand_ts _CONST_MEM_ u_timqryhand_##tmid = {0x80 | arl, &u_taskhand_##name, u_timqryevent_##tmid}; \ + dCSV_CreateTask(name, pri, tss, srt, ntm, name) + + + +/* + * 创建钩子 + */ + +/* 创建定时中断钩子 */ +#define sCSV_CreateHook_TimInt(tmid, arl, name) \ + void name(void); \ + const s_timinthand_ts _CONST_MEM_ u_timinthand_##tmid = {0x00 | arl, name}; \ + void name(void) MCUCFG_USING + +/* 创建定时查询钩子 */ +#define sCSV_CreateHook_TimQry(tmid, event, arl, name) \ + s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING {return (event ? true : false);} \ + void name(void); \ + const s_timqryhand_ts _CONST_MEM_ u_timqryhand_##tmid = {0x00 | arl, name, u_timqryevent_##tmid}; \ + void name(void) MCUCFG_USING + + + +/* + * 互斥信号量 + */ + +/* 声明 */ +#define sCSV_ExternMut(name) \ + extern s_mutex_ts name + +/* 创建 */ +#define sCSV_CreateMut(name) \ + s_mutex_ts name = {false, OS_NULL, 0} + + + +/* + * 二值信号量 + */ + +/* 声明 */ +#define sCSV_ExternBin(name) \ + extern s_binary_ts name + +/* 创建 */ +#define sCSV_CreateBin(name, init) \ + s_binary_ts name = {init, OS_NULL} + + + +/* + * 计数信号量 + */ + +/* 声明 */ +#define sCSV_ExternSem(name) \ + extern s_semaph_ts name + +/* 创建 */ +#define sCSV_CreateSem(name, init, max) \ + s_semaph_ts name = {init, max, OS_NULL} + + + +/* + * 飞信 + */ + +/* 声明信箱 */ +#define sCSV_ExternFetion(name) \ + extern s_fetion_ts name + +/* 创建信箱 */ +#define sCSV_CreateFetion(name) \ + s_fetion_ts name = {false, OS_NULL} + + + +/* + * 消息邮箱 + */ + +/* 声明邮箱 */ +#define sCSV_ExternMailbox(name) \ + extern s_mailbox_ts name + +/* 创建邮箱 */ +#define sCSV_CreateMailbox(name) \ + s_mailbox_ts name = {false, OS_NULL, OS_NULL} + + + +/* + * 消息队列 + */ + +/* 声明静态消息队列 */ +#define sCSV_ExternQueue(name) \ + extern ss_queue_ts name + +/* 声明动态消息队列 */ +#define dCSV_ExternQueue(name) \ + extern sd_queue_ts name + +/* 创建静态消息队列 */ +#define sCSV_CreateQueue(name, mode, len) \ + void *u_queue_##name[len]; \ + ss_queue_ts name = {0, __STATIC__, mode, len, OS_NULL, true, u_queue_##name, u_queue_##name + len - 1, u_queue_##name} + +/* 创建动态消息队列 */ +#define dCSV_CreateQueue(name, mode, len) \ + sd_queue_ts name = {0, __DYNAMIC__, mode, len, OS_NULL, true, OS_NULL, OS_NULL} + + + +/* + * 事件标志组(必须声明) + */ + +/* 声明 */ +#define sCSV_ExternFlagGroup(name, bits) \ + typedef struct{bits}u_##name##_ts; \ + extern volatile u_##name##_ts name + +/* 创建 */ +#define sCSV_CreateFlagGroup(name) \ + volatile u_##name##_ts name + + + +/* + * 线程内存 + */ + +/* 创建线程内存池 */ +#define sCSV_CreateMempool \ + s_thrmem_ts u_thrmem = {OS_NULL, OS_NULL, 0} + + + +#endif diff --git a/System/sv_int_loc.c b/System/sv_int_loc.c new file mode 100644 index 00000000..0beb0c51 --- /dev/null +++ b/System/sv_int_loc.c @@ -0,0 +1,137 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_int_loc.c + * @brief 中断本地服务(仅在用户中断中调用,并在本地执行) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#include "os_var.h" +#include "os_api.h" + +#if SYSCFG_MCUCORE == 8051 +#pragma NOAREGS +#endif + + + +/* + * 任务调度 + */ + +void si_task_schedule(void) +{ + s_sign_schedule_all = true; + s_sign_schedule = true; + mPendSV_Set; +} + + + +/* + * 二值信号量获取 + */ +#if SYSCFG_BINARY == __ENABLED__ +s_bool_t si_take_binary(s_binary_tsp bin) +{ + if(bin->binary){ + bin->binary = false; + return true; + } + return false; +} +#endif + + + +/* + * 接收飞信 + */ +#if SYSCFG_FETION == __ENABLED__ +m_fetion_t si_recv_fetion(s_fetion_tsp fet) +{ + m_fetion_t fetion = fet->fetion; + fet->fetion = false; + return fetion; +} +#endif + + + +/* + * 接收邮件 + */ +#if SYSCFG_MAILBOX == __ENABLED__ +void *si_recv_mail(s_mailbox_tsp mbox) +{ + if(mbox->flag){ + mbox->flag = false; + return mbox->mail; + } + return OS_NULL; +} +#endif + + + +/* + * 接收消息 + */ +#if SYSCFG_MSGQUEUE == __ENABLED__ + +#if SYSCFG_MCUCORE == 8051 + +s_bool_t si_can_access_queue(s_queue_tsp queue) +{ + if(!queue->mutex) return false; + queue->mutex = false; + + if(queue->type == __DYNAMIC__){ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_fault.error_recvmsg_int = true; + #endif + } + else if(!queue->counter); + else return true; + + queue->mutex = true; + return false; +} + +static void *_recv_msg_(s_bool_t _OBJ_MEM_ *mut, void *msg) +{ + *mut = true; + return msg; +} + +void *si_recv_msg(s_queue_tsp queue) +{ + void *msg; + sRecvMsg_Static(msg); + return _recv_msg_((s_bool_t *)&queue->mutex, msg); +} + +#else + +void *si_recv_msg(s_queue_tsp queue) +{ + void *msg = OS_NULL; + if(!queue->mutex) return OS_NULL; + queue->mutex = false; + + if(queue->type == __DYNAMIC__){ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_fault.error_recvmsg_int = true; + #endif + } + else if(!queue->counter); + else sRecvMsg_Static(msg); + + queue->mutex = true; + return msg; +} + +#endif + +#endif diff --git a/System/sv_int_loc.h b/System/sv_int_loc.h new file mode 100644 index 00000000..4c7d659e --- /dev/null +++ b/System/sv_int_loc.h @@ -0,0 +1,96 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_int_loc.h + * @brief 中断本地服务(仅在用户中断中调用,并在本地执行) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#ifndef __SV_INT_LOC_H +#define __SV_INT_LOC_H + +void si_task_schedule (void); +s_bool_t si_take_binary (s_binary_tsp bin); +m_fetion_t si_recv_fetion (s_fetion_tsp fet); +void *si_recv_mail (s_mailbox_tsp mbox); +void *si_recv_msg (s_queue_tsp queue); +s_bool_t si_can_access_queue(s_queue_tsp queue); + + + +/* + * 二值信号量获取 + */ + +#define sISV_TakeBin(bin) \ + si_take_binary(&bin) + + + +/* + * 接收飞信 + */ + +#define sISV_RecvFetion(tbox) \ + si_recv_fetion(&tbox) + + + +/* + * 接收邮件 + */ + +#define sISV_RecvMail(mbox) \ + si_recv_mail(&mbox) + + + +/* + * 接收消息 + */ +#if SYSCFG_MCUCORE == 8051 +#define sISV_RecvMsg(que) \ +( \ + si_can_access_queue(que) ? si_recv_msg(que) : OS_NULL \ +) +#else +#define sISV_RecvMsg(que) \ + si_recv_msg(que) +#endif + + + +/* + * 查询标志组 + */ + +#define sISV_QueryFlagGroup(group) \ +( \ + sizeof(group) == 1 ? *(s_u8_t *)&group ? true : false \ + : sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \ + : sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \ + : false \ +) + + + +/* + * 软件RTC - 获取时间 + */ + +#define sISV_GetTime(t) \ + s_memcpy(t, !iWhichGVar_Read ? s_rtc[0] : s_rtc[1], sizeof(s_rtc[0])) + + + +/* + * 任务调度 + */ + +#define sISV_TaskSchedule \ + si_task_schedule() + + + +#endif diff --git a/System/sv_int_pend_fifo.c b/System/sv_int_pend_fifo.c new file mode 100644 index 00000000..07df3dd8 --- /dev/null +++ b/System/sv_int_pend_fifo.c @@ -0,0 +1,260 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_int_pend_fifo.c + * @brief 中断挂起服务 with FIFO - 执行函数(仅在PendSV中由系统调用并执行) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#include "os_link.h" + +/* 恢复任务 */ +static void _resume_task_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_tasknode_tsp node = ((sp_task_tsp)sv)->node; + if(node == OS_NULL) return; + if(node->status & OS_STATUS_SUSPENDED){ + node->status &= (~OS_STATUS_SUSPENDED & 0xFF); + s_schedule_ready(node); + } +} + +/* 挂起任务 */ +static void _suspend_task_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_tasknode_tsp node = ((sp_task_tsp)sv)->node; + if(node == OS_NULL) return; + if(node->status < OS_STATUS_SUSPENDED){ + node->status |= OS_STATUS_SUSPENDED; + if(node == s_task_current){ + s_sign_schedule = true; + } + } +} + +/* 删除任务 */ +static void _delete_task_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_tasknode_tsp node = ((sp_task_tsp)sv)->node; + if(node == OS_NULL) return; + if(node->status < OS_STATUS_DELETED){ + node->status = OS_STATUS_DELETED; + if(node == s_task_current){ + s_sign_schedule = true; + } + } +} + +/* 设置任务优先级 */ +static void _set_taskpri_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_tasknode_tsp node = ((sp_taskpri_tsp)sv)->node; + if(node == OS_NULL) return; + if(node->status < OS_STATUS_STOPPED){ + s_u8_t pri = ((sp_taskpri_tsp)sv)->pri; + if(node->pri != pri){ + node->pri = pri; + s_set_taskpri(node); + s_sign_schedule = true; + } + } +} + +/* 设置阻塞(时间)*/ +static void _set_block_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_tasknode_tsp node = ((sp_blocktime_tsp)sv)->node; + if(node == OS_NULL) return; + if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){ + if(!((sp_blocktime_tsp)sv)->tick){ + node->status = OS_STATUS_READY; + s_schedule_taskpri(node); + } + node->timer = ((sp_blocktime_tsp)sv)->tick; + } +} + +/* 清除阻塞(状态)*/ +static void _clear_block_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_tasknode_tsp node = ((sp_task_tsp)sv)->node; + if(node == OS_NULL) return; + if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){ + node->status = OS_STATUS_READY; + node->timer = 0; + s_schedule_taskpri(node); + } +} + +/* 定时中断 */ +#if OS_TIMINTTOTAL +static void _timint_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_timint_loader[((sp_timint_tsp)sv)->tmid] + = s_timint_reload[((sp_timint_tsp)sv)->tmid] + = ((sp_timint_tsp)sv)->tick; +} +#else +#define _timint_ (s_voidvptr_tfp)0 +#endif + +/* 定时查询 */ +#if OS_TIMQRYTOTAL +static void _timqry_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_timqry_loader[((sp_timqry_tsp)sv)->tmid] + = s_timqry_reload[((sp_timqry_tsp)sv)->tmid] + = ((sp_timqry_tsp)sv)->tick; +} +#else +#define _timqry_ (s_voidvptr_tfp)0 +#endif + +/* 上锁/给予二值信号量 */ +#if SYSCFG_BINARY == __ENABLED__ +static void _binary_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_binary_tsp bin = ((sp_binary_tsp)sv)->bin; + bin->binary = ((sp_binary_tsp)sv)->value; + if(!bin->binary) return; + s_schedule_notnull(bin->node); +} +#else +#define _binary_ (s_voidvptr_tfp)0 +#endif + +/* 给予计数信号量 */ +#if SYSCFG_SEMAPHORE == __ENABLED__ +static void _give_sem_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_semaph_tsp sem = ((sp_semaph_tsp)sv)->sem; + if(sem->counter < sem->maximum){ + sem->counter++; + } + s_schedule_notnull(sem->node); +} +#else +#define _give_sem_ (s_voidvptr_tfp)0 +#endif + +/* 发送飞信 */ +#if SYSCFG_FETION == __ENABLED__ +static void _send_fetion_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_fetion_tsp tbox = ((sp_fetion_tsp)sv)->tbox; + tbox->fetion = ((sp_fetion_tsp)sv)->fetion; + s_schedule_notnull(tbox->node); +} +#else +#define _send_fetion_ (s_voidvptr_tfp)0 +#endif + +/* 发送邮件 */ +#if SYSCFG_MAILBOX == __ENABLED__ +static void _send_mail_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_mailbox_tsp mbox = ((sp_mailbox_tsp)sv)->mbox; + mbox->flag = false; + mbox->mail = ((sp_mailbox_tsp)sv)->mail; + mbox->flag = true; + s_schedule_notnull(mbox->node); +} +#else +#define _send_mail_ (s_voidvptr_tfp)0 +#endif + +/* 发送消息 */ +#if SYSCFG_MSGQUEUE == __ENABLED__ +static void _send_msg_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + s_queue_tsp queue = ((sp_msg_tsp)sv)->queue; + queue->mutex = false; + + if(queue->counter == queue->len){ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_alarm.overflow_msgqueue = true; + #endif + queue->mutex = true; + return; + } + if(queue->type == __DYNAMIC__){ + s_msgnode_tsp node = OS_NULL; + node = (s_msgnode_tsp)s_malloc(sizeof(s_msgnode_ts)); + if(node == OS_NULL){ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_fault.mallocfailed_msgnode = true; + #endif + queue->mutex = true; + return; + } + sSendMsg_Dynamic(((sp_msg_tsp)sv)->msg); + } + else + sSendMsg_Static(((sp_msg_tsp)sv)->msg); + + s_schedule_notnull(queue->node); + queue->mutex = true; +} +#else +#define _send_msg_ (s_voidvptr_tfp)0 +#endif + +/* 写标志组 */ +#if SYSCFG_FLAGGROUP == __ENABLED__ +static void _group_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + switch(((sp_group_tsp)sv)->size){ + case +1: *(s_u8_t *)((sp_group_tsp)sv)->group |= ((sp_group_tsp)sv)->value; break; + case +2: *(s_u16_t *)((sp_group_tsp)sv)->group |= ((sp_group_tsp)sv)->value; break; + case +4: *(s_u32_t *)((sp_group_tsp)sv)->group |= ((sp_group_tsp)sv)->value; break; + case -1: *(s_u8_t *)((sp_group_tsp)sv)->group &=~((sp_group_tsp)sv)->value; break; + case -2: *(s_u16_t *)((sp_group_tsp)sv)->group &=~((sp_group_tsp)sv)->value; break; + case -4: *(s_u32_t *)((sp_group_tsp)sv)->group &=~((sp_group_tsp)sv)->value; break; + } +} +#else +#define _group_ (s_voidvptr_tfp)0 +#endif + +/* 全局变量写访问 */ +static void _gvar_write_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + ((sp_gvar_tsp)sv)->size + ? s_memcpy(((sp_gvar_tsp)sv)->gp, ((sp_gvar_tsp)sv)->lp, ((sp_gvar_tsp)sv)->size) + : s_strcpy((char *)((sp_gvar_tsp)sv)->gp, (char *)((sp_gvar_tsp)sv)->lp); +} + +/* 挂起服务调用 */ +static void _pendsvc_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + (*((sp_pendsvc_tsp)sv)->fp)(); +} + +/* 发送信号 */ +static void _send_sign_(void _OBJ_MEM_ *sv) MCUCFG_C51USING +{ + *((sp_sign_tsp)sv)->sign = true; +} + +typedef void (_CODE_MEM_ *s_voidvptr_tfp)(void _OBJ_MEM_ *); +void (_CODE_MEM_ * const _CONST_MEM_ sPendSV_FIFOHandler[OS_SVID_END])(void _OBJ_MEM_ *) = +{ + _resume_task_, + _suspend_task_, + _delete_task_, + _set_taskpri_, + _set_block_, + _clear_block_, + _timint_, + _timqry_, + _binary_, + _give_sem_, + _send_fetion_, + _send_mail_, + _send_msg_, + _group_, + _gvar_write_, + _pendsvc_, + _send_sign_ +}; diff --git a/System/sv_int_pend_fifo.h b/System/sv_int_pend_fifo.h new file mode 100644 index 00000000..e3188bbf --- /dev/null +++ b/System/sv_int_pend_fifo.h @@ -0,0 +1,223 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_int_pend_fifo.h + * @brief 中断挂起服务 with FIFO - 调用宏(仅在用户中断中调用) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#ifndef __SV_INT_PEND_FIFO_H +#define __SV_INT_PEND_FIFO_H + + + +/* + * 任务 + */ + +/* 恢复任务 */ +#define sPSV_ResumeTask(load) \ +do{ \ + static sp_task_ts u_psv = {OS_SVID_RESUMETASK, OS_NULL}; \ + u_psv.node = load; \ + mPendSV_FIFOLoad; \ +}while(false) + +/* 挂起任务 */ +#define sPSV_SuspendTask(load) \ +do{ \ + static sp_task_ts u_psv = {OS_SVID_SUSPENDTASK, OS_NULL}; \ + u_psv.node = load; \ + mPendSV_FIFOLoad; \ +}while(false) + +/* 删除任务 */ +#define sPSV_DeleteTask(load) \ +do{ \ + static sp_task_ts u_psv = {OS_SVID_DELETETASK, OS_NULL}; \ + u_psv.node = load; \ + mPendSV_FIFOLoad; \ +}while(false) + +/* 设置任务优先级 */ +#define sPSV_SetTaskPri(load, pri) \ +do{ \ + static sp_taskpri_ts u_psv = {OS_SVID_SETTASKPRI, OS_NULL, pri}; \ + u_psv.node = load; \ + mPendSV_FIFOLoad; \ +}while(false) + +/* 设置阻塞(时间)*/ +#define sPSV_SetBlock(load, tc) \ +do{ \ + static sp_blocktime_ts u_psv = {OS_SVID_SETBLOCK, OS_NULL, tc}; \ + u_psv.node = load; \ + mPendSV_FIFOLoad; \ +}while(false) + +/* 清除阻塞(状态)*/ +#define sPSV_ClearBlock(load) \ +do{ \ + static sp_task_ts u_psv = {OS_SVID_CELARBLOCK, OS_NULL}; \ + u_psv.node = load; \ + mPendSV_FIFOLoad; \ +}while(false) + + + +/* + * 定时 + */ + +/* 定时中断 */ +#define sPSV_TimInt(tmid, tc) \ +do{ \ + static sp_timint_ts u_psv = {OS_SVID_TIMINT, tmid, 0}; \ + u_psv.tick = tc; \ + mPendSV_FIFOLoad; \ +}while(false) + +/* 定时查询 */ +#define sPSV_TimQry(tmid, tc) \ +do{ \ + static sp_timqry_ts u_psv = {OS_SVID_TIMQRY, tmid, 0}; \ + u_psv.tick = tc; \ + mPendSV_FIFOLoad; \ +}while(false) + + + +/* + * 二值信号量 + */ + +/* 上锁/给予 */ +#define sPSV_WriteBin(bin, val) \ +do{ \ + static sp_binary_ts u_psv = {OS_SVID_BINARY, &bin, val}; \ + mPendSV_FIFOLoad; \ +}while(false) + + + +/* + * 计数信号量 + */ + +/* 给予 */ +#define sPSV_GiveSem(sem) \ +do{ \ + static sp_semaph_ts u_psv = {OS_SVID_GIVESEM, &sem}; \ + mPendSV_FIFOLoad; \ +}while(false) + + + +/* + * 飞信 + */ + +/* 发送飞信 */ +#define sPSV_SendFetion(tbox, tion) \ +do{ \ + static sp_fetion_ts u_psv = {OS_SVID_SENDFETION, &tbox, 0}; \ + u_psv.fetion = tion; \ + mPendSV_FIFOLoad; \ +}while(false) + + + +/* + * 消息邮箱 + */ + +/* 发送邮件 */ +#define sPSV_SendMail(mbox, _mail) \ +do{ \ + static sp_mailbox_ts u_psv = {OS_SVID_SENDMAIL, &mbox, OS_NULL}; \ + u_psv.mail = _mail; \ + mPendSV_FIFOLoad; \ +}while(false) + + + +/* + * 消息队列 + */ + +/* 发送消息 */ +#define sPSV_SendMsg(que, _msg) \ +do{ \ + static sp_msg_ts u_psv = {OS_SVID_SENDMSG, que, OS_NULL}; \ + u_psv.msg = _msg; \ + mPendSV_FIFOLoad; \ +}while(false) + + + +/* + * 事件标志组 + */ + +/* 清除标志组 */ +#define sPSV_ClearFlagGroup(group) \ +do{ \ + static sp_group_ts u_psv = {OS_SVID_GROUP, (void *)&group, -sizeof(group), ~0}; \ + mPendSV_FIFOLoad; \ +}while(false) + +/* 写多标志位 */ +#define sPSV_WriteFlagBits(group, sign, nbit) \ +do{ \ + static sp_group_ts u_psv = {OS_SVID_GROUP, (void *)&group, sign##sizeof(group), 0}; \ + u_##group##_ts lv; \ + miWriteFlagBits; \ + sizeof(lv) == 1 ? *(s_u8_t *)&lv = false : MCUCFG_TERNARYMASK \ + sizeof(lv) == 2 ? *(s_u16_t *)&lv = false : MCUCFG_TERNARYMASK \ + sizeof(lv) == 4 ? *(s_u32_t *)&lv = false : false; \ + siWriteFlagBits_##nbit( + + + +/* + * 全局变量 + */ + +/* 全局变量写访问 */ +#define sPSV_WriteGVar(gp, lp, size) \ +do{ \ + static sp_gvar_ts u_psv = {OS_SVID_GVARWRITE, gp, lp, size}; \ + mPendSV_FIFOLoad; \ +}while(false) + +/* 挂起服务调用 */ +#define sPSV_PendSVC(fp) \ +do{ \ + static sp_pendsvc_ts u_psv = {OS_SVID_PENDSVC, fp}; \ + mPendSV_FIFOLoad; \ +}while(false) + +/* 发送信号 */ +#define sPSV_SendSign(sign) \ +do{ \ + static sp_sign_ts u_psv = {OS_SVID_SENDSIGN, (s_bool_t *)&sign}; \ + mPendSV_FIFOLoad; \ +}while(false) + + + +/* + * 软件RTC + */ + +/* 设置时间 */ +#define sPSV_SetTime(t) \ +do{ \ + iWriteGAry(s_rtc[0], t, sizeof(s_rtc[0])); \ + iSendSign(s_sign_rtc); \ +}while(false) + + + +#endif diff --git a/System/sv_int_pend_flag.c b/System/sv_int_pend_flag.c new file mode 100644 index 00000000..8866ad62 --- /dev/null +++ b/System/sv_int_pend_flag.c @@ -0,0 +1,91 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_int_pend_flag.c + * @brief 中断挂起服务 with FLAG(仅在PendSV中调用并执行) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#include "os_link.h" + +/* 恢复任务 */ +void sp_resume_task(s_tasknode_tsp node) MCUCFG_C51USING +{ + if(node == OS_NULL) return; + if(node->status & OS_STATUS_SUSPENDED){ + node->status &= (~OS_STATUS_SUSPENDED & 0xFF); + s_schedule_ready(node); + } +} + +/* 挂起任务 */ +void sp_suspend_task(s_tasknode_tsp node) MCUCFG_C51USING +{ + if(node == OS_NULL) return; + if(node->status < OS_STATUS_SUSPENDED){ + node->status |= OS_STATUS_SUSPENDED; + if(node == s_task_current){ + s_sign_schedule = true; + } + } +} + +/* 删除任务 */ +void sp_delete_task(s_tasknode_tsp node) MCUCFG_C51USING +{ + if(node == OS_NULL) return; + if(node->status < OS_STATUS_DELETED){ + node->status = OS_STATUS_DELETED; + if(node == s_task_current){ + s_sign_schedule = true; + } + } +} + +/* 设置任务优先级 */ +void sp_set_taskpri(s_tasknode_tsp node, s_u8_t pri) MCUCFG_C51USING +{ + if(node == OS_NULL) return; + if(node->status < OS_STATUS_STOPPED){ + if(node->pri != pri){ + node->pri = pri; + s_set_taskpri(node); + s_sign_schedule = true; + } + } +} + +/* 设置阻塞(时间)*/ +void sp_set_block(s_tasknode_tsp node, s_delay_t tick) MCUCFG_C51USING +{ + if(node == OS_NULL) return; + if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){ + if(!tick){ + node->status = OS_STATUS_READY; + s_schedule_taskpri(node); + } + node->timer = tick; + } +} + +/* 清除阻塞(状态)*/ +void sp_clear_block(s_tasknode_tsp node) MCUCFG_C51USING +{ + if(node == OS_NULL) return; + if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){ + node->status = OS_STATUS_READY; + node->timer = 0; + s_schedule_taskpri(node); + } +} + +/* 上锁/给予二值信号量 */ +#if SYSCFG_BINARY == __ENABLED__ +void sp_write_binary(s_binary_tsp bin, s_bool_t value) MCUCFG_C51USING +{ + bin->binary = value; + if(!value) return; + s_schedule_notnull(bin->node); +} +#endif diff --git a/System/sv_int_pend_flag.h b/System/sv_int_pend_flag.h new file mode 100644 index 00000000..c8f0169b --- /dev/null +++ b/System/sv_int_pend_flag.h @@ -0,0 +1,63 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_int_pend_flag.h + * @brief 中断挂起服务 with FLAG(仅在PendSV中调用并执行) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#ifndef __SV_INT_PEND_FLAG_H +#define __SV_INT_PEND_FLAG_H + +void sp_resume_task (s_tasknode_tsp node); +void sp_suspend_task(s_tasknode_tsp node); +void sp_delete_task (s_tasknode_tsp node); +void sp_set_taskpri (s_tasknode_tsp node, s_u8_t pri); +void sp_set_block (s_tasknode_tsp node, s_delay_t tick); +void sp_clear_block (s_tasknode_tsp node); +void sp_write_binary(s_binary_tsp bin, s_bool_t value); + + + +/* + * 任务 + */ + +/* 恢复任务 */ +#define sPS2_ResumeTask(load) \ + sp_resume_task(load) + +/* 挂起任务 */ +#define sPS2_SuspendTask(load) \ + sp_suspend_task(load) + +/* 删除任务 */ +#define sPS2_DeleteTask(load) \ + sp_delete_task(load) + +/* 设置任务优先级 */ +#define sPS2_SetTaskPri(load, pri) \ + sp_set_taskpri(load, pri) + +/* 设置阻塞(时间)*/ +#define sPS2_SetBlock(load, tc) \ + sp_set_block(load, tc) + +/* 清除阻塞(状态)*/ +#define sPS2_ClearBlock(load) \ + sp_clear_block(load) + + + +/* + * 二值信号量 + */ + +/* 上锁/给予 */ +#define sPS2_WriteBin(bin, val) \ + sp_write_binary(&bin, val) + + + +#endif diff --git a/System/sv_task.c b/System/sv_task.c new file mode 100644 index 00000000..c384fb7a --- /dev/null +++ b/System/sv_task.c @@ -0,0 +1,820 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_task.c + * @brief 任务服务(仅在任务中调用) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#include "os_var.h" +#include "os_api.h" +#include "ur_api.h" + +/* 进入嵌套任务临界区 */ +void su_enter_critical(void) +{ + mSysIRQ_Disable; + s_taskcri_counter++; +} + +/* 退出嵌套任务临界区 */ +void su_exit_critical(void) +{ + s_taskcri_counter--; + if(!s_taskcri_counter){ + if(s_sign_schedule){ + mPendSV_Set; + mSysIRQ_Enable; + #if MCUCFG_ISA == __ARM__ + OS_NOPx1; + #endif + while(s_sign_schedule); + } + else{ + mSysIRQ_Enable; + } + } +} + +/* 退出嵌套任务临界区并返回(void *) */ +void *su_return_voidptr(void *p) +{ + uExitCritical; + return p; +} + +/* 进入非嵌套任务临界区 */ +void su_enter_critical_one(void) +{ + mSysIRQ_Disable; +} + +/* 退出非嵌套任务临界区 */ +void su_exit_critical_one(void) +{ + mSysIRQ_Enable; +} + +/* 退出非嵌套任务临界区并触发任务调度 */ +void su_exit_critical_psv(void) +{ + s_sign_schedule = true; + mPendSV_Set; + mSysIRQ_Enable; + #if MCUCFG_ISA == __ARM__ + OS_NOPx1; + #endif + while(s_sign_schedule); +} + +/* 任务调度 */ +void su_task_schedule(void) +{ + uEnterCritical; + s_sign_schedule_all = true; + s_sign_schedule = true; + uExitCritical; +} + +/* 启动任务 */ +s_ecode_t su_startup_task(s_taskhand_tsp hand, s_voidvoid_tfp entry, s_u8_t status) +{ + static s_tid_t _SYS_MEM_ tid = 0; + if(!hand->tid){ + tid++; + hand->tid = tid; + } + if(*hand->handle != OS_NULL){ + ((s_tasknode_tsp)hand)->status = status; + } + else{ + s_task_status0 = status; + } + if(hand->entry == OS_NULL){ + hand->entry = entry; + } + s_task_starter = hand; + if(!s_sign_return){ + s_sign_schedule_all = true; + } + su_exit_critical_psv(); + return s_startup_code; +} + +/* 挂起任务 */ +s_ecode_t su_suspend_task(s_tasknode_tsp node) +{ + if(node == OS_NULL){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status < OS_STATUS_SUSPENDED){ + node->status |= OS_STATUS_SUSPENDED; + if(node == s_task_current){ + s_sign_schedule = true; + } + uExitCritical; + return OS_ECODE_NOERROR; + } + if(node->status & OS_STATUS_SUSPENDED){ + uExitCritical; + return OS_ECODE_TASKSUSPENDED; + } + if(node->status & OS_STATUS_STOPPED){ + uExitCritical; + return OS_ECODE_TASKSTOPPED; + } + if(node->status == OS_STATUS_DELETED){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + else{ + uExitCritical; + return OS_ECODE_DONOTKNOW; + } +} + +/* 恢复任务 */ +s_ecode_t su_resume_task(s_tasknode_tsp node) +{ + if(node == OS_NULL){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status & OS_STATUS_SUSPENDED){ + node->status &= (~OS_STATUS_SUSPENDED & 0xFF); + s_schedule_ready(node); + uExitCritical; + return OS_ECODE_NOERROR; + } + if(node->status < OS_STATUS_STOPPED){ + uExitCritical; + return OS_ECODE_TASKNOTSUSPENDED; + } + if(node->status & OS_STATUS_STOPPED){ + uExitCritical; + return OS_ECODE_TASKSTOPPED; + } + if(node->status == OS_STATUS_DELETED){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + else{ + uExitCritical; + return OS_ECODE_DONOTKNOW; + } +} + +/* 恢复指定任务并挂起自身任务 */ +s_ecode_t su_resume_suspend(s_tasknode_tsp node) +{ + if(node == OS_NULL){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status & OS_STATUS_SUSPENDED){ + node->status &= (~OS_STATUS_SUSPENDED & 0xFF); + } + if(node->status == OS_STATUS_READY){ + s_task_current->status |= OS_STATUS_SUSPENDED; + s_schedule_taskpri(node); + s_sign_schedule = true; + uExitCritical; + return OS_ECODE_NOERROR; + } + if(node->status < OS_STATUS_STOPPED){ + uExitCritical; + return OS_ECODE_TASKNOTREADY; + } + if(node->status & OS_STATUS_STOPPED){ + uExitCritical; + return OS_ECODE_TASKSTOPPED; + } + if(node->status == OS_STATUS_DELETED){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + else{ + uExitCritical; + return OS_ECODE_DONOTKNOW; + } +} + +/* 删除任务 */ +s_ecode_t su_delete_task(s_tasknode_tsp node) +{ + if(node == OS_NULL){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status < OS_STATUS_DELETED){ + node->status = OS_STATUS_DELETED; + if(node == s_task_current){ + s_sign_schedule = true; + } + uExitCritical; + return OS_ECODE_NOERROR; + } + if(node->status == OS_STATUS_DELETED){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + else{ + uExitCritical; + return OS_ECODE_DONOTKNOW; + } +} + +/* 设置任务优先级 */ +s_ecode_t su_set_taskpri(s_tasknode_tsp node, s_u8_t pri) +{ + if(node == OS_NULL){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status < OS_STATUS_STOPPED){ + if(node->pri != pri){ + node->pri = pri; + s_set_taskpri(node); + s_sign_schedule = true; + uExitCritical; + return OS_ECODE_NOERROR; + } + else{ + uExitCritical; + return OS_ECODE_TASKPRIUNCHANGED; + } + } + if(node->status & OS_STATUS_STOPPED){ + uExitCritical; + return OS_ECODE_TASKSTOPPED; + } + if(node->status == OS_STATUS_DELETED){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + else{ + uExitCritical; + return OS_ECODE_DONOTKNOW; + } +} + +/* 设置阻塞(时间)*/ +s_ecode_t su_set_block(s_tasknode_tsp node, s_delay_t tick) +{ + if(node == OS_NULL){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){ + if(!tick){ + node->status = OS_STATUS_READY; + s_schedule_taskpri(node); + } + node->timer = tick; + uExitCritical; + return OS_ECODE_NOERROR; + } + else{ + uExitCritical; + return OS_ECODE_TASKNOTBLOCKED; + } +} + +/* 清除阻塞(状态)*/ +s_ecode_t su_clear_block(s_tasknode_tsp node) +{ + if(node == OS_NULL){ + uExitCritical; + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){ + node->status = OS_STATUS_READY; + node->timer = 0; + s_schedule_taskpri(node); + uExitCritical; + return OS_ECODE_NOERROR; + } + else{ + uExitCritical; + return OS_ECODE_TASKNOTBLOCKED; + } +} + +/* 自身任务延时 */ +void su_delay(s_delay_t tick) +{ + if(s_task_current->status == OS_STATUS_READY){ + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->timer = tick; + s_sign_schedule = true; + } + else if(s_task_current->status == OS_STATUS_BLOCKED){ + s_task_current->timer += tick; + } + uExitCritical; +} + + + +/* + * 互斥信号量 + */ +#if SYSCFG_MUTEX == __ENABLED__ +/* 获取 */ +s_bool_t su_take_mutex(s_mutex_tsp mut, s_delay_t tick) +{ + if(!mut->mutex) goto __RET_TRUE1; + if(s_task_current == mut->node) goto __RET_TRUE2; + if(!tick) goto __RET_FALSE; + + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->blocktype = OS_BLOCKED_MUTEX | 0x0F; + s_task_current->timer = tick; + s_task_current->ptr = mut; + if(s_task_current->pri > mut->node->pri){ + mut->node->pri = s_task_current->pri; + s_set_taskpri(mut->node); + } + su_exit_critical_psv(); + s_task_current->blocktype = 0; + #if SYSCFG_MCUCORE == 8051 + mut = (s_mutex_tsp)s_task_current->ptr; + #endif + if(!mut->mutex) goto __RET_TRUE1; + +__RET_FALSE: + mSysIRQ_Enable; + return false; + +__RET_TRUE1: + mut->node = s_task_current; + mut->oldpri = s_task_current->pri; + +__RET_TRUE2: + mut->mutex++; + mSysIRQ_Enable; + return true; +} + +/* 归还 */ +void su_back_mutex(s_mutex_tsp mut) +{ + if(!mut->mutex); + else if(s_task_current == mut->node){ + mut->mutex--; + if(!mut->mutex){ + if(s_task_current->pri > mut->oldpri){ + s_task_current->pri = mut->oldpri; + s_set_taskpri(s_task_current); + s_sign_schedule = true; + } + } + } + uExitCritical; +} + +#endif + + + +/* + * 二值信号量 + */ +#if SYSCFG_BINARY == __ENABLED__ +/* 等待 */ +s_bool_t su_wait_binary(s_binary_tsp bin, s_delay_t tick) +{ + if(bin->binary) goto __RET_TRUE; + if(!tick) goto __RET_FALSE; + + bin->node = s_task_current; + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->blocktype = OS_BLOCKED_BINARY | sizeof(bin->binary); + s_task_current->timer = tick; + s_task_current->ptr = bin; + su_exit_critical_psv(); + s_task_current->blocktype = 0; + #if SYSCFG_MCUCORE == 8051 + bin = (s_binary_tsp)s_task_current->ptr; + #endif + bin->node = OS_NULL; + if(bin->binary) goto __RET_TRUE; + +__RET_FALSE: + mSysIRQ_Enable; + return false; + +__RET_TRUE: + mSysIRQ_Enable; + return true; +} + +/* 获取 */ +s_bool_t su_take_binary(s_binary_tsp bin, s_delay_t tick) +{ + if(bin->binary) goto __RET_TRUE; + if(!tick) goto __RET_FALSE; + + if(bin->node == OS_NULL || s_task_current->pri > bin->node->pri){ + bin->node = s_task_current; + } + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->blocktype = OS_BLOCKED_BINARY | sizeof(bin->binary); + s_task_current->timer = tick; + s_task_current->ptr = bin; + su_exit_critical_psv(); + s_task_current->blocktype = 0; + #if SYSCFG_MCUCORE == 8051 + bin = (s_binary_tsp)s_task_current->ptr; + #endif + bin->node = OS_NULL; + if(bin->binary) goto __RET_TRUE; + +__RET_FALSE: + mSysIRQ_Enable; + return false; + +__RET_TRUE: + bin->binary = false; + mSysIRQ_Enable; + return true; +} + +/* 给予/归还 */ +void su_give_binary(s_binary_tsp bin) +{ + bin->binary = true; + s_schedule_notnull(bin->node); + uExitCritical; +} + +#endif + + + +/* + * 计数信号量 + */ +#if SYSCFG_SEMAPHORE == __ENABLED__ +/* 获取 */ +s_bool_t su_take_semaphore(s_semaph_tsp sem, s_delay_t tick) +{ + if(sem->counter) goto __RET_TRUE; + if(!tick) goto __RET_FALSE; + + if(sem->node == OS_NULL || s_task_current->pri > sem->node->pri){ + sem->node = s_task_current; + } + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->blocktype = OS_BLOCKED_SEMAPHORE | sizeof(sem->counter); + s_task_current->timer = tick; + s_task_current->ptr = sem; + su_exit_critical_psv(); + s_task_current->blocktype = 0; + #if SYSCFG_MCUCORE == 8051 + sem = (s_semaph_tsp)s_task_current->ptr; + #endif + sem->node = OS_NULL; + if(sem->counter) goto __RET_TRUE; + +__RET_FALSE: + mSysIRQ_Enable; + return false; + +__RET_TRUE: + (sem->counter)--; + mSysIRQ_Enable; + return true; +} + +/* 给予/归还 */ +void su_give_semaphore(s_semaph_tsp sem) +{ + if(sem->counter < sem->maximum){ + sem->counter++; + } + s_schedule_notnull(sem->node); + uExitCritical; +} + +#endif + + + +/* + * 私信 + */ +#if SYSCFG_TASKMSG == __ENABLED__ +/* 接收私信 */ +s_bool_t su_recv_taskmsg(m_taskmsg_t _OBJ_MEM_ *flag, s_delay_t tick) +{ + if(*flag) goto __RET_TRUE; + if(!tick) goto __RET_FALSE; + + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->blocktype = OS_BLOCKED_TASKMSG | sizeof(*flag); + s_task_current->timer = tick; + s_task_current->ptr = flag; + su_exit_critical_psv(); + s_task_current->blocktype = 0; + #if SYSCFG_MCUCORE == 8051 + flag = (m_taskmsg_t *)s_task_current->ptr; + #endif + if(*flag) goto __RET_TRUE; + +__RET_FALSE: + mSysIRQ_Enable; + return false; + +__RET_TRUE: + *flag = false; + return true; +} + +#endif + + + +/* + * 飞信 + */ +#if SYSCFG_FETION == __ENABLED__ +/* 接收飞信 */ +static m_fetion_t _recv_fetion_(s_fetion_tsp fet) +{ + m_fetion_t fetion = fet->fetion; + fet->fetion = false; + mSysIRQ_Enable; + return fetion; +} + +m_fetion_t su_recv_fetion(s_fetion_tsp fet, s_delay_t tick) +{ + if(fet->fetion) goto __RET_TION; + if(!tick) goto __RET_FALSE; + + fet->node = s_task_current; + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->blocktype = OS_BLOCKED_FETION | sizeof(fet->fetion); + s_task_current->timer = tick; + s_task_current->ptr = fet; + su_exit_critical_psv(); + s_task_current->blocktype = 0; + #if SYSCFG_MCUCORE == 8051 + fet = (s_fetion_tsp)s_task_current->ptr; + #endif + fet->node = OS_NULL; + +__RET_TION: + return _recv_fetion_(fet); + +__RET_FALSE: + mSysIRQ_Enable; + return false; +} + +#endif + + + +/* 退出非嵌套任务临界区并返回(void *),邮箱、队列专用 */ +#if SYSCFG_MAILBOX == __ENABLED__ || SYSCFG_MSGQUEUE == __ENABLED__ +static void *_ret_vptr_(void *p) +{ + mSysIRQ_Enable; + return p; +} +#endif + + + +/* + * 消息邮箱 + */ +#if SYSCFG_MAILBOX == __ENABLED__ +/* 接收邮件 */ +void *su_recv_mail(s_mailbox_tsp mbox, s_delay_t tick) +{ + if(mbox->flag) goto __RET_MAIL; + if(!tick) goto __RET_NULL; + + mbox->node = s_task_current; + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->blocktype = OS_BLOCKED_MAIL | sizeof(mbox->flag); + s_task_current->timer = tick; + s_task_current->ptr = mbox; + su_exit_critical_psv(); + s_task_current->blocktype = 0; + #if SYSCFG_MCUCORE == 8051 + mbox = (s_mailbox_tsp)s_task_current->ptr; + #endif + mbox->node = OS_NULL; + if(mbox->flag) goto __RET_MAIL; + +__RET_NULL: + mSysIRQ_Enable; + return OS_NULL; + +__RET_MAIL: + mbox->flag = false; + return _ret_vptr_(mbox->mail); +} + +/* 发送邮件 */ +void su_send_mail(s_mailbox_tsp mbox, void *mail) +{ + mbox->flag = false; + mbox->mail = mail; + mbox->flag = true; + s_schedule_notnull(mbox->node); + uExitCritical; +} + +#endif + + + +/* + * 消息队列 + */ +#if SYSCFG_MSGQUEUE == __ENABLED__ +/* 接收消息 */ +void *su_recv_msg(s_queue_tsp queue, s_delay_t tick) +{ + void *msg; + s_msgnode_tsp node; + queue->mutex = false; + + if(queue->counter) goto __RECV_MSG; + if(!tick) goto __RET_NULL; + + queue->mutex = true; + queue->node = s_task_current; + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->blocktype = OS_BLOCKED_MSG | sizeof(queue->counter); + s_task_current->timer = tick; + s_task_current->ptr = queue; + su_exit_critical_psv(); + s_task_current->blocktype = 0; + #if SYSCFG_MCUCORE == 8051 + queue = (s_queue_tsp)s_task_current->ptr; + #endif + queue->node = OS_NULL; + queue->mutex = false; + if(!queue->counter) goto __RET_NULL; + +__RECV_MSG: + if(queue->type == __DYNAMIC__) + sRecvMsg_Dynamic(msg); + else + sRecvMsg_Static(msg); + queue->mutex = true; + return _ret_vptr_(msg); + +__RET_NULL: + queue->mutex = true; + mSysIRQ_Enable; + return OS_NULL; +} + +/* 发送消息 */ +s_ecode_t su_send_msg(s_queue_tsp queue, void *msg) +{ + queue->mutex = false; + + if(queue->counter == queue->len){ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_alarm.overflow_msgqueue = true; + #endif + queue->mutex = true; + uExitCritical; + return OS_ECODE_OVERFLOW_MSGQUEUE; + } + if(queue->type == __DYNAMIC__){ + s_msgnode_tsp node = OS_NULL; + node = (s_msgnode_tsp)s_malloc(sizeof(s_msgnode_ts)); + if(node == OS_NULL){ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_fault.mallocfailed_msgnode = true; + #endif + queue->mutex = true; + uExitCritical; + return OS_ECODE_MALLOCFAIL_MSGNODE; + } + sSendMsg_Dynamic(msg); + } + else + sSendMsg_Static(msg); + + s_schedule_notnull(queue->node); + queue->mutex = true; + uExitCritical; + return OS_ECODE_NOERROR; +} + +#endif + + + +/* + * 事件标志组 + */ +#if SYSCFG_FLAGGROUP == __ENABLED__ +/* 查询标志组 */ +s_bool_t su_query_group(void _OBJ_MEM_ *p, s_u8_t size) +{ + switch(size){ + case 1: if(*(s_u8_t *)p) goto __RET_TRUE; break; + case 2: if(*(s_u16_t *)p) goto __RET_TRUE; break; + case 4: if(*(s_u32_t *)p) goto __RET_TRUE; break; + } + uExitCritical; + return false; + +__RET_TRUE: + uExitCritical; + return true; +} + +/* 等待标志组 */ +s_bool_t su_wait_group(void _OBJ_MEM_ *p, s_u8_t size, s_delay_t tick) +{ + switch(size){ + case 1: if(*(s_u8_t *)p) goto __RET_TRUE; break; + case 2: if(*(s_u16_t *)p) goto __RET_TRUE; break; + case 4: if(*(s_u32_t *)p) goto __RET_TRUE; break; + } + if(!tick) goto __RET_FALSE; + + s_task_current->status = OS_STATUS_BLOCKED; + s_task_current->blocktype = OS_BLOCKED_FLAGGROUP | size; + s_task_current->timer = tick; + s_task_current->ptr = p; + su_exit_critical_psv(); + #if SYSCFG_MCUCORE == 8051 || SYSCFG_MCUCORE == 80251 + size = s_task_current->blocktype & 0x0F; + #endif + s_task_current->blocktype = 0; + #if SYSCFG_MCUCORE == 8051 + p = s_task_current->ptr; + #endif + switch(size){ + case 1: if(*(s_u8_t *)p) goto __RET_TRUE; break; + case 2: if(*(s_u16_t *)p) goto __RET_TRUE; break; + case 4: if(*(s_u32_t *)p) goto __RET_TRUE; break; + } +__RET_FALSE: + mSysIRQ_Enable; + return false; + +__RET_TRUE: + mSysIRQ_Enable; + return true; +} + +#endif + + + +/* + * 动态内存 + */ +#if SYSCFG_DYNMEMMGE == __ENABLED__ +/* uxalloc */ +void _MALLOC_MEM_ *su_xalloc(void _MALLOC_MEM_ *p) +{ + uExitCritical; + return p; +} + +/* 初始化线程内存池 */ +s_bool_t su_init_mempool(s_thrmem_tsp p, size_t size) +{ + p->head = p->move = (void _MALLOC_MEM_ *)s_malloc(size); + if(p->head == OS_NULL){ + uExitCritical; + return false; + } + else{ + p->size = size; + uExitCritical; + return true; + } +} + +/* 线程内存分配 */ +void _MALLOC_MEM_ *su_talloc(s_thrmem_tsp p, size_t size) +{ + if(p->head == OS_NULL || (size_t)p->move - (size_t)p->head + size > p->size){ + return OS_NULL; + } + else{ + void _MALLOC_MEM_ *r = p->move; + p->move = (s_u8_t _MALLOC_MEM_ *)p->move + size; + return r; + } +} + +#endif diff --git a/System/sv_task.h b/System/sv_task.h new file mode 100644 index 00000000..6aea27ef --- /dev/null +++ b/System/sv_task.h @@ -0,0 +1,403 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_task.h + * @brief 任务服务(仅在任务中调用) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#ifndef __SV_TASK_H +#define __SV_TASK_H + +void su_enter_critical (void); +void su_exit_critical (void); +void *su_return_voidptr (void *p); +void su_enter_critical_one(void); +void su_exit_critical_one (void); +void su_exit_critical_psv (void); +void su_task_schedule (void); +s_ecode_t su_startup_task (s_taskhand_tsp hand, s_voidvoid_tfp entry, s_u8_t status); +s_ecode_t su_suspend_task (s_tasknode_tsp node); +s_ecode_t su_resume_task (s_tasknode_tsp node); +s_ecode_t su_resume_suspend (s_tasknode_tsp node); +s_ecode_t su_delete_task (s_tasknode_tsp node); +s_ecode_t su_set_taskpri (s_tasknode_tsp node, s_u8_t pri); +s_ecode_t su_set_block (s_tasknode_tsp node, s_delay_t tick); +s_ecode_t su_clear_block (s_tasknode_tsp node); +void su_delay (s_delay_t tick); +s_bool_t su_take_mutex (s_mutex_tsp mut, s_delay_t tick); +void su_back_mutex (s_mutex_tsp mut); +s_bool_t su_wait_binary (s_binary_tsp bin, s_delay_t tick); +s_bool_t su_take_binary (s_binary_tsp bin, s_delay_t tick); +void su_give_binary (s_binary_tsp bin); +s_bool_t su_take_semaphore (s_semaph_tsp sem, s_delay_t tick); +void su_give_semaphore (s_semaph_tsp sem); +s_bool_t su_recv_taskmsg (m_taskmsg_t _OBJ_MEM_ *flag, s_delay_t tick); +m_fetion_t su_recv_fetion (s_fetion_tsp fet, s_delay_t tick); +void *su_recv_mail (s_mailbox_tsp mbox, s_delay_t tick); +void su_send_mail (s_mailbox_tsp mbox, void *mail); +void *su_recv_msg (s_queue_tsp queue, s_delay_t tick); +s_ecode_t su_send_msg (s_queue_tsp queue, void *msg); +s_bool_t su_query_group (void _OBJ_MEM_ *p, s_u8_t size); +s_bool_t su_wait_group (void _OBJ_MEM_ *p, s_u8_t size, s_delay_t tick); + +s_bool_t su_init_mempool (s_thrmem_tsp p, size_t size); +void _MALLOC_MEM_ *su_talloc (s_thrmem_tsp p, size_t size); +void _MALLOC_MEM_ *su_xalloc (void _MALLOC_MEM_ *p); + + + +/* + * 任务 + */ + +/* 启动任务 */ +#define sUSV_StartTask(hand, entry, status) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true ? su_startup_task((s_taskhand_tsp)hand, entry, !status ? OS_STATUS_READY : OS_STATUS_SUSPENDED) : false \ +) + +/* 挂起任务 */ +#define sUSV_SuspendTask(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_suspend_task(node) : false \ +) + +/* 恢复任务 */ +#define sUSV_ResumeTask(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_resume_task(node) : false \ +) + +/* 恢复指定任务并挂起自身任务 */ +#define sUSV_ResumeSuspend(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_resume_suspend(node) : false \ +) + +/* 删除任务 */ +#define sUSV_DeleteTask(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_delete_task(node) : false \ +) + +/* 设置任务优先级 */ +#define sUSV_SetTaskPri(node, pri) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_set_taskpri(node, pri) : false \ +) + +/* 设置阻塞(时间)*/ +#define sUSV_SetBlock(node, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_set_block(node, tc) : false \ +) + +/* 清除阻塞(状态)*/ +#define sUSV_ClearBlock(node) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_clear_block(node) : false \ +) + +/* 自身任务延时 */ +#define sUSV_Delay(tc) \ +do{ \ + uEnterCritical; \ + su_delay(tc); \ +}while(false) + + + +/* + * 定时 + */ + +/* 定时中断 */ +#define sUSV_TimInt(tmid, tc) \ +do{ \ + uEnterCritical; \ + s_timint_loader[tmid] = s_timint_reload[tmid] = tc; \ + uExitCritical; \ +}while(false) + +/* 定时查询 */ +#define sUSV_TimQry(tmid, tc) \ +do{ \ + uEnterCritical; \ + s_timqry_loader[tmid] = s_timqry_reload[tmid] = tc; \ + uExitCritical; \ +}while(false) + + + +/* + * 互斥信号量 + */ + +/* 获取 */ +#define sUSV_TakeMut(mut, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true ? su_take_mutex(&mut, tc) : false \ +) + +/* 归还 */ +#define sUSV_BackMut(mut) \ +do{ \ + uEnterCritical; \ + su_back_mutex(&mut); \ +}while(false) + + + +/* + * 二值信号量 + */ + +/* 等待 */ +#define sUSV_WaitBin(bin, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true ? su_wait_binary(&bin, tc) : false \ +) + +/* 获取 */ +#define sUSV_TakeBin(bin, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true ? su_take_binary(&bin, tc) : false \ +) + +/* 给予/归还 */ +#define sUSV_GiveBin(bin) \ +do{ \ + uEnterCritical; \ + su_give_binary(&bin); \ +}while(false) + + + +/* + * 计数信号量 + */ + +/* 获取 */ +#define sUSV_TakeSem(sem, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true ? su_take_semaphore(&sem, tc) : false \ +) + +/* 给予/归还 */ +#define sUSV_GiveSem(sem) \ +do{ \ + uEnterCritical; \ + su_give_semaphore(&sem); \ +}while(false) + + + +/* + * 私信 + */ + +/* 接收私信 */ +#define sUSV_RecvTaskMsg(tc) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true \ + ? su_recv_taskmsg(&m0_, tc) \ + ? s_memcpy(&m0 + 1, &m0_ + 1, MCUCFG_TASKMSG_SIZE) || true \ + ? (m_boolvoid_tf(su_exit_critical_one))() || true \ + : (m_boolvoid_tf(su_exit_critical_one))() || true \ + : false \ + : false \ +) + +/* 发送私信 */ +#define sUSV_SendTaskMsg(task) \ + uEnterCritical; \ + s_sign_send_taskmsg = true; \ + MCUCFG_TASKMSG_PSP; \ + s_schedule_taskmsg(u_taskhandle_##task); \ + task(MCUCFG_TASKMSG_VAL, + + + +/* + * 飞信 + */ + +/* 接收飞信 */ +#define sUSV_RecvFetion(tbox, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true ? su_recv_fetion(&tbox, tc) : false \ +) + +/* 发送飞信 */ +#define sUSV_SendFetion(tbox, tion) \ +do{ \ + uEnterCritical; \ + tbox.fetion = tion; \ + s_schedule_notnull(tbox.node); \ + uExitCritical; \ +}while(false) + + + +/* + * 消息邮箱 + */ + +/* 接收邮件 */ +#define sUSV_RecvMail(mbox, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true ? su_recv_mail(&mbox, tc) : OS_NULL \ +) + +/* 发送邮件 */ +#define sUSV_SendMail(mbox, mail) \ +do{ \ + uEnterCritical; \ + su_send_mail(&mbox, mail); \ +}while(false) + + + +/* + * 消息队列 + */ + +/* 接收消息 */ +#define sUSV_RecvMsg(que, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true ? su_recv_msg(que, tc) : OS_NULL \ +) + +/* 发送消息 */ +#define sUSV_SendMsg(que, msg) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_send_msg(que, msg) : false \ +) + + + +/* + * 事件标志组 + */ + +/* 查询标志组 */ +#define sUSV_QueryFlagGroup(group) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_query_group((void *)&group, sizeof(group)) : false \ +) + +/* 等待标志组 */ +#define sUSV_WaitFlagGroup(group, tc) \ +( \ + (m_boolvoid_tf(su_enter_critical_one))() || true ? su_wait_group((void *)&group, sizeof(group), tc) : false \ +) + +/* 清除标志组 */ +#define sUSV_ClearFlagGroup(group) \ +do{ \ + uEnterCritical; \ + sizeof(group) == 1 ? *(s_u8_t *)&group = false : MCUCFG_TERNARYMASK \ + sizeof(group) == 2 ? *(s_u16_t *)&group = false : MCUCFG_TERNARYMASK \ + sizeof(group) == 4 ? *(s_u32_t *)&group = false : false; \ + uExitCritical; \ +}while(false) + +/* 写标志位 */ +#define sUSV_WriteFlagBit(group, bit, value) \ +do{ \ + uEnterCritical; \ + group.bit = value; \ + uExitCritical; \ +}while(false) + + + +/* + * 软件RTC + */ + +/* 获取时间 */ +#define sUSV_GetTime(t) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_return_voidptr(s_memcpy(t, s_rtc[0], sizeof(s_rtc[0]))) : OS_NULL \ +) + +/* 设置时间 */ +#define sUSV_SetTime(t) \ +do{ \ + uEnterCritical; \ + s_memcpy(s_rtc[0], t, sizeof(s_rtc[0])); \ + uUpdateCopy(s_memcpy(s_rtc[1], s_rtc[0], sizeof(s_rtc[0]))); \ + uExitCritical; \ +}while(false) + + + +/* + * 进程内存 + */ + +/* malloc */ +#define sUSV_Malloc(size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc((void _MALLOC_MEM_ *)s_malloc(size)) : OS_NULL \ +) + +/* calloc */ +#define sUSV_Calloc(nmemb, size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc((void _MALLOC_MEM_ *)s_calloc(nmemb, size)) : OS_NULL \ +) + +/* realloc */ +#define sUSV_Realloc(p, size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc((void _MALLOC_MEM_ *)s_realloc(p, size)) : OS_NULL \ +) + +/* free */ +#define sUSV_Free(p) \ +do{ \ + uEnterCritical; \ + s_free(p); \ + uExitCritical; \ +}while(false) + + + +/* + * 线程内存 + */ + +/* 初始化线程内存池 */ +#define sUSV_InitMempool(size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_init_mempool(&u_thrmem, size) : false \ +) + +/* 线程内存分配 */ +#define sUSV_Talloc(size) \ +( \ + (m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(su_talloc(&u_thrmem, size)) : OS_NULL \ +) + +/* 释放线程内存池 */ +#define sUSV_FreeMempool \ +do{ \ + sUSV_Free(u_thrmem.head); \ + u_thrmem.head = u_thrmem.move = OS_NULL; \ +}while(false) + + + +/* + * 任务调度 + */ + +#define sUSV_TaskSchedule su_task_schedule() + + + +#endif diff --git a/System/sv_tick.c b/System/sv_tick.c new file mode 100644 index 00000000..e267b0d5 --- /dev/null +++ b/System/sv_tick.c @@ -0,0 +1,282 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_tick.c + * @brief 滴答服务(仅在滴答钩子、定时中断钩子、定时查询钩子中调用) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#include "os_var.h" +#include "os_api.h" + + + +/* + * 任务 + */ + +/* 挂起任务 */ +s_ecode_t st_suspend_task(s_tasknode_tsp node) MCUCFG_C51USING +{ + if(node == OS_NULL){ + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status < OS_STATUS_SUSPENDED){ + node->status |= OS_STATUS_SUSPENDED; + return OS_ECODE_NOERROR; + } + if(node->status & OS_STATUS_SUSPENDED){ + return OS_ECODE_TASKSUSPENDED; + } + if(node->status & OS_STATUS_STOPPED){ + return OS_ECODE_TASKSTOPPED; + } + if(node->status == OS_STATUS_DELETED){ + return OS_ECODE_TASKNOTSTARTED; + } + else{ + return OS_ECODE_DONOTKNOW; + } +} + +/* 恢复任务 */ +s_ecode_t st_resume_task(s_tasknode_tsp node) MCUCFG_C51USING +{ + if(node == OS_NULL){ + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status & OS_STATUS_SUSPENDED){ + node->status &= (~OS_STATUS_SUSPENDED & 0xFF); + return OS_ECODE_NOERROR; + } + if(node->status < OS_STATUS_STOPPED){ + return OS_ECODE_TASKNOTSUSPENDED; + } + if(node->status & OS_STATUS_STOPPED){ + return OS_ECODE_TASKSTOPPED; + } + if(node->status == OS_STATUS_DELETED){ + return OS_ECODE_TASKNOTSTARTED; + } + else{ + return OS_ECODE_DONOTKNOW; + } +} + +/* 删除任务 */ +s_ecode_t st_delete_task(s_tasknode_tsp node) MCUCFG_C51USING +{ + if(node == OS_NULL){ + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status < OS_STATUS_DELETED){ + node->status = OS_STATUS_DELETED; + return OS_ECODE_NOERROR; + } + if(node->status == OS_STATUS_DELETED){ + return OS_ECODE_TASKNOTSTARTED; + } + else{ + return OS_ECODE_DONOTKNOW; + } +} + +/* 设置任务优先级 */ +s_ecode_t st_set_taskpri(s_tasknode_tsp node, s_u8_t pri) MCUCFG_C51USING +{ + if(node == OS_NULL){ + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status < OS_STATUS_STOPPED){ + if(node->pri != pri){ + node->pri = pri; + s_set_taskpri(node); + return OS_ECODE_NOERROR; + } + else{ + return OS_ECODE_TASKPRIUNCHANGED; + } + } + if(node->status & OS_STATUS_STOPPED){ + return OS_ECODE_TASKSTOPPED; + } + if(node->status == OS_STATUS_DELETED){ + return OS_ECODE_TASKNOTSTARTED; + } + else{ + return OS_ECODE_DONOTKNOW; + } +} + +/* 设置阻塞(时间)*/ +s_ecode_t st_set_block(s_tasknode_tsp node, s_delay_t tick) MCUCFG_C51USING +{ + if(node == OS_NULL){ + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){ + if(!tick){ + node->status = OS_STATUS_READY; + } + node->timer = tick; + return OS_ECODE_NOERROR; + } + return OS_ECODE_TASKNOTBLOCKED; +} + +/* 清除阻塞(状态)*/ +s_ecode_t st_clear_block(s_tasknode_tsp node) MCUCFG_C51USING +{ + if(node == OS_NULL){ + return OS_ECODE_TASKNOTSTARTED; + } + if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){ + node->status = OS_STATUS_READY; + node->timer = 0; + return OS_ECODE_NOERROR; + } + return OS_ECODE_TASKNOTBLOCKED; +} + + + +/* + * 二值信号量 + */ +#if SYSCFG_BINARY == __ENABLED__ +/* 获取 */ +s_bool_t st_take_binary(s_binary_tsp bin) MCUCFG_C51USING +{ + if(bin->binary){ + bin->binary = false; + return true; + } + return false; +} + +#endif + + + +/* + * 计数信号量 + */ +#if SYSCFG_SEMAPHORE == __ENABLED__ +/* 获取 */ +s_bool_t st_take_semaphore(s_semaph_tsp sem) MCUCFG_C51USING +{ + if(sem->counter){ + (sem->counter)--; + return true; + } + return false; +} + +/* 给予/归还 */ +void st_give_semaphore(s_semaph_tsp sem) MCUCFG_C51USING +{ + if(sem->counter < sem->maximum){ + sem->counter++; + } +} + +#endif + + + +/* + * 飞信 + */ +#if SYSCFG_FETION == __ENABLED__ +/* 接收飞信 */ +m_fetion_t st_recv_fetion(s_fetion_tsp fet) MCUCFG_C51USING +{ + m_fetion_t fetion = fet->fetion; + fet->fetion = false; + return fetion; +} + +#endif + + + +/* + * 消息邮箱 + */ +#if SYSCFG_MAILBOX == __ENABLED__ +/* 接收邮件 */ +void *st_recv_mail(s_mailbox_tsp mbox) MCUCFG_C51USING +{ + if(mbox->flag){ + mbox->flag = false; + return mbox->mail; + } + return OS_NULL; +} + +/* 发送邮件 */ +void st_send_mail(s_mailbox_tsp mbox, void *mail) MCUCFG_C51USING +{ + mbox->flag = false; + mbox->mail = mail; + mbox->flag = true; +} + +#endif + + + +/* + * 消息队列 + */ +#if SYSCFG_MSGQUEUE == __ENABLED__ +/* 接收消息 */ +void *st_recv_msg(s_queue_tsp queue) MCUCFG_C51USING +{ + void *msg = OS_NULL; + s_msgnode_tsp node; + queue->mutex = false; + + if(!queue->counter); + else if(queue->type == __DYNAMIC__) + sRecvMsg_Dynamic(msg); + else + sRecvMsg_Static(msg); + + queue->mutex = true; + return msg; +} + +/* 发送消息 */ +s_ecode_t st_send_msg(s_queue_tsp queue, void *msg) MCUCFG_C51USING +{ + queue->mutex = false; + + if(queue->counter == queue->len){ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_alarm.overflow_msgqueue = true; + #endif + queue->mutex = true; + return OS_ECODE_OVERFLOW_MSGQUEUE; + } + if(queue->type == __DYNAMIC__){ + s_msgnode_tsp node = OS_NULL; + node = (s_msgnode_tsp)s_malloc(sizeof(s_msgnode_ts)); + if(node == OS_NULL){ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_fault.mallocfailed_msgnode = true; + #endif + queue->mutex = true; + return OS_ECODE_MALLOCFAIL_MSGNODE; + } + sSendMsg_Dynamic(msg); + } + else + sSendMsg_Static(msg); + + queue->mutex = true; + return OS_ECODE_NOERROR; +} + +#endif diff --git a/System/sv_tick.h b/System/sv_tick.h new file mode 100644 index 00000000..73440285 --- /dev/null +++ b/System/sv_tick.h @@ -0,0 +1,188 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file sv_tick.h + * @brief 滴答服务(仅在滴答钩子、定时中断钩子、定时查询钩子中调用) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2024.06.01 + ******************************************************************************/ + +#ifndef __SV_TICK_H +#define __SV_TICK_H + +s_ecode_t st_suspend_task (s_tasknode_tsp node); +s_ecode_t st_resume_task (s_tasknode_tsp node); +s_ecode_t st_delete_task (s_tasknode_tsp node); +s_ecode_t st_set_taskpri (s_tasknode_tsp node, s_u8_t pri); +s_ecode_t st_set_block (s_tasknode_tsp node, s_delay_t tick); +s_ecode_t st_clear_block (s_tasknode_tsp node); +s_bool_t st_take_binary (s_binary_tsp bin); +s_bool_t st_take_semaphore (s_semaph_tsp sem); +void st_give_semaphore (s_semaph_tsp sem); +m_fetion_t st_recv_fetion (s_fetion_tsp fet); +void *st_recv_mail (s_mailbox_tsp mbox); +void st_send_mail (s_mailbox_tsp mbox, void *mail); +void *st_recv_msg (s_queue_tsp queue); +s_ecode_t st_send_msg (s_queue_tsp queue, void *msg); + + + +/* + * 任务 + */ + +/* 挂起指定任务 */ +#define sTSV_SuspendTask(node) \ + st_suspend_task(node) + +/* 恢复指定任务 */ +#define sTSV_ResumeTask(node) \ + st_resume_task(node) + +/* 删除指定任务 */ +#define sTSV_DeleteTask(node) \ + st_delete_task(node) + +/* 设置任务优先级 */ +#define sTSV_SetTaskPri(node, tpl) \ + st_set_taskpri(node, tpl) + +/* 设置阻塞(时间)*/ +#define sTSV_SetBlock(node, tc) \ + st_set_block(node, tc) + +/* 清除阻塞(状态)*/ +#define sTSV_ClearBlock(node) \ + st_clear_block(node) + + + +/* + * 定时 + */ + +/* 定时中断 */ +#define sTSV_TimInt(tmid, tc) \ + s_timint_loader[tmid] = s_timint_reload[tmid] = tc + +/* 定时查询 */ +#define sTSV_TimQry(tmid, tc) \ + s_timqry_loader[tmid] = s_timqry_reload[tmid] = tc + + + +/* + * 二值信号量 + */ + +/* 获取 */ +#define sTSV_TakeBin(bin) \ + st_take_binary(&bin) + + + +/* + * 计数信号量 + */ + +/* 获取 */ +#define sTSV_TakeSem(sem) \ + st_take_semaphore(&sem) + +/* 给予/归还 */ +#define sTSV_GiveSem(sem) \ + st_give_semaphore(&sem) + + + +/* + * 私信 + */ + +/* 发送私信 */ +#define sTSV_SendTaskMsg(task) \ + s_sign_send_taskmsg = true; \ + MCUCFG_TASKMSG_PSP; \ + task(MCUCFG_TASKMSG_VAL, + + + +/* + * 飞信 + */ + +/* 接收飞信 */ +#define sTSV_RecvFetion(tbox) \ + st_recv_fetion(&tbox) + + + +/* + * 消息邮箱 + */ + +/* 接收邮件 */ +#define sTSV_RecvMail(mbox) \ + st_recv_mail(&mbox) + +/* 发送邮件 */ +#define sTSV_SendMail(mbox, mail) \ + st_send_mail(&mbox, mail) + + + +/* + * 消息队列 + */ + +/* 接收消息 */ +#define sTSV_RecvMsg(que) \ + st_recv_msg(que) + +/* 发送消息 */ +#define sTSV_SendMsg(que, msg) \ + st_send_msg(que, msg) + + + +/* + * 事件标志组 + */ + +/* 查询标志组 */ +#define sTSV_QueryFlagGroup(group) \ +( \ + sizeof(group) == 1 ? *(s_u8_t *)&group ? true : false \ + : sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \ + : sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \ + : false \ +) + +/* 清除标志组 */ +#define sTSV_ClearFlagGroup(group) \ +do{ \ + sizeof(group) == 1 ? *(s_u8_t *)&group = false : MCUCFG_TERNARYMASK \ + sizeof(group) == 2 ? *(s_u16_t *)&group = false : MCUCFG_TERNARYMASK \ + sizeof(group) == 4 ? *(s_u32_t *)&group = false : false; \ +}while(false) + + + +/* + * 软件RTC + */ + +/* 获取时间 */ +#define sTSV_GetTime(t) \ + s_memcpy(t, s_rtc[0], sizeof(s_rtc[0])) + +/* 设置时间 */ +#define sTSV_SetTime(t) \ +do{ \ + s_memcpy(s_rtc[0], t, sizeof(s_rtc[0])); \ + tUpdateCopy(s_memcpy(s_rtc[1], s_rtc[0], sizeof(s_rtc[0]))); \ +}while(false) + + + +#endif