diff --git a/System/os_api.c b/System/os_api.c new file mode 100644 index 0000000..800c2fc --- /dev/null +++ b/System/os_api.c @@ -0,0 +1,54 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_api.c + * @brief 系统内核专用API + * @author 迟凯峰 + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#include "os_var.h" + +#if SYSCFG_MCUCORE == 8051 +#pragma NOAREGS +#endif + +void s_scheduling_taskpri(s_tasknode_tsp node) +{ + if(node->pri > s_task_current->pri){ + s_sign_scheduling = true; + } +} + +void s_scheduling_notnull(s_tasknode_tsp node) +{ + if(node != NULL){ + s_scheduling_taskpri(node); + } +} + +void s_scheduling_ready(s_tasknode_tsp node) +{ + if(node->status <= OS_STATUS_FLOATING){ + s_scheduling_taskpri(node); + } +} + +void s_scheduling_taskmsg(s_tasknode_tsp node) +{ + if(node->status == OS_STATUS_BLOCKED && (node->blocktype & OS_BLOCKED_TASKMSG)){ + s_scheduling_taskpri(node); + } +} + +void s_set_taskpri(s_tasknode_tsp node) +{ + node->last->next = node->next; + node->next->last = node->last; + node->next = node->last = NULL; + if(s_taskpri_tail != NULL){ + s_taskpri_tail->next = node; + node->last = s_taskpri_tail; + } + s_taskpri_tail = node; +} diff --git a/System/os_api.h b/System/os_api.h new file mode 100644 index 0000000..99e7c3f --- /dev/null +++ b/System/os_api.h @@ -0,0 +1,481 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_api.h + * @brief 系统内核专用API + * @author 迟凯峰 + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#ifndef __OS_API_H +#define __OS_API_H + +void s_scheduling_taskpri(s_tasknode_tsp node); +void s_scheduling_notnull(s_tasknode_tsp node); +void s_scheduling_ready (s_tasknode_tsp node); +void s_scheduling_taskmsg(s_tasknode_tsp node); +void s_set_taskpri (s_tasknode_tsp node); + + + +/* + * 标准库 + */ + +#define s_init_mempool init_mempool +#define s_malloc malloc +#define s_calloc calloc +#define s_realloc realloc +#define s_free free +#define s_memcpy memcpy +#define s_strcpy strcpy +#define s_strlen strlen +#define s_strcmp strcmp + + + +/* + * 任务 + */ + +/* 启动定时中断任务 */ +#define sStartTask_TimInt(tmid) \ + sUSV_StartTask((s_taskhand_tsp)s_timint_handle[tmid]->hookorhand, OS_STATUS_SUSPENDED) + +/* 启动定时查询任务 */ +#define sStartTask_TimQry(tmid) \ + sUSV_StartTask((s_taskhand_tsp)s_timqry_handle[tmid]->hookorhand, OS_STATUS_SUSPENDED) + +/* 恢复定时中断任务 */ +#define sResumeTask_TimInt(tmid) \ + sTSV_ResumeTask(*((s_taskhand_tsp)s_timint_handle[tmid]->hookorhand)->handle) + +/* 恢复定时查询任务 */ +#define sResumeTask_TimQry(tmid) \ + sTSV_ResumeTask(*((s_taskhand_tsp)s_timqry_handle[tmid]->hookorhand)->handle) + + + +/* + * 更新全局变量副本 + */ + +#define sUpdateCopy(code) \ +do{ \ + s_sign_updatecopy = true; \ + code; \ + s_sign_updatecopy = false; \ +}while(false) + + + +/* + * 写消息邮箱访问器 + */ + +#if SYSCFG_MCUCORE == 8051 +#define sWrite_MBoxAccessor(p) \ +do{ \ + s_sign_write_mbox_accessor = true; \ + s_mbox_accessor = p; \ + s_sign_write_mbox_accessor = false; \ +}while(false) + +#else +#define sWrite_MBoxAccessor(p) \ + s_mbox_accessor = p + +#endif + + + +/* + * 私信 - 创建信箱 + */ + +#define m0__ MCUCFG_TASKMSG_VAR + +#if MCUCFG_TASKMSG_TYPE == 0 + +#define __dm static + +#define sTaskMsg_Init \ +if(s_sign_send_taskmsg){ \ + s_sign_send_taskmsg = false; \ + if(s_taskcri_counter){ \ + uExitCritical; \ + } \ + return; \ +} \ +else{ \ + m0_ = false; \ +} + +#define sCreateTaskMsg_0 \ +(void) \ +{ \ + do + +#define sCreateTaskMsg_1(m1) \ +(m0__, m1##_) \ +{ \ + __dm m_taskmsg_t m0; \ + __dm m1; \ + __dm m_taskmsg_t mx; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_2(m1, m2) \ +(m0__, m1##_, m2##_) \ +{ \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; \ + __dm m_taskmsg_t mx; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_3(m1, m2, m3) \ +(m0__, m1##_, m2##_, m3##_) \ +{ \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; \ + __dm m_taskmsg_t mx; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_4(m1, m2, m3, m4) \ +(m0__, m1##_, m2##_, m3##_, m4##_) \ +{ \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; \ + __dm m_taskmsg_t mx; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_5(m1, m2, m3, m4, m5) \ +(m0__, m1##_, m2##_, m3##_, m4##_, m5##_) \ +{ \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; __dm m5; \ + __dm m_taskmsg_t mx; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_6(m1, m2, m3, m4, m5, m6) \ +(m0__, m1##_, m2##_, m3##_, m4##_, m5##_, m6##_) \ +{ \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; \ + __dm m_taskmsg_t mx; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_7(m1, m2, m3, m4, m5, m6, m7) \ +(m0__, m1##_, m2##_, m3##_, m4##_, m5##_, m6##_, m7##_) \ +{ \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; __dm m7; \ + __dm m_taskmsg_t mx; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_8(m1, m2, m3, m4, m5, m6, m7, m8) \ +(m0__, m1##_, m2##_, m3##_, m4##_, m5##_, m6##_, m7##_, m8##_) \ +{ \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; __dm m7; __dm m8; \ + __dm m_taskmsg_t mx; \ + sTaskMsg_Init; \ + do + +#elif MCUCFG_TASKMSG_TYPE == 1 + +#define __dm __align(4) static + +#define sTaskMsg_Init \ +if(s_sign_send_taskmsg){ \ + register s_u32_t *p; \ + register s_u8_t size; \ + m0_ = true; \ + p = &m0_ + 1; \ + size = &m0 - &m0_ - 1; \ + do{ \ + *p++ = *m_taskmsg_psp++; \ + }while(--size); \ + s_sign_send_taskmsg = false; \ + if(s_taskcri_counter){ \ + uExitCritical; \ + } \ + return; \ +} + +#define sCreateTaskMsg_0 \ +(void) \ +{ \ + do + +#define sCreateTaskMsg_1(m1) \ +(m0__, m1##__) \ +{ \ + __dm m_taskmsg_t m0_ = false; \ + __dm m1##_; \ + __dm m_taskmsg_t m0; \ + __dm m1; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_2(m1, m2) \ +(m0__, m1##__, m2##__) \ +{ \ + __dm m_taskmsg_t m0_ = false; \ + __dm m1##_; __dm m2##_; \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_3(m1, m2, m3) \ +(m0__, m1##__, m2##__, m3##__) \ +{ \ + __dm m_taskmsg_t m0_ = false; \ + __dm m1##_; __dm m2##_; __dm m3##_; \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_4(m1, m2, m3, m4) \ +(m0__, m1##__, m2##__, m3##__, m4##__) \ +{ \ + __dm m_taskmsg_t m0_ = false; \ + __dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_5(m1, m2, m3, m4, m5) \ +(m0__, m1##__, m2##__, m3##__, m4##__, m5##__) \ +{ \ + __dm m_taskmsg_t m0_ = false; \ + __dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; __dm m5##_; \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; __dm m5; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_6(m1, m2, m3, m4, m5, m6) \ +(m0__, m1##__, m2##__, m3##__, m4##__, m5##__, m6##__) \ +{ \ + __dm m_taskmsg_t m0_ = false; \ + __dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; __dm m5##_; __dm m6##_; \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_7(m1, m2, m3, m4, m5, m6, m7) \ +(m0__, m1##__, m2##__, m3##__, m4##__, m5##__, m6##__, m7##__) \ +{ \ + __dm m_taskmsg_t m0_ = false; \ + __dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; __dm m5##_; __dm m6##_; __dm m7##_; \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; __dm m7; \ + sTaskMsg_Init; \ + do + +#define sCreateTaskMsg_8(m1, m2, m3, m4, m5, m6, m7, m8) \ +(m0__, m1##__, m2##__, m3##__, m4##__, m5##__, m6##__, m7##__, m8##__) \ +{ \ + __dm m_taskmsg_t m0_ = false; \ + __dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; __dm m5##_; __dm m6##_; __dm m7##_; __dm m8##_; \ + __dm m_taskmsg_t m0; \ + __dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; __dm m7; __dm m8; \ + sTaskMsg_Init; \ + do + +#endif + + + +/* + * 事件标志组 - 写标志位 + */ + +#define siWriteFlagBits \ + u_psv.value = ( \ + sizeof(lv) == 1 ? *(s_u8_t *)&lv \ + : sizeof(lv) == 2 ? *(s_u16_t *)&lv \ + : sizeof(lv) == 4 ? *(s_u32_t *)&lv \ + : 0 \ + ); \ + } \ + mPendSV_Load; \ +}while(false) + +#define siWriteFlagBits_1(bit1) \ + lv.bit1 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_2(bit1, bit2) \ + lv.bit1 = lv.bit2 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_3(bit1, bit2, bit3) \ + lv.bit1 = lv.bit2 = lv.bit3 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_4(bit1, bit2, bit3, bit4) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_5(bit1, bit2, bit3, bit4, bit5) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_6(bit1, bit2, bit3, bit4, bit5, bit6) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_7(bit1, bit2, bit3, bit4, bit5, bit6, bit7) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_8(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_9(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \ + lv.bit9 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_10(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \ + lv.bit9 = lv.bit10 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_11(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \ + lv.bit9 = lv.bit10 = lv.bit11 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_12(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \ + lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_13(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12, bit13) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \ + lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = lv.bit13 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_14(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12, bit13, bit14) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \ + lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = lv.bit13 = lv.bit14 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_15(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12, bit13, bit14, bit15) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \ + lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = lv.bit13 = lv.bit14 = lv.bit15 = true; \ + siWriteFlagBits + +#define siWriteFlagBits_16(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12, bit13, bit14, bit15, bit16) \ + lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \ + lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = lv.bit13 = lv.bit14 = lv.bit15 = lv.bit16 = true; \ + siWriteFlagBits + + + +/* + * 消息队列 + */ + +/* 动态队列 - 发送消息 */ +#define sSendMsg_Dynamic(p) \ +do{ \ + node->msg = p; \ + node->next = NULL; \ + node->last = ((s_msgqueue_dynamic_tsp)queue)->tail; \ + if(((s_msgqueue_dynamic_tsp)queue)->tail != NULL){ \ + ((s_msgqueue_dynamic_tsp)queue)->tail->next = node; \ + } \ + ((s_msgqueue_dynamic_tsp)queue)->tail = node; \ + if(((s_msgqueue_dynamic_tsp)queue)->head == NULL){ \ + ((s_msgqueue_dynamic_tsp)queue)->head = node; \ + } \ + queue->counter++; \ +}while(false) + +/* 动态队列 - 接收消息 */ +#define sRecvMsg_Dynamic(p) \ +do{ \ + if(queue->mode == __MSGQUE_LIFO__){ \ + node = ((s_msgqueue_dynamic_tsp)queue)->tail; \ + p = node->msg; \ + node = node->last; \ + s_free(((s_msgqueue_dynamic_tsp)queue)->tail); \ + ((s_msgqueue_dynamic_tsp)queue)->tail = node; \ + if(node == NULL){ \ + ((s_msgqueue_dynamic_tsp)queue)->head = NULL; \ + } \ + else{ \ + node->next = NULL; \ + } \ + } \ + else{ \ + node = ((s_msgqueue_dynamic_tsp)queue)->head; \ + p = node->msg; \ + node = node->next; \ + s_free(((s_msgqueue_dynamic_tsp)queue)->head); \ + ((s_msgqueue_dynamic_tsp)queue)->head = node; \ + if(node == NULL){ \ + ((s_msgqueue_dynamic_tsp)queue)->tail = NULL; \ + } \ + else{ \ + node->last = NULL; \ + } \ + } \ + queue->counter--; \ +}while(false) + +/* 静态队列 - 发送消息 */ +#define sSendMsg_Static(p) \ +do{ \ + if(((s_msgqueue_static_tsp)queue)->tail < ((s_msgqueue_static_tsp)queue)->base + queue->len - 1){ \ + ((s_msgqueue_static_tsp)queue)->tail++; \ + } \ + else{ \ + ((s_msgqueue_static_tsp)queue)->tail = ((s_msgqueue_static_tsp)queue)->base; \ + } \ + *((s_msgqueue_static_tsp)queue)->tail = p; \ + queue->counter++; \ +}while(false) + +/* 静态队列 - 接收消息 */ +#define sRecvMsg_Static(p) \ +do{ \ + if(queue->mode == __MSGQUE_LIFO__){ \ + p = *((s_msgqueue_static_tsp)queue)->tail; \ + if(((s_msgqueue_static_tsp)queue)->tail > ((s_msgqueue_static_tsp)queue)->base){ \ + ((s_msgqueue_static_tsp)queue)->tail--; \ + } \ + else{ \ + ((s_msgqueue_static_tsp)queue)->tail = ((s_msgqueue_static_tsp)queue)->base + queue->len - 1; \ + } \ + } \ + else{ \ + p = *((s_msgqueue_static_tsp)queue)->head; \ + if(((s_msgqueue_static_tsp)queue)->head < ((s_msgqueue_static_tsp)queue)->base + queue->len - 1){ \ + ((s_msgqueue_static_tsp)queue)->head++; \ + } \ + else{ \ + ((s_msgqueue_static_tsp)queue)->head = ((s_msgqueue_static_tsp)queue)->base; \ + } \ + } \ + queue->counter--; \ +}while(false) + + + +#endif diff --git a/System/os_base.h b/System/os_base.h new file mode 100644 index 0000000..cb6d2b7 --- /dev/null +++ b/System/os_base.h @@ -0,0 +1,23 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_base.h + * @brief Ͷ + * @author ٿ + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#ifndef __OS_BASE_H +#define __OS_BASE_H + +typedef char s_s8_t; +typedef short s_s16_t; +typedef long s_s32_t; +typedef unsigned char s_u8_t; +typedef unsigned short s_u16_t; +typedef unsigned long s_u32_t; +typedef s_u8_t s_bool_t; + + + +#endif diff --git a/System/os_debug.c b/System/os_debug.c new file mode 100644 index 0000000..a5a5cb1 --- /dev/null +++ b/System/os_debug.c @@ -0,0 +1,136 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_debug.c + * @brief DEBUG接口(串口发送和接收解析) + * @author 迟凯峰 + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#include "os_link.h" +#if SYSCFG_DEBUGGING == __ENABLED__ + +#if SYSCFG_MCUCORE == 8051 + +static char* _strncpy_(char* src, const char* sub, size_t n) +{ + if(src == NULL || sub == NULL || !*sub || !n){ + return src; + } + else{ + char* str = src; + do{ + *str++ = *sub; + if(!*sub++){ + return src; + } + }while(--n); + *str = '\0'; + return src; + } +} + +static char _strncmp_(const char* src, const char* sub, size_t n) +{ + if(src == NULL || sub == NULL){ + return 1; + } + do{ + if(*src++ == *sub){ + if(!*sub++){ + return 0; + } + } + else{ + return 1; + } + }while(--n); + return 0; +} + +static int _atoi_(const char* str) +{ + if(str == NULL || !*str){ + return 0; + } + else{ + int a = 0; + int k = 1; + s_u8_t i = s_strlen(str); + while(i--){ + if(str[i] >= '0' && str[i] <= '9'){ + a += (str[i] - '0') * k; + k *= 10; + } + else if(str[i] == '+'){ + return a; + } + else if(str[i] == '-'){ + return -a; + } + else{ + return 0; + } + } + return a; + } +} + +#else +#define _strncpy_ strncpy +#define _strncmp_ strncmp +#define _atoi_ atoi +#endif + +static void _debug_recv_(void) +{ + #define hptr s_debug_recvbuff + s_u16_t temp; + char strtmp[8]; + char _XDATA_MEM_ *mptr = hptr; + char _XDATA_MEM_ *tptr = hptr + s_strlen(hptr) - 2; + if(!s_strcmp(tptr, "\r\n")){ + if(!s_strcmp(hptr, "taskmgr\r\n")){ + s_sign_taskmgr = true; + } + else if(!s_strcmp(hptr, "exit\r\n")){ + s_sign_taskmgr = false; + } + else if(!_strncmp_(hptr, "taskmgr /s=", 11)){ + mptr += 11; + _strncpy_(strtmp, mptr, tptr - mptr); + strtmp[tptr - mptr] = '\0'; + temp = _atoi_(strtmp); + if(temp >= 50 && temp <= 5000){ + mSysIRQ_Disable; + s_timqry_reload[OS_TMID_TASKMGR] = (1000UL * temp) / SYSCFG_SYSTICKCYCLE; + mSysIRQ_Enable; + } + } + } + #undef hptr +} + +uCreateTask_TimInt(OS_TMID_DEBUGGER, false, Debugger, SYSCFG_TASKPRIORITY - 1, MCUCFG_STACKSIZE_DEBUGGER, 0, 0) +{ + s_debug_recvptr[0] = '\0'; + _debug_recv_(); + s_debug_recvptr = s_debug_recvbuff; + uSuspendTasking; + uEndTasking; +} + +uCreateHook_TimQry(OS_TMID_DEBUGHOOK, s_debug_sendtype, false, debug_hook) +{ + if(s_debug_sendtype & OS_DEBUG_SEND_TASKMGR){ + s_debug_sendtype &= ~OS_DEBUG_SEND_TASKMGR; + s_debug_sendptr = s_taskmgr_sendbuff; + } + else if(s_debug_sendtype & OS_DEBUG_SEND_CMDLINE){ + s_debug_sendtype &= ~OS_DEBUG_SEND_CMDLINE; + s_debug_sendptr = s_cmdline_sendbuff; + } + SYSCFG_DEBUGSEND; +} + +#endif diff --git a/System/os_def.h b/System/os_def.h new file mode 100644 index 0000000..6b652e2 --- /dev/null +++ b/System/os_def.h @@ -0,0 +1,135 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_def.h + * @brief 初始宏定义 + * @author 迟凯峰 + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#ifndef __OS_DEF_H +#define __OS_DEF_H + +#define false 0 +#define true 1 + +/* + * CONFIG VALUE + */ + +#define __DISABLED__ 0 +#define __ENABLED__ 1 +#define __STATIC__ 0 +#define __DYNAMIC__ 2 +#define __MSP__ 0 +#define __PSP__ 1 +#define __STCLK__ 0 +#define __FCLK__ 1 +#define __STANDARD__ 0 +#define __INTELLIGENT__ 0 +#define __PERFORMANCE__ 1 +#define __MSGQUE_FIFO__ 0 +#define __MSGQUE_LIFO__ 1 +#define __MCS_51__ 0 +#define __MCS_251__ 1 +#define __ARM__ 2 + + + +/* + * 任务相关 + */ + +#define OS_TASKQUEUELEN_MAX 255 // 任务队列最大长度 + +/* 任务状态 */ +#define OS_STATUS_READY 0x00 // 就绪 +#define OS_STATUS_FLOATING 0x01 // 浮动 +#define OS_STATUS_BLOCKED 0x02 // 阻塞 +#define OS_STATUS_OVERTIME 0x04 // 超时 +#define OS_STATUS_SUSPENDED 0x08 // 挂起 +#define OS_STATUS_STOPPED 0x10 // 停止 +#define OS_STATUS_STOPPED_TSOF 0x30 // 任务栈溢出停止 +#define OS_STATUS_STOPPED_TSRF 0x50 // 任务栈重分配失败停止 +#define OS_STATUS_DELETED 0x80 // 已删除/未启动 + +/* 阻塞事件类型 */ +#define OS_BLOCKED_DELAY 0x00 // 延时阻塞 +#define OS_BLOCKED_BINARY 0x10 // 二值信号量阻塞(获取/等待) +#define OS_BLOCKED_MUTEX 0x20 // 互斥信号量阻塞(获取) +#define OS_BLOCKED_SEMAPHORE 0x30 // 计数信号量阻塞(获取) +#define OS_BLOCKED_FLAGGROUP 0x40 // 等待标志组阻塞 +#define OS_BLOCKED_TASKMSG 0x50 // 接收私信阻塞 +#define OS_BLOCKED_FETION 0x60 // 接收飞信阻塞 +#define OS_BLOCKED_MAIL 0x70 // 接收邮件阻塞 +#define OS_BLOCKED_MSG 0x80 // 接收消息阻塞 + + + +/* + * DEBUG SEND TYPE + */ + +#define OS_DEBUG_SEND_CMDLINE 0x01 +#define OS_DEBUG_SEND_TASKMGR 0x02 + + + +/* + * TASKMGR LEN + */ + +#define OS_TASKMGR_LEN_PRI 6 +#define OS_TASKMGR_LEN_STA 6 +#define OS_TASKMGR_LEN_CPU 9 + + + +/* + * SVID(服务ID,中断挂起服务系统专用ID) + */ + +#define OS_SVID_RESUMETASK 0x00 +#define OS_SVID_SUSPENDTASK 0x01 +#define OS_SVID_DELETETASK 0x02 +#define OS_SVID_SETTASKPRI 0x03 +#define OS_SVID_SETBLOCK 0x04 +#define OS_SVID_CELARBLOCK 0x05 +#define OS_SVID_TIMINT 0x06 +#define OS_SVID_TIMQRY 0x07 +#define OS_SVID_BINARY 0x08 +#define OS_SVID_GIVESEM 0x09 +#define OS_SVID_SENDFETION 0x0A +#define OS_SVID_SENDMAIL 0x0B +#define OS_SVID_SENDMSG 0x0C +#define OS_SVID_GROUP 0x0D +#define OS_SVID_GVARWRITE 0x0E +#define OS_SVID_PENDSVC 0x0F +#define OS_SVID_SENDSIGN 0x10 +#define OS_SVID_END 0x11 + + + +/* + * ECODE(错误码) + */ + +#define OS_ECODE_NOERROR 0 // 无错误 +#define OS_ECODE_OVERFLOW_MSGQUEUE 1 // 消息队列溢出 +#define OS_ECODE_OVERFLOW_TASKQUEUE 2 // 任务队列溢出 +#define OS_ECODE_OVERFLOW_TASKSTACK 3 // 任务栈溢出 +#define OS_ECODE_MALLOCFAIL_MSGNODE 4 // 消息节点内存分配失败 +#define OS_ECODE_MALLOCFAIL_TASKNODE 5 // 任务节点内存分配失败 +#define OS_ECODE_MALLOCFAIL_TASKSTACK 6 // 任务栈内存分配失败 +#define OS_ECODE_TASKSUSPENDED 7 // 任务已挂起 +#define OS_ECODE_TASKSTOPPED 8 // 任务已停止 +#define OS_ECODE_TASKNOTSTARTED 9 // 任务未启动/已删除 +#define OS_ECODE_TASKNOTREADY 10 // 任务未就绪 +#define OS_ECODE_TASKNOTBLOCKED 11 // 任务未阻塞 +#define OS_ECODE_TASKNOTSUSPENDED 12 // 任务未挂起 +#define OS_ECODE_TASKPRIUNCHANGED 13 // 任务优先级未改变 +#define OS_ECODE_DONOTKNOW 255 // 未知错误 + + + +#endif diff --git a/System/os_handler.c b/System/os_handler.c new file mode 100644 index 0000000..9c602b7 --- /dev/null +++ b/System/os_handler.c @@ -0,0 +1,716 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_handler.c + * @brief SysTick2_Handler and PendSV2_Handler + * @author 迟凯峰 + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#include "os_link.h" + +#if SYSCFG_DEBUGGING == __ENABLED__ +static s_u32_t usedtime[2]; +#endif + +void SysTick2_Handler(void) MCUCFG_SYSTICK_ATTRIBUTE +{ +/* 清除中断标志位 */ +{ + mSysTick_Clear; +} +{ + s_tid_t _SYS_REG_ i; + /* 系统滴答时间统计开始 */ + #if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__ + static m_tick_t tick_temp; + if(s_sign_taskmgr){ + tick_temp = mSysTick_Counter; + } + #endif + /* 软件RTC */ + #if SYSCFG_SOFTRTC == __ENABLED__ + if(true){ + static + #if SYSCFG_SYSTICKCYCLE > 1000000UL / 65536 + s_u16_t + #else + s_u32_t + #endif + _SYS_MEM_ counter = 0; + if(counter < 1000000UL / SYSCFG_SYSTICKCYCLE - 1) counter++; + else{ + counter = 0; + s_sign_every.second = true; + if(s_rtc[0][5] < 59) s_rtc[0][5]++; + else{ + s_rtc[0][5] = 0; + s_sign_every.minute = true; + if(s_rtc[0][4] < 59) s_rtc[0][4]++; + else{ + s_rtc[0][4] = 0; + s_sign_every.hour = true; + if(s_rtc[0][3] < 23) s_rtc[0][3]++; + else{ + s_rtc[0][3] = 0; + s_sign_every.day = true; + if(s_rtc[0][6] < 7) s_rtc[0][6]++; + else s_rtc[0][6] = 1; + if(s_rtc[0][2] < (s_rtc[0][1] == 2 ? s_month2day : s_month0day[s_rtc[0][1]])) s_rtc[0][2]++; + else{ + s_rtc[0][2] = 1; + s_sign_every.month = true; + if(s_rtc[0][1] < 12) s_rtc[0][1]++; + else{ + s_rtc[0][1] = 1; + s_sign_every.year = true; + if(s_rtc[0][0] < 99) s_rtc[0][0]++; + else s_rtc[0][0] = 0; + } + } + } + } + } + } + tUpdateCopy(s_memcpy(s_rtc[1], s_rtc[0], sizeof(s_rtc[0]))); + } + #endif + /* 滴答钩子 */ + #if SYSCFG_TICKHOOK == __ENABLED__ + tick_hook(); + #endif + /* 定时中断 */ + #if OS_TIMINTTOTAL + i = OS_TIMINTTOTAL; + while(i--){ + if(s_timint_loader[i]){ + s_timint_loader[i]--; + if(!s_timint_loader[i]){ + if(s_timint_autoreload[i]){ + s_timint_loader[i] = s_timint_reload[i]; + } + if(s_timint_hookortask[i]){ + sResumeTask_TimInt(i); + } + else{ + (*(s_voidvoid_tfp)s_timint_handle[i]->hookorhand)(); + } + } + } + } + #endif + /* 定时查询 */ + #if OS_TIMQRYTOTAL + i = OS_TIMQRYTOTAL; + while(i--){ + if(s_timqry_loader[i] && s_timqry_loader[i] < ~0){ + s_timqry_loader[i]--; + } + if(!s_timqry_loader[i]){ + if((*s_timqry_handle[i]->event)()){ + if(s_timqry_autoreload[i]){ + s_timqry_loader[i] = s_timqry_reload[i]; + } + else{ + s_timqry_loader[i] = ~0; + } + if(s_timqry_hookortask[i]){ + sResumeTask_TimQry(i); + } + else{ + (*(s_voidvoid_tfp)s_timqry_handle[i]->hookorhand)(); + } + } + } + } + #endif + /* 延时定时器 */ + i = OS_TASKTOTAL; + do{ + if(s_delay_loader[i] && s_delay_loader[i] < ~0){ + s_delay_loader[i]--; + } + }while(--i); + /* 时间片滴答计数 */ + s_tick_counter++; + /* 安全运行时 */ + #if SYSCFG_SAFERUNTIME == __ENABLED__ + if(s_task_current != NULL && s_task_current->pri && s_task_current->saferuntime){ + s_task_current->counter++; + if(s_task_current->counter > 1UL * s_task_current->saferuntime * OS_TIMESHARING){ + s_task_current->status = OS_STATUS_OVERTIME; + s_sign_timeout[s_task_current->tid] = true; + #if SYSCFG_DEBUGGING == __ENABLED__ + s_alarm.timedout_saferuntime = true; + #endif + } + } + #endif + /* 任务管理器相关 */ + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_sign_taskmgr){ + usedtime[0]++; /* CPU使用时间计数 */ + #if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__ + mSysTick_Counting; /* 系统滴答时间统计 */ + #endif + } + #endif + /* 触发任务调度(定时调度)*/ + if(!s_sign_return){ + s_sign_scheduling = true; + mPendSV_Set; + } +} +} + +/* 任务节点 */ +#define node_head task_node[0] /* 头节点 */ +#define node_midd task_node[1] /* 中间节点 */ +#define node_tail task_node[2] /* 尾节点 */ +#define node_curr node_buff[0] /* 当前节点 */ +#define node_news node_buff[1] /* 新节点 */ +#define node_temp node_buff[2] /* 缓存节点 */ +#define node_last node_curr->last /* 上一节点 */ +#define node_next node_curr->next /* 下一节点 */ + +/* 初始化任务队列(CosyOS的任务队列为双向循环链表)*/ +#define init_taskqueue \ + node_head = node_midd = node_tail = \ + node_news->last = node_news->next = node_news +#define init_node_head node_curr = node_head /* 初始化 头节点 */ +#define init_node_midd node_curr = node_midd /* 初始化中间节点 */ +#define move_forward node_curr = node_last /* 当前节点前移 */ +#define move_backward node_curr = node_next /* 当前节点后移 */ + +/* 移除节点(从任务队列中移除当前节点)*/ +#define node_remove \ +do{ \ + node_last->next = node_next; \ + node_next->last = node_last; \ + if(node_curr == node_head){ \ + node_head = node_next; \ + } \ + task_queue_len--; \ +}while(false) + +/* 插入方向 */ +#define forward 0x01 /* 向前 */ +#define voidward 0x00 /* 空 */ +#define backward 0xFF /* 向后 */ + +/* 前插(新节点插入当前节点之前)*/ +#define insert_forward \ +do{ \ + node_news->next = node_curr; \ + node_news->last = node_last; \ + node_last->next = node_news; \ + node_last = node_news; \ + if(node_curr == node_head){ \ + node_head = node_news; \ + } \ + switch(insert_direction){ \ + case forward: \ + insert_direction = voidward; \ + node_midd = node_midd->last; \ + break; \ + case voidward: \ + insert_direction = forward; \ + break; \ + case backward: \ + insert_direction = voidward; \ + break; \ + } \ +}while(false) + +/* 后插(新节点插入当前节点之后)*/ +#define insert_backward \ +do{ \ + node_news->last = node_curr; \ + node_news->next = node_next; \ + node_next->last = node_news; \ + node_next = node_news; \ + if(node_curr == node_tail){ \ + node_tail = node_news; \ + } \ + switch(insert_direction){ \ + case forward: \ + insert_direction = voidward; \ + break; \ + case voidward: \ + insert_direction = backward; \ + break; \ + case backward: \ + insert_direction = voidward; \ + node_midd = node_midd->next; \ + break; \ + } \ +}while(false) + +/* 抢占式调度 or 时间片轮转调度 */ +#define preemptive_or_rotate \ +do{ \ + if(!rotate_f){ \ + node_news = node_curr; \ + if(s_task_current == NULL || node_news->pri != s_task_current->pri){ \ + goto __TASK_SCHEDULING; \ + } \ + rotate_f = true; \ + } \ +}while(false) + +#if SYSCFG_MCUCORE == 80251 +#pragma functions(static) +#endif +void PendSV2_Handler(void) MCUCFG_PENDSV_ATTRIBUTE +{ +/* 中断挂起服务 */ +{ + mPendSV_Entry; +} +/* 中断服务钩子 */ +{ + #if SYSCFG_PENDSVHOOK == __ENABLED__ + pendsv_hook(); + #endif +} +/* 更新全局变量副本 */ +{ + #if SYSCFG_SOFTRTC == __ENABLED__ || SYSCFG_GVARHOOK == __ENABLED__ + s_sign_updatecopy = true; + #if SYSCFG_SOFTRTC == __ENABLED__ + if(s_sign_rtc){ + s_sign_rtc = false; + s_memcpy(s_rtc[1], s_rtc[0], sizeof(s_rtc[0])); + } + #endif + #if SYSCFG_GVARHOOK == __ENABLED__ + gvar_hook(); + #endif + s_sign_updatecopy = false; + #endif +} +/* 任务调度 */ +if(s_sign_scheduling) +{ + static s_u8_t _SYS_MEM_ task_queue_len = 0; + static s_u8_t _SYS_MEM_ insert_direction = 0; + static s_tasknode_tsp _SYS_MEM_ task_node[3] = {NULL, NULL, NULL}; + s_tasknode_tsp _SYS_REG_ node_buff[3]; + #if SYSCFG_DEBUGGING == __ENABLED__ + m_tick_t _SYS_REG_ counter; + #endif + m_bit_t push_f = false; + m_bit_t rotate_f = false; + /* 调度初始化 */ + mScheduler_INIT; + /* 启动任务 */ + if(s_task_starter != NULL){ + if(task_queue_len < OS_TASKQUEUELEN_MAX){ + /* 静态创建 */ + if(*s_task_starter->handle != NULL){ + node_news = (s_tasknode_tsp)s_task_starter; + if(node_news->stacksize < MCUCFG_BASICSTACKSIZE){ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_fault.failed_startuptask = true; + s_fault.overflow_taskstack = true; + #endif + s_startup_code = OS_ECODE_OVERFLOW_TASKSTACK; + goto __STARTUP_END; + } + else{ + mTaskStack_INIT; + } + } + /* 动态创建 */ + else{ + node_news = NULL; + node_news = (s_tasknode_tsp)s_malloc(sizeof(s_tasknode_ts)); + if(node_news != NULL){ + node_news->stacksize = s_task_starter->stacksize; + if(node_news->stacksize < MCUCFG_BASICSTACKSIZE){ + node_news->stacksize = MCUCFG_BASICSTACKSIZE; + node_news->create = 2; + } + else{ + node_news->create = 1; + } + node_news->bsp = NULL; + node_news->bsp = (s_u8_t *)s_malloc(node_news->stacksize); + if(node_news->bsp != NULL){ + mTaskStack_INIT; + node_news->tid = s_task_starter->tid; + node_news->oldpri = s_task_starter->oldpri; + node_news->handle = s_task_starter->handle; + *node_news->handle = node_news; + #if SYSCFG_DEBUGGING == __ENABLED__ + node_news->name = s_task_starter->name; + #endif + #if SYSCFG_SAFERUNTIME == __ENABLED__ + node_news->saferuntime = s_task_starter->saferuntime; + #endif + node_news->status = s_task_status0; + } + else{ + s_free(node_news); + #if SYSCFG_DEBUGGING == __ENABLED__ + s_fault.failed_startuptask = true; + s_fault.mallocfailed_taskstack = true; + #endif + s_startup_code = OS_ECODE_MALLOCFAIL_TASKSTACK; + goto __STARTUP_END; + } + } + else{ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_fault.failed_startuptask = true; + s_fault.mallocfailed_tasknode = true; + #endif + s_startup_code = OS_ECODE_MALLOCFAIL_TASKNODE; + goto __STARTUP_END; + } + } + if(node_news->oldpri <= (s_u8_t)(SYSCFG_TASKPRIORITY - 1)){ + node_news->pri = node_news->oldpri; + } + else{ + node_news->pri = SYSCFG_TASKPRIORITY - 2; + #if SYSCFG_DEBUGGING == __ENABLED__ + s_alarm.outrange_taskpriority = true; + #endif + } + node_news->blocktype = 0; + node_news->ptr = NULL; + #if SYSCFG_DEBUGGING == __ENABLED__ + node_news->usedtime[0] = 0; + node_news->usedtime[1] = 0; + node_news->stacklen_max = MCUCFG_BASICSTACKSIZE; + #endif + #if SYSCFG_SAFERUNTIME == __ENABLED__ + node_news->counter = 0; + #endif + s_delay_loader[node_news->tid] = 0; + /* 新任务加入任务队列 */ + if(!task_queue_len){ + init_taskqueue; + } + else{ + init_node_midd; + if(node_curr != node_tail && node_news->pri <= node_curr->pri){ + do{ + move_backward; + }while(node_curr != node_tail && node_news->pri <= node_curr->pri); + } + else if(node_curr != node_head && node_news->pri > node_curr->pri){ + do{ + move_forward; + }while(node_curr != node_head && node_news->pri > node_curr->pri); + } + if(node_news->pri > node_curr->pri){ + insert_forward; + } + else if(node_curr == node_tail && node_curr->pri == 0){ + insert_forward; + } + else{ + insert_backward; + } + } + task_queue_len++; + s_startup_code = OS_ECODE_NOERROR; + } + else{ + #if SYSCFG_DEBUGGING == __ENABLED__ + s_fault.failed_startuptask = true; + s_alarm.overflow_taskqueue = true; + #endif + s_startup_code = OS_ECODE_OVERFLOW_TASKQUEUE; + } + __STARTUP_END: + s_task_starter = NULL; + if(s_sign_return) return; + } + /** + * \brief 任务优先级调整 + * \detail 如果任务优先级发生改变,执行服务时已从任务队列中移除并加入到临时链表。 + * 在此,从临时链表中依次取出各任务,并根据任务优先级重新加入到任务队列。 + */ + if(s_taskpri_tail != NULL){ + node_temp = s_taskpri_tail; + do{ + node_news = node_temp; + node_temp = node_temp->last; + init_node_midd; + if(node_curr != node_tail && node_news->pri <= node_curr->pri){ + do{ + move_backward; + }while(node_curr != node_tail && node_news->pri <= node_curr->pri); + } + else if(node_curr != node_head && node_news->pri > node_curr->pri){ + do{ + move_forward; + }while(node_curr != node_head && node_news->pri > node_curr->pri); + } + if(node_news->pri > node_curr->pri){ + insert_forward; + } + else if(node_curr == node_tail && node_curr->pri == 0){ + insert_forward; + } + else{ + insert_backward; + } + }while(node_temp != NULL); + s_taskpri_tail = NULL; + } + /** + * \brief 查找就绪 + * \detail 更新任务状态并同步查找可以运行的、优先级最高的任务。 + */ + init_node_head; + while(true){ + switch(node_curr->status){ + case OS_STATUS_BLOCKED: + if(!s_delay_loader[node_curr->tid]){ + node_curr->status = OS_STATUS_READY; + preemptive_or_rotate; + } + else if(node_curr->blocktype != OS_BLOCKED_DELAY){ + switch(node_curr->blocktype & 0x0F){ + case 1: + if(*(s_u8_t *)node_curr->ptr){ + node_curr->status = OS_STATUS_FLOATING; + preemptive_or_rotate; + } + break; + case 2: + if(*(s_u16_t *)node_curr->ptr){ + node_curr->status = OS_STATUS_FLOATING; + preemptive_or_rotate; + } + break; + case 4: + if(*(s_u32_t *)node_curr->ptr){ + node_curr->status = OS_STATUS_FLOATING; + preemptive_or_rotate; + } + break; + case 0x0F: + if(!*(s_u8_t *)node_curr->ptr){ + node_curr->status = OS_STATUS_FLOATING; + preemptive_or_rotate; + } + break; + } + } + break; + case OS_STATUS_FLOATING: + if(!s_delay_loader[node_curr->tid]){ + node_curr->status = OS_STATUS_READY; + preemptive_or_rotate; + } + else{ + switch(node_curr->blocktype & 0x0F){ + case 1: + if(*(s_u8_t *)node_curr->ptr){ + preemptive_or_rotate; + } + else{ + node_curr->status = OS_STATUS_BLOCKED; + } + break; + case 2: + if(*(s_u16_t *)node_curr->ptr){ + preemptive_or_rotate; + } + else{ + node_curr->status = OS_STATUS_BLOCKED; + } + break; + case 4: + if(*(s_u32_t *)node_curr->ptr){ + preemptive_or_rotate; + } + else{ + node_curr->status = OS_STATUS_BLOCKED; + } + break; + case 0x0F: + if(!*(s_u8_t *)node_curr->ptr){ + preemptive_or_rotate; + } + else{ + node_curr->status = OS_STATUS_BLOCKED; + } + break; + } + } + break; + case OS_STATUS_READY: + preemptive_or_rotate; + break; + case OS_STATUS_DELETED: + if(node_curr != s_task_current){ + node_remove; + if(node_curr->create){ + s_free(node_curr->bsp); + *node_curr->handle = NULL; + s_free(node_curr); + } + } + break; + #if SYSCFG_SAFERUNTIME == __ENABLED__ + case OS_STATUS_OVERTIME: + if(!s_sign_timeout[node_curr->tid]) { + node_curr->status = OS_STATUS_READY; + preemptive_or_rotate; + } + break; + #endif + } + move_backward; + /* 当前任务优先级组查询完毕 -> 当前任务预处理 */ + if(rotate_f && node_curr->pri != s_task_current->pri){ + goto __TASKING_PREPROCESS; + } + } + + /* 准备任务调度(首次任务调度 -> 新任务预处理)*/ + __TASK_SCHEDULING: + if(s_task_current == NULL){ + goto __NEWTASK_PREPROCESS; + } + + /* 当前任务预处理 */ + __TASKING_PREPROCESS:{ + mTaskStack_LEN; + /* 每调度监控(假定入栈)*/ + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_task_current->stacklen_max < stacklen){ + s_task_current->stacklen_max = stacklen; + if(s_task_current->stacksize < stacklen){ + s_alarm.overflow_taskstack_future = true; + } + } + #endif + } + + /* 开始任务调度 */ + if(true){ + /* 1、新任务与当前任务优先级不同 -> 当前任务后处理 */ + if(node_news->pri != s_task_current->pri){ + goto __TASKING_POSTPROCESS; + } + /* 2、当前任务可以运行 && 时间片未到期 -> 返回 */ + if(s_tick_counter < OS_TIMESHARING && s_task_current->status <= OS_STATUS_FLOATING){ + s_task_current->status = OS_STATUS_READY; + if(s_task_current->blocktype != OS_BLOCKED_DELAY){ + uEnterCritical; + } + return; + } + /* 3、当前任务不可运行 || 时间片已到期 -> 时间片轮转调度 */ + node_curr = s_task_current; + move_backward; + while(node_last != node_tail && node_last->pri == node_curr->pri){ + if(node_curr->status > OS_STATUS_FLOATING){ + move_backward; + } + else{ + node_news = node_curr; + goto __TASKING_POSTPROCESS; + } + } + /* 4、新任务仍为当前任务,说明时间片已到期 -> 返回 */ + if(node_news == s_task_current){ + s_tick_counter = 0; + s_task_current->status = OS_STATUS_READY; + if(s_task_current->blocktype != OS_BLOCKED_DELAY){ + uEnterCritical; + } + return; + } + } + + /* 当前任务后处理 */ + __TASKING_POSTPROCESS:{ + if(s_task_current->status < OS_STATUS_STOPPED){ + /* 入栈监控 */ + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_task_current->stacksize < stacklen){ + #if MCUCFG_TASKSTACK_REALLOC == __ENABLED__ + if(s_task_current->create){ + s_task_current->stacksize = stacklen + MCUCFG_TASKSTACKREALLOC_INC; + s_free(s_task_current->bsp); + s_task_current->bsp = NULL; + s_task_current->bsp = (s_u8_t *)s_malloc(s_task_current->stacksize); + if(s_task_current->bsp != NULL){ + push_f = true; + s_task_current->create = 2; + s_alarm.realloc_taskstack = true; + } + else{ + s_task_current->status = OS_STATUS_STOPPED_TSRF; + s_fault.reallocfailed_taskstack = true; + } + } + else{ + s_task_current->status = OS_STATUS_STOPPED_TSOF; + s_fault.overflow_taskstack = true; + } + #else + s_task_current->status = OS_STATUS_STOPPED_TSOF; + s_fault.overflow_taskstack = true; + #endif + } + else{ + push_f = true; + } + #else + push_f = true; + #endif + } + else if(s_task_current->status == OS_STATUS_DELETED){ + node_curr = s_task_current; + node_remove; + if(node_curr->create){ + s_free(node_curr->bsp); + *node_curr->handle = NULL; + s_free(node_curr); + } + } + } + + /* 新任务预处理 */ + __NEWTASK_PREPROCESS:{ + s_tick_counter = 0; + node_news->status = OS_STATUS_READY; + if(node_news->blocktype != OS_BLOCKED_DELAY){ + uEnterCritical; + } + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_sign_taskmgr) counter = mSysTick_Counter; + #endif + } + + /* 当前任务入栈 */ + if(push_f){ + #if SYSCFG_SAFERUNTIME == __ENABLED__ + if(s_task_current->pri > node_news->pri){ + s_task_current->counter = 0; + } + #endif + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_sign_taskmgr) mUsedTime_END; + #endif + mTaskStack_PUSH; + } + + /* 新任务出栈 */ + if(true){ + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_sign_taskmgr) mUsedTime_INIT; + #endif + mTaskStack_POP; + } +} +} diff --git a/System/os_hook.h b/System/os_hook.h new file mode 100644 index 0000000..ba6d428 --- /dev/null +++ b/System/os_hook.h @@ -0,0 +1,33 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_hook.h + * @brief ϵͳӺ + * @author ٿ + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#ifndef __OS_HOOK_H +#define __OS_HOOK_H + +/* ʼ */ +void init_hook(void); + +/* */ +void start_hook(void); + +/* δ */ +void tick_hook(void); + +/* й */ +void idle_hook(void); + +/* */ +void pendsv_hook(void); + +/* ȫֱ */ +void gvar_hook(void); + + + +#endif diff --git a/System/os_link.h b/System/os_link.h new file mode 100644 index 0000000..886b262 --- /dev/null +++ b/System/os_link.h @@ -0,0 +1,26 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_link.h + * @brief 系统链接头文件(用户的各个c文件中应包含此文件) + * @author 迟凯峰 + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#ifndef __OS_LINK_H +#define __OS_LINK_H + +#include "os_var.h" +#include "os_api.h" +#include "sv_create.h" +#include "sv_task.h" +#include "sv_tick.h" +#include "sv_int_loc.h" +#include "sv_int_pend.h" +#include "ur_api.h" +#include "os_task.h" +#include "os_hook.h" + + + +#endif diff --git a/System/os_main.c b/System/os_main.c new file mode 100644 index 0000000..c711e18 --- /dev/null +++ b/System/os_main.c @@ -0,0 +1,36 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_main.c + * @brief 主函数 + * @author 迟凯峰 + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#include "os_link.h" + +int main(void) +{ + s_tid_t i; + #if OS_TIMINTTOTAL || OS_TIMQRYTOTAL + void s_init_timing(void); + s_init_timing(); + #endif + for(i = 0; i < OS_TASKTOTAL + 1; i++){ + s_delay_loader[i] = 0; + #if SYSCFG_SAFERUNTIME == __ENABLED__ + s_sign_timeout[i] = 0; + #endif + } + init_hook(); + mSys_INIT; + #if SYSCFG_DEBUGGING == __ENABLED__ + sStartTask_TimQry(OS_TMID_TASKMGR); + #endif + uStartTask(Starter, OS_STATUS_READY); + uStartTask(Sysidle, OS_STATUS_READY); + s_sign_return = false; + s_sign_scheduling = true; + mPendSV_Set; + while(true); +} diff --git a/System/os_redef.h b/System/os_redef.h new file mode 100644 index 0000000..5dc76a8 --- /dev/null +++ b/System/os_redef.h @@ -0,0 +1,657 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_redef.h + * @brief 系统重定义(包括宏定义和类型定义) + * @detail 基于os_def、os_base、syscfg、mcucfg再次进行定义及复合数据类型定义。 + * @author 迟凯峰 + * @version V2.0.0 + * @date 2024.03.17 + ******************************************************************************/ + +#ifndef __OS_REDEF_H +#define __OS_REDEF_H + +/*------------------------------------------------------------------------------ + * SYSAPI */ + +#define sDefStr(s) sDefStr_0(s) +#define sDefStr_0(s) #s + +#define sCatStr(s1, s2) sCatStr_0(s1, s2) +#define sCatStr_0(s1, s2) s1##s2 + +#define sDefBitsType(b) sDefBitsType_0(b) +#define sDefBitsType_0(b) s_u##b##_t + +#define sDefBitField(v) sDefBitField_0(v) +#define sDefBitField_0(v) volatile s_u8_t v:1 + +#define sDefVoidBits(n) sDefVoidBits_0(n) +#define sDefVoidBits_0(n) volatile s_u8_t :n + +#define sInitRealTime sInitRealTime_0(SYSCFG_MANUFACTUREDATE) +#define sInitRealTime_0(d) sInitRealTime_1(d) +#define sInitRealTime_1(y, m, d, H, M, s, w) {y % 100, m, d, H, M, s, w} + +#define sDefCentury sDefCentury_0(SYSCFG_MANUFACTUREDATE) +#define sDefCentury_0(d) sDefCentury_1(d) +#define sDefCentury_1(y, m, d, H, M, s, w) (y % 100 ? y / 100 + 1 : y / 100) + +/*------------------------------------------------------------------------------ + * INCLUDE */ + +#include +#include "..\Config\syscfg.h" +#include sDefStr(sCatStr(..\Config\mcucfg_, SYSCFG_MCUCORE.h)) + +/*------------------------------------------------------------------------------ + * NOPxX */ + +#define OS_NOPx1 MCUCFG_NOP +#define OS_NOPx2 OS_NOPx1; OS_NOPx1 +#define OS_NOPx3 OS_NOPx2; OS_NOPx1 +#define OS_NOPx4 OS_NOPx3; OS_NOPx1 +#define OS_NOPx5 OS_NOPx4; OS_NOPx1 +#define OS_NOPx6 OS_NOPx5; OS_NOPx1 +#define OS_NOPx7 OS_NOPx6; OS_NOPx1 +#define OS_NOPx8 OS_NOPx7; OS_NOPx1 + +/*------------------------------------------------------------------------------ + * TOTAL */ + +#if SYSCFG_DEBUGGING == 0 +#define OS_TASKTOTAL (SYSCFG_USERTASKTOTAL + 2) +#define OS_TIMINTTOTAL SYSCFG_USERTIMINTTOTAL +#define OS_TIMQRYTOTAL SYSCFG_USERTIMQRYTOTAL +#else +#define OS_TASKTOTAL (SYSCFG_USERTASKTOTAL + 4) +#define OS_TIMINTTOTAL (SYSCFG_USERTIMINTTOTAL + 1) +#define OS_TIMQRYTOTAL (SYSCFG_USERTIMQRYTOTAL + 2) + +/*------------------------------------------------------------------------------ + * TMID */ + +#define OS_TMID_DEBUGGER SYSCFG_USERTIMINTTOTAL +#define OS_TMID_DEBUGHOOK SYSCFG_USERTIMQRYTOTAL +#if OS_TIMQRYTOTAL == 2 +#define OS_TMID_TASKMGR 1 +#elif OS_TIMQRYTOTAL == 3 +#define OS_TMID_TASKMGR 2 +#elif OS_TIMQRYTOTAL == 4 +#define OS_TMID_TASKMGR 3 +#elif OS_TIMQRYTOTAL == 5 +#define OS_TMID_TASKMGR 4 +#elif OS_TIMQRYTOTAL == 6 +#define OS_TMID_TASKMGR 5 +#elif OS_TIMQRYTOTAL == 7 +#define OS_TMID_TASKMGR 6 +#elif OS_TIMQRYTOTAL == 8 +#define OS_TMID_TASKMGR 7 +#elif OS_TIMQRYTOTAL == 9 +#define OS_TMID_TASKMGR 8 +#elif OS_TIMQRYTOTAL == 10 +#define OS_TMID_TASKMGR 9 +#elif OS_TIMQRYTOTAL == 11 +#define OS_TMID_TASKMGR 10 +#elif OS_TIMQRYTOTAL == 12 +#define OS_TMID_TASKMGR 11 +#elif OS_TIMQRYTOTAL == 13 +#define OS_TMID_TASKMGR 12 +#elif OS_TIMQRYTOTAL == 14 +#define OS_TMID_TASKMGR 13 +#elif OS_TIMQRYTOTAL == 15 +#define OS_TMID_TASKMGR 14 +#elif OS_TIMQRYTOTAL == 16 +#define OS_TMID_TASKMGR 15 +#elif OS_TIMQRYTOTAL == 17 +#define OS_TMID_TASKMGR 16 +#elif OS_TIMQRYTOTAL == 18 +#define OS_TMID_TASKMGR 17 +#elif OS_TIMQRYTOTAL == 19 +#define OS_TMID_TASKMGR 18 +#elif OS_TIMQRYTOTAL == 20 +#define OS_TMID_TASKMGR 19 +#elif OS_TIMQRYTOTAL == 21 +#define OS_TMID_TASKMGR 20 +#elif OS_TIMQRYTOTAL == 22 +#define OS_TMID_TASKMGR 21 +#elif OS_TIMQRYTOTAL == 23 +#define OS_TMID_TASKMGR 22 +#elif OS_TIMQRYTOTAL == 24 +#define OS_TMID_TASKMGR 23 +#elif OS_TIMQRYTOTAL == 25 +#define OS_TMID_TASKMGR 24 +#elif OS_TIMQRYTOTAL == 26 +#define OS_TMID_TASKMGR 25 +#elif OS_TIMQRYTOTAL == 27 +#define OS_TMID_TASKMGR 26 +#elif OS_TIMQRYTOTAL == 28 +#define OS_TMID_TASKMGR 27 +#elif OS_TIMQRYTOTAL == 29 +#define OS_TMID_TASKMGR 28 +#elif OS_TIMQRYTOTAL == 30 +#define OS_TMID_TASKMGR 29 +#elif OS_TIMQRYTOTAL == 31 +#define OS_TMID_TASKMGR 30 +#elif OS_TIMQRYTOTAL == 32 +#define OS_TMID_TASKMGR 31 +#elif OS_TIMQRYTOTAL == 33 +#define OS_TMID_TASKMGR 32 +#elif OS_TIMQRYTOTAL == 34 +#define OS_TMID_TASKMGR 33 +#elif OS_TIMQRYTOTAL == 35 +#define OS_TMID_TASKMGR 34 +#elif OS_TIMQRYTOTAL == 36 +#define OS_TMID_TASKMGR 35 +#elif OS_TIMQRYTOTAL == 37 +#define OS_TMID_TASKMGR 36 +#elif OS_TIMQRYTOTAL == 38 +#define OS_TMID_TASKMGR 37 +#elif OS_TIMQRYTOTAL == 39 +#define OS_TMID_TASKMGR 38 +#elif OS_TIMQRYTOTAL == 40 +#define OS_TMID_TASKMGR 39 +#elif OS_TIMQRYTOTAL == 41 +#define OS_TMID_TASKMGR 40 +#elif OS_TIMQRYTOTAL == 42 +#define OS_TMID_TASKMGR 41 +#elif OS_TIMQRYTOTAL == 43 +#define OS_TMID_TASKMGR 42 +#elif OS_TIMQRYTOTAL == 44 +#define OS_TMID_TASKMGR 43 +#elif OS_TIMQRYTOTAL == 45 +#define OS_TMID_TASKMGR 44 +#elif OS_TIMQRYTOTAL == 46 +#define OS_TMID_TASKMGR 45 +#elif OS_TIMQRYTOTAL == 47 +#define OS_TMID_TASKMGR 46 +#elif OS_TIMQRYTOTAL == 48 +#define OS_TMID_TASKMGR 47 +#elif OS_TIMQRYTOTAL == 49 +#define OS_TMID_TASKMGR 48 +#elif OS_TIMQRYTOTAL == 50 +#define OS_TMID_TASKMGR 49 +#elif OS_TIMQRYTOTAL == 51 +#define OS_TMID_TASKMGR 50 +#elif OS_TIMQRYTOTAL == 52 +#define OS_TMID_TASKMGR 51 +#elif OS_TIMQRYTOTAL == 53 +#define OS_TMID_TASKMGR 52 +#elif OS_TIMQRYTOTAL == 54 +#define OS_TMID_TASKMGR 53 +#elif OS_TIMQRYTOTAL == 55 +#define OS_TMID_TASKMGR 54 +#elif OS_TIMQRYTOTAL == 56 +#define OS_TMID_TASKMGR 55 +#elif OS_TIMQRYTOTAL == 57 +#define OS_TMID_TASKMGR 56 +#elif OS_TIMQRYTOTAL == 58 +#define OS_TMID_TASKMGR 57 +#elif OS_TIMQRYTOTAL == 59 +#define OS_TMID_TASKMGR 58 +#elif OS_TIMQRYTOTAL == 60 +#define OS_TMID_TASKMGR 59 +#elif OS_TIMQRYTOTAL == 61 +#define OS_TMID_TASKMGR 60 +#elif OS_TIMQRYTOTAL == 62 +#define OS_TMID_TASKMGR 61 +#elif OS_TIMQRYTOTAL == 63 +#define OS_TMID_TASKMGR 62 +#elif OS_TIMQRYTOTAL == 64 +#define OS_TMID_TASKMGR 63 +#elif OS_TIMQRYTOTAL == 65 +#define OS_TMID_TASKMGR 64 +#elif OS_TIMQRYTOTAL == 66 +#define OS_TMID_TASKMGR 65 +#endif +#endif + +/*------------------------------------------------------------------------------ + * Time Sharing */ + +#if SYSCFG_TIMESHARINGMODE == 0 +#define OS_TIMESHARING SYSCFG_GLOBALTIMESHARING +#define OS_TIMESHARING_MAX SYSCFG_GLOBALTIMESHARING +#define OS_TIMESHARING_MIN SYSCFG_GLOBALTIMESHARING +#elif SYSCFG_TIMESHARINGMODE == 1 +#define OS_TIMESHARING SYSCFG_ALGORITHMTIMESHARING(s_task_current->pri) +#define OS_TIMESHARING_MAX SYSCFG_ALGORITHMTIMESHARING(0) +#define OS_TIMESHARING_MIN SYSCFG_ALGORITHMTIMESHARING(SYSCFG_TASKPRIORITY - 1) +#elif SYSCFG_TIMESHARINGMODE == 2 +#define OS_TIMESHARING s_time_sharing[s_task_current->pri] +#define OS_TIMESHARING_MAX SYSCFG_TIMESHARING_MAX +#define OS_TIMESHARING_MIN 1 +#endif +#if OS_TIMESHARING_MIN == 0 || OS_TIMESHARING_MAX > 65535 +#error 时间片定义非法! +#endif + +/*------------------------------------------------------------------------------ + * Taskmgr - LEN */ + +#if OS_TASKTOTAL <= 999 +#define OS_TASKMGR_LEN_TID 6 +#elif OS_TASKTOTAL <= 9999 +#define OS_TASKMGR_LEN_TID 7 +#elif OS_TASKTOTAL <= 99999 +#define OS_TASKMGR_LEN_TID 8 +#elif OS_TASKTOTAL <= 999999 +#define OS_TASKMGR_LEN_TID 9 +#endif + +#if MCUCFG_ISA == __ARM__ +#define OS_TASKMGR_LEN_RAM 15 +#else +#define OS_TASKMGR_LEN_RAM 13 +#endif + +#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__ +#define OS_TASKMGR_LEN_PSVFIFO (9 + 3 + (3 * 2 + 1)) /* (Head + Tail + Len) */ +#else +#define OS_TASKMGR_LEN_PSVFIFO 0 +#endif + +#if SYSCFG_TASKPC_MONITOR == __ENABLED__ +#define OS_TASKMGR_LEN_TASK_PC (9 + 3 + 8) /* (Head + Tail + Len) */ +#else +#define OS_TASKMGR_LEN_TASK_PC 0 +#endif + +#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__ +#define OS_TASKMGR_LEN_SYSTICK (9 + 5 + 7) /* (Head + Tail + Len) */ +#else +#define OS_TASKMGR_LEN_SYSTICK 0 +#endif + +#define OS_TASKMGR_LEN_ALARM (7 + 3 - 2 + 5 * 6) /* (Head + Tail - Back + Len * Line) */ +#define OS_TASKMGR_LEN_FAULT (7 + 3 - 2 + 5 * 8) /* (Head + Tail - Back + Len * Line) */ + +/*------------------------------------------------------------------------------ + * DEBUGBUFF - SIZE */ + +#define OS_DEBUGRECVBUFFSIZE (SYSCFG_TASKNAMELEN_MAX + 64) +#define OS_CMDLINESENDBUFFSIZE (SYSCFG_TASKNAMELEN_MAX + 64) +#define OS_TASKMGRSENDBUFFSIZE \ +( \ + ( \ + SYSCFG_TASKNAMELEN_MAX \ + + OS_TASKMGR_LEN_TID \ + + OS_TASKMGR_LEN_PRI \ + + OS_TASKMGR_LEN_STA \ + + OS_TASKMGR_LEN_CPU \ + + OS_TASKMGR_LEN_RAM \ + + 2 \ + ) * (OS_TASKTOTAL + 2) \ + + OS_TASKMGR_LEN_PSVFIFO \ + + OS_TASKMGR_LEN_TASK_PC \ + + OS_TASKMGR_LEN_SYSTICK \ + + OS_TASKMGR_LEN_ALARM \ + + OS_TASKMGR_LEN_FAULT \ + + (2 * 3) \ + + 1 \ +) + +/*------------------------------------------------------------------------------ + * typedef base */ + +typedef s_u8_t s_ecode_t; + +#if OS_TASKTOTAL + 1 < 256 +typedef s_u8_t s_tid_t; +#elif OS_TASKTOTAL + 1 < 65536 +typedef s_u16_t s_tid_t; +#elif OS_TASKTOTAL + 1 < 4294967296 +typedef s_u32_t s_tid_t; +#else +typedef s_u64_t s_tid_t; +#endif + +#if OS_TIMESHARING_MAX < 256 +typedef s_u8_t s_sharing_t; +#elif OS_TIMESHARING_MAX < 65536 +typedef s_u16_t s_sharing_t; +#else +#error 时间片溢出! +#endif + +typedef sDefBitsType(SYSCFG_DELAYBITS) s_delay_t; +typedef sDefBitsType(SYSCFG_TIMINTBITS) s_timint_t; +typedef sDefBitsType(SYSCFG_TIMQRYBITS) s_timqry_t; +typedef sDefBitsType(SYSCFG_SEMAPHOREBITS) s_semsize_t; + +/*------------------------------------------------------------------------------ + * typedef function and function pointer */ + +typedef s_bool_t s_boolvoid_tf(void); +typedef s_bool_t (_CODE_MEM_ *s_boolvoid_tfp)(void); +typedef void (_CODE_MEM_ *s_voidvoid_tfp)(void); + +/*------------------------------------------------------------------------------ + * typedef struct */ + +typedef struct +{ + sDefBitField(year); + sDefBitField(month); + sDefBitField(day); + sDefBitField(hour); + sDefBitField(minute); + sDefBitField(second); + sDefVoidBits(2); +}s_every_ts; + +typedef struct +{ + sDefBitField(overflow_msgqueue); + sDefBitField(overflow_taskqueue); + sDefBitField(timedout_saferuntime); + sDefBitField(outrange_taskpriority); + sDefBitField(realloc_taskstack); + sDefBitField(overflow_taskstack_future); + sDefVoidBits(2); +}s_alarm_ts; + +typedef struct +{ + sDefBitField(mallocfailed_msgnode); + sDefBitField(mallocfailed_tasknode); + sDefBitField(mallocfailed_taskstack); + sDefBitField(reallocfailed_taskstack); + sDefBitField(overflow_taskstack); + sDefBitField(failed_startuptask); + sDefBitField(error_recvmsg_int); + sDefBitField(overflow_pendsvfifo); +}s_fault_ts; + +typedef struct +{ + void _MALLOC_MEM_ *head; + void _MALLOC_MEM_ *move; + size_t size; +}s_thrmem_ts; +typedef s_thrmem_ts _OBJ_MEM_ *s_thrmem_tsp; + +typedef struct s_tasknode_ts +{ + mTaskNode_Head_ + s_tid_t tid; + s_u8_t oldpri; + m_stacksize_t stacksize; + struct s_tasknode_ts _MALLOC_MEM_ * _OBJ_MEM_ * handle; + s_voidvoid_tfp entry; + #if SYSCFG_DEBUGGING == __ENABLED__ + const char _CONST_MEM_ * name; + #endif + #if SYSCFG_SAFERUNTIME == __ENABLED__ + s_u16_t saferuntime; + #endif + s_u8_t _MALLOC_MEM_ *bsp; + s_u8_t create; + s_u8_t pri; + s_u8_t status; + s_u8_t blocktype; + void _OBJ_MEM_ *ptr; + #if SYSCFG_DEBUGGING == __ENABLED__ + s_u32_t usedtime[2]; + m_stacksize_t stacklen_max; + #endif + #if SYSCFG_SAFERUNTIME == __ENABLED__ + s_u32_t counter; + #endif + struct s_tasknode_ts _MALLOC_MEM_ *last; + struct s_tasknode_ts _MALLOC_MEM_ *next; + mTaskNode_Tail_ +}s_tasknode_ts; +typedef s_tasknode_ts _MALLOC_MEM_ *s_tasknode_tsp; + +typedef struct +{ + const mTaskNode_Head_ + s_tid_t tid; + const s_u8_t oldpri; + const m_stacksize_t stacksize; + s_tasknode_ts _MALLOC_MEM_ * _OBJ_MEM_ * const handle; + s_voidvoid_tfp const entry; + #if SYSCFG_DEBUGGING == __ENABLED__ + const char _CONST_MEM_ * const name; + #endif + #if SYSCFG_SAFERUNTIME == __ENABLED__ + const s_u16_t saferuntime; + #endif +}s_taskhand_ts; +typedef s_taskhand_ts _OBJ_MEM_ *s_taskhand_tsp; + +typedef struct +{ + const s_u8_t hookortask_autoreload; + void _CODE_MEM_ * const hookorhand; +}s_timinthand_ts; +typedef const s_timinthand_ts _CONST_MEM_ *s_timinthand_tsp; + +typedef struct +{ + const s_u8_t hookortask_autoreload; + void _CODE_MEM_ * const hookorhand; + s_boolvoid_tfp const event; +}s_timqryhand_ts; +typedef const s_timqryhand_ts _CONST_MEM_ *s_timqryhand_tsp; + +typedef struct /* 互斥信号量 */ +{ + volatile s_u8_t mutex; + s_tasknode_tsp node; + s_u8_t oldpri; +}s_mutex_ts; +typedef s_mutex_ts _OBJ_MEM_ *s_mutex_tsp; + +typedef struct /* 二值信号量 */ +{ + volatile s_bool_t binary; + s_tasknode_tsp node; +}s_binary_ts; +typedef s_binary_ts _OBJ_MEM_ *s_binary_tsp; + +typedef struct /* 计数信号量 */ +{ + volatile s_semsize_t counter; + const s_semsize_t maximum; + s_tasknode_tsp node; +}s_semaph_ts; +typedef s_semaph_ts _OBJ_MEM_ *s_semaph_tsp; + +typedef struct /* 飞信 */ +{ + volatile m_fetion_t fetion; + s_tasknode_tsp node; +}s_fetion_ts; +typedef s_fetion_ts _OBJ_MEM_ *s_fetion_tsp; + +typedef struct /* 消息邮箱 */ +{ + volatile s_bool_t gf; + s_tasknode_tsp node; + s_u8_t mail0; +}s_mailbox_ts; +typedef s_mailbox_ts _OBJ_MEM_ *s_mailbox_tsp; + +typedef struct /* 邮箱访问器 */ +{ + s_mailbox_tsp gm; + #if SYSCFG_MAILBOX_ACCESSMECHANISM == 1 + void *lm; + volatile s_bool_t lf; + #endif +}s_accessor_ts; +typedef s_accessor_ts _OBJ_MEM_ *s_accessor_tsp; + +typedef struct /* 邮箱访问器 for 中断 */ +{ + s_mailbox_tsp const gm; + void * const lm; + #if SYSCFG_MAILBOX_ACCESSMECHANISM == 1 + volatile s_bool_t lf; + #endif + const size_t size; +}si_accessor_ts; +typedef si_accessor_ts _OBJ_MEM_ *si_accessor_tsp; + +typedef struct s_msgnode_ts +{ + void *msg; + struct s_msgnode_ts _MALLOC_MEM_ *last; + struct s_msgnode_ts _MALLOC_MEM_ *next; +}s_msgnode_ts; +typedef s_msgnode_ts _MALLOC_MEM_ *s_msgnode_tsp; + +typedef struct +{ + size_t counter; + const s_u8_t type; + const s_u8_t mode; + const size_t len; + s_tasknode_tsp node; + volatile s_bool_t mutex; +}s_msgqueue_ts; +typedef s_msgqueue_ts _OBJ_MEM_ *s_msgqueue_tsp; + +typedef struct +{ + size_t counter; + const s_u8_t type; + const s_u8_t mode; + const size_t len; + s_tasknode_tsp node; + volatile s_bool_t mutex; + void * _OBJ_MEM_ * head; + void * _OBJ_MEM_ * tail; + void * _OBJ_MEM_ * const base; +}s_msgqueue_static_ts; +typedef s_msgqueue_static_ts _OBJ_MEM_ *s_msgqueue_static_tsp; + +typedef struct +{ + size_t counter; + const s_u8_t type; + const s_u8_t mode; + const size_t len; + s_tasknode_tsp node; + volatile s_bool_t mutex; + s_msgnode_tsp head; + s_msgnode_tsp tail; +}s_msgqueue_dynamic_ts; +typedef s_msgqueue_dynamic_ts _OBJ_MEM_ *s_msgqueue_dynamic_tsp; + +/* PendSV struct */ + +typedef struct +{ + const s_u8_t svid; + s_tasknode_tsp node; +}sp_task_ts; +typedef sp_task_ts _OBJ_MEM_ *sp_task_tsp; + +typedef struct +{ + const s_u8_t svid; + s_tasknode_tsp node; + const s_u8_t pri; +}sp_taskpri_ts; +typedef sp_taskpri_ts _OBJ_MEM_ *sp_taskpri_tsp; + +typedef struct +{ + const s_u8_t svid; + s_tasknode_tsp node; + const s_delay_t tick; +}sp_blocktime_ts; +typedef sp_blocktime_ts _OBJ_MEM_ *sp_blocktime_tsp; + +typedef struct +{ + const s_u8_t svid; + const s_u8_t tmid; + s_timint_t tick; +}sp_timint_ts; +typedef sp_timint_ts _OBJ_MEM_ *sp_timint_tsp; + +typedef struct +{ + const s_u8_t svid; + const s_u8_t tmid; + s_timqry_t tick; +}sp_timqry_ts; +typedef sp_timqry_ts _OBJ_MEM_ *sp_timqry_tsp; + +typedef struct +{ + const s_u8_t svid; + s_binary_tsp const bin; + const s_bool_t value; +}sp_binary_ts; +typedef sp_binary_ts _OBJ_MEM_ *sp_binary_tsp; + +typedef struct +{ + const s_u8_t svid; + s_semaph_tsp const sem; +}sp_semaph_ts; +typedef sp_semaph_ts _OBJ_MEM_ *sp_semaph_tsp; + +typedef struct +{ + const s_u8_t svid; + s_fetion_tsp const tbox; + m_fetion_t fetion; +}sp_fetion_ts; +typedef sp_fetion_ts _OBJ_MEM_ *sp_fetion_tsp; + +typedef struct +{ + const s_u8_t svid; + si_accessor_tsp const accessor; +}sp_accessor_ts; +typedef sp_accessor_ts _OBJ_MEM_ *sp_accessor_tsp; + +typedef struct +{ + const s_u8_t svid; + s_msgqueue_tsp const queue; + void * const msg; +}sp_msg_ts; +typedef sp_msg_ts _OBJ_MEM_ *sp_msg_tsp; + +typedef struct +{ + const s_u8_t svid; + void _OBJ_MEM_ * const group; + const char size; + m_group_t value; +}sp_group_ts; +typedef sp_group_ts _OBJ_MEM_ *sp_group_tsp; + +typedef struct +{ + const s_u8_t svid; + void * const gp; + void * const lp; + const size_t size; +}sp_gvar_ts; +typedef sp_gvar_ts _OBJ_MEM_ *sp_gvar_tsp; + +typedef struct +{ + const s_u8_t svid; + s_voidvoid_tfp const fp; +}sp_pendsvc_ts; +typedef sp_pendsvc_ts _OBJ_MEM_ *sp_pendsvc_tsp; + +typedef struct +{ + const s_u8_t svid; + s_bool_t * const sign; +}sp_sign_ts; +typedef sp_sign_ts _OBJ_MEM_ *sp_sign_tsp; + + + +#endif