From 55b779ecdc96f072ee37843076502f499033d2e9 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: Fri, 27 Dec 2024 09:46:31 +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_api.c | 128 +++++++ System/os_api.h | 471 +++++++++++++++++++++++++ System/os_base.h | 23 ++ System/os_debug.c | 113 ++++++ System/os_def.h | 136 ++++++++ System/os_handler.c | 806 +++++++++++++++++++++++++++++++++++++++++++ System/os_hook.h | 33 ++ System/os_link.h | 29 ++ System/os_main.c | 37 ++ System/os_redef.h | 713 ++++++++++++++++++++++++++++++++++++++ System/os_starter.c | 40 +++ System/os_sysidle.c | 39 +++ System/os_task.h | 27 ++ System/os_taskmgr.c | 564 ++++++++++++++++++++++++++++++ System/os_timing.c | 823 ++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 3982 insertions(+) create mode 100644 System/os_api.c create mode 100644 System/os_api.h create mode 100644 System/os_base.h create mode 100644 System/os_debug.c create mode 100644 System/os_def.h create mode 100644 System/os_handler.c create mode 100644 System/os_hook.h create mode 100644 System/os_link.h create mode 100644 System/os_main.c create mode 100644 System/os_redef.h create mode 100644 System/os_starter.c create mode 100644 System/os_sysidle.c create mode 100644 System/os_task.h create mode 100644 System/os_taskmgr.c create mode 100644 System/os_timing.c diff --git a/System/os_api.c b/System/os_api.c new file mode 100644 index 00000000..914ffa9b --- /dev/null +++ b/System/os_api.c @@ -0,0 +1,128 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_api.c + * @brief 内核服务公共函数 + * @details 在服务层临界区中,由内核服务调用。 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#include "os_var.h" + +#if SYSCFG_MCUCORE == 8051 +#pragma NOAREGS /* 相对寄存器访问 for C51 */ +#endif + +/** + \brief 任务优先级切换 + \details 如果该任务的优先级高于当前任务的优先级,立即切换任务。 + \param[in] htask 任务句柄 + \return 无 + \note 直接关联服务(非滴答中):切换任务、恢复指定任务并挂起自身任务、设置阻塞(时间)、清除阻塞(状态)。 + */ +void s_switch_taskpri(s_tasknode_tsp htask) +{ + if(htask->pri > s_task_current->pri){ + if(s_task_switch == OS_NULL){ + s_task_switch = htask; + s_sign_schedule = true; + } + else if(htask->pri > s_task_switch->pri){ + s_task_switch = htask; + s_sign_switch_prigroup = false; + } + else if(htask->pri == s_task_switch->pri){ + s_sign_switch_prigroup = true; + } + } +} + +/** + \brief 非空切换 + \details 当任务非空时,实行任务优先级切换。 + \param[in] htask 任务句柄 + \return 无 + \note 关联服务(非滴答中):给予/归还二值信号量、给予/归还计数信号量、发送飞信、发送邮件、发送消息。 + */ +void s_switch_notnull(s_tasknode_tsp htask) +{ + if(htask != OS_NULL){ + s_switch_taskpri(htask); + } +} + +/** + \brief 就绪切换 + \details 当任务状态为就绪时,实行任务优先级切换。 + \param[in] htask 任务句柄 + \return 无 + \note 关联服务(非滴答中):恢复任务。 + */ +void s_switch_ready(s_tasknode_tsp htask) +{ + if(htask->status == OS_STATUS_READY){ + s_switch_taskpri(htask); + } +} + +#if SYSCFG_TASKMSG == __ENABLED__ +/** + \brief 私信切换 + \details 当任务阻塞类型为接收私信阻塞时,实行任务优先级切换。 + \param[in] htask 任务句柄 + \return 无 + \note 关联服务(非滴答中):发送私信。 + */ +void s_switch_taskmsg(s_tasknode_tsp htask) +{ + if(htask->blocktype & OS_BLOCKED_TASKMSG){ + s_switch_taskpri(htask); + } +} +#endif + +/** + \brief 设置任务优先级 + \details 从任务队列中移除该任务并加入临时链表。 + \param[in] htask 任务句柄 + \return 无 + \note 关联服务:设置任务优先级、获取互斥信号量、归还互斥信号量。 + */ +void s_set_taskpri(s_tasknode_tsp htask) +{ + htask->last->next = htask->next; + htask->next->last = htask->last; + htask->next = htask->last = OS_NULL; + if(s_taskpri_tail != OS_NULL){ + s_taskpri_tail->next = htask; + htask->last = s_taskpri_tail; + } + s_taskpri_tail = htask; + s_sign_schedule_all = true; +} + +#if SYSCFG_GETRTC_INT == __ENABLED__ +/** + \brief 更新RTC副本 + \param 无 + \return 无 + */ +void s_update_rtccopy(void) +{ + s_sign_updatecopy = true; + #if SYSCFG_MCUCORE == 8051 + s_rtc_copy.yeah = s_rtc.yeah; + s_rtc_copy.year = s_rtc.year; + s_rtc_copy.month = s_rtc.month; + s_rtc_copy.date = s_rtc.date; + s_rtc_copy.hour = s_rtc.hour; + s_rtc_copy.minute = s_rtc.minute; + s_rtc_copy.second = s_rtc.second; + s_rtc_copy.day = s_rtc.day; + #else + s_rtc_copy = s_rtc; + #endif + s_sign_updatecopy = false; +} +#endif diff --git a/System/os_api.h b/System/os_api.h new file mode 100644 index 00000000..d4d99f53 --- /dev/null +++ b/System/os_api.h @@ -0,0 +1,471 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_api.h + * @brief 系统内核专用API + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#ifndef __OS_API_H +#define __OS_API_H + +void s_switch_taskpri(s_tasknode_tsp htask); +void s_switch_taskmsg(s_tasknode_tsp htask); +void s_switch_notnull(s_tasknode_tsp htask); +void s_switch_ready (s_tasknode_tsp htask); +void s_set_taskpri (s_tasknode_tsp htask); +void s_update_rtccopy(void); + + + +/* + * 引用.标准库函数 + */ + +#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_memcmp memcmp +#define s_strcpy strcpy +#define s_strcmp strcmp +#define s_strlen strlen + + + +/* + * 操作.定时中断/查询 + */ + +/** 启动定时中断任务 */ +#define sStartTask_TimInt(tmid) \ + sUSV_StartTask((s_taskhand_tsp)s_timint_handle[tmid]->hookorhand, OS_NULL, OS_STATUS_SUSPENDED) + +/** 启动定时查询任务 */ +#define sStartTask_TimQry(tmid) \ + sUSV_StartTask((s_taskhand_tsp)s_timqry_handle[tmid]->hookorhand, OS_NULL, OS_STATUS_SUSPENDED) + +/** 恢复定时中断任务 */ +#define sResumeTask_TimInt(tmid) \ + sTSV_ResumeTask(*((s_taskhand_tsp)s_timint_handle[tmid]->hookorhand)->dualhandle) + +/** 恢复定时查询任务 */ +#define sResumeTask_TimQry(tmid) \ + sTSV_ResumeTask(*((s_taskhand_tsp)s_timqry_handle[tmid]->hookorhand)->dualhandle) + +/** 调用定时中断钩子 */ +#define sCallHook_TimInt(tmid) \ + (*(s_voidvoid_tfp)s_timint_handle[tmid]->hookorhand)() + +/** 调用定时查询钩子 */ +#define sCallHook_TimQry(tmid) \ + (*(s_voidvoid_tfp)s_timqry_handle[tmid]->hookorhand)() + + + +/* + * 更新.全局变量副本 + */ + +#define sUpdateCopy(code) \ +do{ \ + s_sign_updatecopy = true; \ + code; \ + s_sign_updatecopy = false; \ +}while(false) + + + +/* + * 私信 - 创建信箱 + */ + +#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_kernellock_counter){ \ + su_kernel_unlock(); \ + } \ + 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_FIFOLoad; \ +}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{ \ + hmsg->msg = p; \ + hmsg->next = OS_NULL; \ + hmsg->last = ((sd_queue_tsp)hque)->tail; \ + if(((sd_queue_tsp)hque)->tail != OS_NULL){ \ + ((sd_queue_tsp)hque)->tail->next = hmsg; \ + } \ + ((sd_queue_tsp)hque)->tail = hmsg; \ + if(((sd_queue_tsp)hque)->head == OS_NULL){ \ + ((sd_queue_tsp)hque)->head = hmsg; \ + } \ + hque->counter++; \ +}while(false) + +/** 动态队列 - 接收消息 */ +#define sRecvMsg_Dynamic(p) \ +do{ \ + if(hque->mode == __QUE_LIFO__){ \ + hmsg = ((sd_queue_tsp)hque)->tail; \ + p = hmsg->msg; \ + hmsg = hmsg->last; \ + s_free(((sd_queue_tsp)hque)->tail); \ + ((sd_queue_tsp)hque)->tail = hmsg; \ + if(hmsg == OS_NULL){ \ + ((sd_queue_tsp)hque)->head = OS_NULL; \ + } \ + else{ \ + hmsg->next = OS_NULL; \ + } \ + } \ + else{ \ + hmsg = ((sd_queue_tsp)hque)->head; \ + p = hmsg->msg; \ + hmsg = hmsg->next; \ + s_free(((sd_queue_tsp)hque)->head); \ + ((sd_queue_tsp)hque)->head = hmsg; \ + if(hmsg == OS_NULL){ \ + ((sd_queue_tsp)hque)->tail = OS_NULL; \ + } \ + else{ \ + hmsg->last = OS_NULL; \ + } \ + } \ + hque->counter--; \ +}while(false) + +/** 静态队列 - 发送消息 */ +#define sSendMsg_Static(p) \ +do{ \ + if(((ss_queue_tsp)hque)->tail < ((ss_queue_tsp)hque)->base + hque->len - 1){ \ + ((ss_queue_tsp)hque)->tail++; \ + } \ + else{ \ + ((ss_queue_tsp)hque)->tail = ((ss_queue_tsp)hque)->base; \ + } \ + *((ss_queue_tsp)hque)->tail = p; \ + hque->counter++; \ +}while(false) + +/** 静态队列 - 接收消息 */ +#define sRecvMsg_Static(p) \ +do{ \ + if(hque->mode == __QUE_LIFO__){ \ + p = *((ss_queue_tsp)hque)->tail; \ + if(((ss_queue_tsp)hque)->tail > ((ss_queue_tsp)hque)->base){ \ + ((ss_queue_tsp)hque)->tail--; \ + } \ + else{ \ + ((ss_queue_tsp)hque)->tail = ((ss_queue_tsp)hque)->base + hque->len - 1; \ + } \ + } \ + else{ \ + p = *((ss_queue_tsp)hque)->head; \ + if(((ss_queue_tsp)hque)->head < ((ss_queue_tsp)hque)->base + hque->len - 1){ \ + ((ss_queue_tsp)hque)->head++; \ + } \ + else{ \ + ((ss_queue_tsp)hque)->head = ((ss_queue_tsp)hque)->base; \ + } \ + } \ + hque->counter--; \ +}while(false) + + + +#endif diff --git a/System/os_base.h b/System/os_base.h new file mode 100644 index 00000000..ce5b62c7 --- /dev/null +++ b/System/os_base.h @@ -0,0 +1,23 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_base.h + * @brief 基本数据类型定义 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#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 00000000..836a7cb9 --- /dev/null +++ b/System/os_debug.c @@ -0,0 +1,113 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_debug.c + * @brief DEBUG接口 + * @details DEBUG接口,串口发送和接收解析。 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#include "os_link.h" +#if SYSCFG_DEBUGGING == __ENABLED__ + +#if MCUCFG_ISA != __ARM__ +/** + \brief 字符串转整型 + \param[in] str 字符串指针 + \return 转换后的整型数据 + \note Keil C51/C251 标准库中的 atoi() 是非线程安全的,故额外定义此函数, + 专用于DEBUG接口的串口接收解析。 + */ +static int _atoi_(const char* str) +{ + if(str == OS_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 _atoi_ atoi +#endif + +/** + \brief 接收解析 + \details DEBUG接口,串口接收解析。 + \param 无 + \return 无 + */ +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(!s_memcmp(hptr, "taskmgr /s=", 11)){ + mptr += 11; + s_memcpy(strtmp, mptr, tptr - mptr); + strtmp[tptr - mptr] = '\0'; + temp = _atoi_(strtmp); + if(temp >= 50 && temp <= 5000){ + mSysIRQ_Disable; + s_timqry_handle[OS_TMID_TASKMGR]->reload = (1000UL * temp) / SYSCFG_SYSTICKCYCLE; + mSysIRQ_Enable; + } + } + } +} + +uCreateTask_TimInt +( + OS_TMID_DEBUGGER, false, + Debugger, SYSCFG_TASKPRIORITY - 2, 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 00000000..ee92559f --- /dev/null +++ b/System/os_def.h @@ -0,0 +1,136 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_def.h + * @brief 初始宏定义 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#ifndef __OS_DEF_H +#define __OS_DEF_H + +#define OS_NULL 0 +#define false 0 +#define true 1 + +/* + * CONFIG VALUE + */ + +#define __DISABLED__ 0 +#define __ENABLED__ 1 +#define __MSP__ 0 /*!< 任务栈模式:MSP模式 .. */ +#define __PSP__ 1 /*!< 任务栈模式:PSP模式 .. */ +#define __INTELLIGENT__ 0 /*!< 私信创建模式:智能创建 */ +#define __PERFORMANCE__ 1 /*!< 私信创建模式:性能创建 */ +#define __STATIC__ 0 /*!< 静态队列 ............. */ +#define __DYNAMIC__ 1 /*!< 动态队列 ............. */ +#define __QUE_FIFO__ 0 /*!< 先入先出队列 ......... */ +#define __QUE_LIFO__ 1 /*!< 后入先出队列 ......... */ +#define __MCS_51__ 0 /*!< 指令集架构:MCS51 .... */ +#define __MCS_251__ 1 /*!< 指令集架构:MCS251 ... */ +#define __ARM__ 2 /*!< 指令集架构:ARM ...... */ +#define __COOPERATIVE__ 1 /*!< 协作式调度............ */ +#define __TIMESHARING__ 2 /*!< 时间片轮转调度........ */ + + + +/* + * 任务相关 + */ + +#define OS_TASKQUEUELEN_MAX 255 /*!< 任务队列最大长度 ......... */ + +/* 任务状态 */ +#define OS_STATUS_READY 0x00 /*!< 就绪/运行状态 ............ */ +#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,中断挂起服务_FIFO 系统专用ID) + */ + +#define OS_SVID_CLEARDELAY 0x00 +#define OS_SVID_SWITCHTASK 0x01 +#define OS_SVID_RESUMETASK 0x02 +#define OS_SVID_SUSPENDTASK 0x03 +#define OS_SVID_DELETETASK 0x04 +#define OS_SVID_SETTASKPRI 0x05 +#define OS_SVID_SETBLOCK 0x06 +#define OS_SVID_CLEARBLOCK 0x07 +#define OS_SVID_TIMINT 0x08 +#define OS_SVID_TIMQRY 0x09 +#define OS_SVID_BINARY 0x0A +#define OS_SVID_GIVESEM 0x0B +#define OS_SVID_SENDFETION 0x0C +#define OS_SVID_SENDMAIL 0x0D +#define OS_SVID_SENDMSG 0x0E +#define OS_SVID_GROUP 0x0F +#define OS_SVID_GVARWRITE 0x10 +#define OS_SVID_PENDSVC 0x11 +#define OS_SVID_SENDSIGN 0x12 +#define OS_SVID_END 0x13 + + + +/* + * 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 00000000..e3da0815 --- /dev/null +++ b/System/os_handler.c @@ -0,0 +1,806 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_handler.c + * @brief OS_SysTick_Handler and sPendSV_Handler + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#include "os_link.h" + +#if SYSCFG_DEBUGGING == __ENABLED__ +static s_u32_t usedtime[2] = {0}; +#endif +static s_u8_t _SYS_MEM_ task_queue_len = 0; +static s_tasknode_tsp _SYS_MEM_ task_node[3] = {OS_NULL}; +#define node_head task_node[0] /*!< 头节点 */ +#define node_midd task_node[1] /*!< 中间节点 */ +#define node_tail task_node[2] /*!< 尾节点 */ +#define node_last node_curr->last /*!< 上一节点 */ +#define node_next node_curr->next /*!< 下一节点 */ +#define move_forward node_curr = node_last /*!< 节点前移 */ +#define move_backward node_curr = node_next /*!< 节点后移 */ + +void OS_SysTick_Handler(void) MCUCFG_SYSTICK_ATTRIBUTE +{ + s_u8_t _SYS_REG_ i; + s_tasknode_tsp _SYS_REG_ node_curr; + #if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__ + static m_tick_t tick_temp; + #endif + + /* 清除中断标志位 */ + mSysTick_Clear; + + /* 系统滴答时间统计开始 */ + #if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__ + 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(s_sign_every.set){ + s_sign_every.set = false; + counter = 0; + } + else{ + if(counter < 1000000UL / SYSCFG_SYSTICKCYCLE - 1){ + counter++; + if(counter == 1000000UL / SYSCFG_SYSTICKCYCLE / 2){ + s_sign_every.halfsec = true; + } + } + else{ + counter = 0; + s_sign_every.halfsec = true; + s_sign_every.second = true; + if(s_rtc.second < 59) s_rtc.second++; + else{ + s_rtc.second = 0; + s_sign_every.minute = true; + if(s_rtc.minute < 59) s_rtc.minute++; + else{ + s_rtc.minute = 0; + s_sign_every.hour = true; + if(s_rtc.hour < 23) s_rtc.hour++; + else{ + s_rtc.hour = 0; + s_sign_every.day = true; + if(s_rtc.day < 7) s_rtc.day++; + else s_rtc.day = 1; + if(s_rtc.date < (s_rtc.month == 2 ? s_month2day : s_month0day[s_rtc.month])) s_rtc.date++; + else{ + s_rtc.date = 1; + s_sign_every.month = true; + if(s_rtc.month < 12) s_rtc.month++; + else{ + s_rtc.month = 1; + s_sign_every.year = true; + if(s_rtc.year < 99) s_rtc.year++; + else{ + s_rtc.year = 0; + s_rtc.yeah++; + } + } + } + } + } + } + #if SYSCFG_GETRTC_INT == __ENABLED__ + s_update_rtccopy(); + #endif + } + } + } + #endif + + /* 运行时间统计 */ + #if SYSCFG_RUNTIME_COUNT == __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; + if(s_runtime.second < 59) s_runtime.second++; + else{ + s_runtime.second = 0; + if(s_runtime.minute < 59) s_runtime.minute++; + else{ + s_runtime.minute = 0; + if(s_runtime.hour < 23) s_runtime.hour++; + else{ + s_runtime.hour = 0; + s_runtime.day++; + } + } + } + } + } + #endif + + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_sign_debug_send){ + s_sign_debug_send = false; + tTimQry_ms(OS_TMID_DEBUGHOOK, 30); + } + if(s_sign_debug_recv){ + s_sign_debug_recv = false; + tTimInt_ms(OS_TMID_DEBUGGER, 15); + } + #endif + + /* 滴答钩子 */ + #if SYSCFG_TICKHOOK == __ENABLED__ + tick_hook(); + #endif + + /* 定时中断 */ + #if OS_TIMINTTOTAL + i = OS_TIMINTTOTAL; + while(i--){ + if(s_timint_handle[i]->timer){ + s_timint_handle[i]->timer--; + if(!s_timint_handle[i]->timer){ + if(s_timint_handle[i]->autoreload){ + s_timint_handle[i]->timer = s_timint_handle[i]->reload; + } + if(s_timint_handle[i]->hookortask){ + sResumeTask_TimInt(i); + } + else{ + sCallHook_TimInt(i); + } + } + } + } + #endif + + /* 定时查询 */ + #if OS_TIMQRYTOTAL + i = OS_TIMQRYTOTAL; + while(i--){ + if(s_timqry_handle[i]->timer && s_timqry_handle[i]->timer < (s_timqry_t)~0){ + s_timqry_handle[i]->timer--; + } + if(!s_timqry_handle[i]->timer){ + if((*s_timqry_handle[i]->event)()){ + if(s_timqry_handle[i]->autoreload){ + s_timqry_handle[i]->timer = s_timqry_handle[i]->reload; + } + else{ + s_timqry_handle[i]->timer = ~0; + } + if(s_timqry_handle[i]->hookortask){ + sResumeTask_TimQry(i); + } + else{ + sCallHook_TimQry(i); + } + } + } + } + #endif + + /* 延时定时器 */ + i = task_queue_len - 1; + node_curr = node_head; + while(true){ + if(node_curr->status <= OS_STATUS_BLOCKED){ + if(node_curr->timer && node_curr->timer < (s_delay_t)~0){ + node_curr->timer--; + } + } + if(!--i) break; + move_backward; + } + + /* 时间片计数 */ + #if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + if(s_task_current->tc_counter < (s_sharing_t)~0){ + s_task_current->tc_counter++; + } + #endif + + /* 安全运行时 */ + #if SYSCFG_SAFERUNTIME == __ENABLED__ + if(s_task_current->pri && s_task_current->saferuntime){ + s_task_current->srt_counter++; + if(s_task_current->srt_counter > 1UL * s_task_current->saferuntime * OS_TIMESHARING(s_task_current)){ + 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 + + /* 定时调度(触发完整调度)*/ + s_sign_schedule_all = true; + s_sign_schedule = true; + if(!s_sign_schedule_forbid){ + mPendSV_Set; + } +} + +/* 移除节点(从任务队列中移除当前节点)*/ +#define node_remove \ +do{ \ + node_last->next = node_next; \ + node_next->last = node_last; \ + if(node_curr == node_head){ \ + node_head = node_next; \ + } \ + else if(node_curr == node_tail){ \ + node_tail = node_last; \ + } \ + 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) + +s_tasknode_tsp _SYS_MEM_ s_task_news = OS_NULL; +#if SYSCFG_DEBUGGING == __ENABLED__ +m_stacksize_t _SYS_MEM_ s_taskstacklen; +#endif + +#if SYSCFG_MCUCORE == 80251 +#pragma functions(static) +#endif +s_u8_t sPendSV_Handler(void) MCUCFG_C51USING +{ + /* 中断挂起服务_FIFO */ + #if MCUCFG_PENDSVFIFO_DEPTH > 0 + mPendSV_FIFOHandle; + #endif + + /* 中断挂起服务_FLAG */ + #if SYSCFG_PENDSVHOOK == __ENABLED__ + pendsv_hook(); + #endif + + /* 更新全局变量副本 */ + #if SYSCFG_GETRTC_INT == __ENABLED__ + if(s_sign_rtc){ + s_sign_rtc = false; + s_update_rtccopy(); + } + #endif + #if SYSCFG_COPYHOOK == __ENABLED__ + sUpdateCopy(copy_hook()); + #endif + + /* 每PendSV监控(假定入栈)*/ + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_task_current != OS_NULL){ + if(s_task_current->stacklen_max < s_taskstacklen){ + s_task_current->stacklen_max = s_taskstacklen; + if(s_task_current->stacksize < s_taskstacklen){ + s_alarm.overflow_taskstack_future = true; + } + } + } + #endif + + /* 任务调度 */ + if(s_sign_schedule_forbid) return 0; + if(s_sign_schedule){ + static s_u8_t _SYS_MEM_ insert_direction = 0; + s_tasknode_tsp _SYS_REG_ node_buff[3]; + #define node_curr node_buff[0] /*!< 当前节点 */ + #define node_news node_buff[1] /*!< 新加节点 */ + #define node_temp node_buff[2] /*!< 缓存节点 */ + m_bit_t sign_x = false; + #define sign_expired sign_x /*!< 到期信号(时间片已到期)*/ + #define sign_push sign_x /*!< 入栈信号 */ + #if SYSCFG_DEBUGGING == __ENABLED__ + m_tick_t _SYS_REG_ tick_counter; + #endif + s_sign_schedule = false; + + /* 启动任务 */ + if(s_task_starter != OS_NULL){ + if(task_queue_len < OS_TASKQUEUELEN_MAX){ + /* 静态创建 */ + if(*s_task_starter->dualhandle != OS_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 = OS_NULL; + node_news = (s_tasknode_tsp)s_malloc(sizeof(s_tasknode_ts)); + if(node_news != OS_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 = OS_NULL; + node_news->bsp = (s_u8_t _MALLOC_MEM_ *)s_malloc(node_news->stacksize); + if(node_news->bsp != OS_NULL){ + mTaskStack_INIT; + node_news->tid = s_task_starter->tid; + node_news->oldpri = s_task_starter->oldpri; + node_news->dualhandle = s_task_starter->dualhandle; + *node_news->dualhandle = 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 + } + 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->status = s_task_status0; + node_news->blocktype = 0; + node_news->timer = 0; + node_news->handle = OS_NULL; + #if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + node_news->tc_counter = 0; + #endif + #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->srt_counter = 0; + #endif + /* 新任务加入任务队列 */ + if(!task_queue_len){ + node_head = node_midd = node_tail = node_news->last = node_news->next = node_news; + } + else{ + node_curr = 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{ + 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 = OS_NULL; + if(s_sign_return){ + if(node_news == u_taskhandle_Sysidle){ + s_sign_return = false; + node_news = u_taskhandle_Starter; + goto __NEWTASK_PREPROCESS; /*!< 首次任务调度 -> 新任务预处理 */ + } + else{ + return 0; + } + } + else if(!s_sign_schedule_all){ + s_switch_ready(node_news); + s_sign_schedule = false; + } + } + + /* + * 任务优先级调整 + * 如果任务优先级发生改变,执行服务时已从任务队列中移除并加入到临时链表。 + * 在此,从临时链表中依次取出各任务,并根据任务优先级重新加入到任务队列。 + */ + if(s_taskpri_tail != OS_NULL){ + node_temp = s_taskpri_tail; + do{ + node_news = node_temp; + node_temp = node_temp->last; + node_curr = 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{ + insert_backward; + } + }while(node_temp != OS_NULL); + s_taskpri_tail = OS_NULL; + } + + /* 调度类型 */ + /* 1、完整调度:从任务队列头节点开始查找就绪 */ + if(s_sign_schedule_all){ + s_sign_schedule_all = false; + s_sign_switch_prigroup = false; + s_task_switch = OS_NULL; + node_curr = node_head; + #if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + node_temp = node_curr; + #endif + } + /* 2、立即切换:从切换任务或其优先级组首节点开始查找就绪 */ + else if(s_task_switch != OS_NULL){ + node_curr = s_task_switch; + #if SYSCFG_SAMEPRISCHEDULE == __COOPERATIVE__ + if(s_sign_switch_prigroup){ + s_sign_switch_prigroup = false; + while(node_last->pri == node_curr->pri){ + move_forward; + } + } + #elif SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + while(node_last->pri == node_curr->pri){ + move_forward; + } + node_temp = node_curr; + if(s_sign_switch_prigroup){ + s_sign_switch_prigroup = false; + } + else node_curr = s_task_switch; + #endif + s_task_switch = OS_NULL; + } + /* 3、立即返回:立即返回至当前任务继续运行 */ + #if SYSCFG_SAMEPRISCHEDULE == __COOPERATIVE__ + else if(s_task_current->status == OS_STATUS_READY){ + #elif SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + else if(s_task_current->status == OS_STATUS_READY && s_task_current->tc_counter < OS_TIMESHARING(s_task_current)){ + #endif + goto __TASKING_RETURN; + } + /* 4、当前调度:从当前任务或其优先级组首节点开始查找就绪 */ + else{ + node_curr = s_task_current; + #if SYSCFG_SAMEPRISCHEDULE == __COOPERATIVE__ + while(node_last->pri == node_curr->pri){ + move_forward; + } + #elif SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + node_temp = node_curr; + #endif + } + + /* 开始调度:更新任务状态并同步查找最高优先级的就绪任务 */ + while(true){ + switch(node_curr->status){ + /* 就绪状态 */ + case OS_STATUS_READY:{ + #if SYSCFG_SAMEPRISCHEDULE == __COOPERATIVE__ + if(true){ + goto __READY_NOW; + } + #elif SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + /* 就绪-时间片未到期 */ + if(node_curr->tc_counter < OS_TIMESHARING(node_curr)){ + goto __READY_NOW; + } + /* 就绪-时间片已到期(到期任务必为该优先级组首节点)*/ + else{ + sign_expired = true; + node_curr->tc_counter = 0; + node_news = node_curr; /* 缓存该任务 */ + goto __BACKWARD; + } + #endif + } + /* 阻塞状态 + 定时器为0 -> 变为就绪 + 超时阻塞: 阻塞条件已解除 -> 变为就绪 + 阻塞条件未解除 -> 节点后移 + 延时阻塞: -> 节点后移 + */ + case OS_STATUS_BLOCKED:{ + if(!node_curr->timer) goto __BECOME_READY; + else if(node_curr->blocktype != OS_BLOCKED_DELAY){ + switch(node_curr->blocktype & 0x0F){ + case 0x01: if( *(s_u8_t *)node_curr->handle) goto __BECOME_READY; break; + case 0x02: if( *(s_u16_t *)node_curr->handle) goto __BECOME_READY; break; + case 0x04: if( *(s_u32_t *)node_curr->handle) goto __BECOME_READY; break; + case 0x0F: if(!*(s_u8_t *)node_curr->handle) goto __BECOME_READY; break; + } + } + goto __BACKWARD; + } + /* 超时状态 */ + #if SYSCFG_SAFERUNTIME == __ENABLED__ + case OS_STATUS_OVERTIME:{ + if(!s_sign_timeout[node_curr->tid]) goto __BECOME_READY; + goto __BACKWARD; + } + #endif + /* 删除状态 */ + case OS_STATUS_DELETED:{ + node_remove; + #if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + if(node_temp == node_curr) node_temp = node_next; + #endif + if(node_curr->create){ + s_free(node_curr->bsp); + *node_curr->dualhandle = OS_NULL; + s_free(node_curr); + } + goto __BACKWARD; + } + /* 其它状态 */ + default:{ + goto __BACKWARD; + } + } /* 变为就绪 */ + __BECOME_READY:{ + node_curr->status = OS_STATUS_READY; + #if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + node_curr->tc_counter = 0; + #endif + } /* 已经就绪 */ + __READY_NOW:{ + node_news = node_curr; + break; + } /* 节点后移 */ + __BACKWARD:{ + #if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + if(node_curr->pri != node_next->pri){ + if(sign_expired) break; /* 在该优先级组中,未能找到时间片未到期的就绪任务,继续已到期的就绪任务(已缓存至 node_news)*/ + node_temp = node_next; /* 缓存下一优先级组首节点 */ + } + #endif + move_backward; + } + } + + if(true){ + /* 新任务仍为当前任务 -> 返回 */ + if(node_news == s_task_current){ + goto __TASKING_RETURN; + } + /* 新任务轮转至其优先级组首节点 */ + #if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + else if(node_news != node_temp){ + node_curr = node_news; + while(node_curr->pri == node_next->pri){ + move_backward; + } + if(node_temp == node_head){ + node_head = node_news; + } + else if(node_curr == node_tail){ + node_tail = node_news->last; + } + node_temp->last->next = node_news; + node_news->last->next = node_next; + node_next->last = node_news->last; + node_news->last = node_temp->last; + node_temp->last = node_curr; + node_next = node_temp; + } + #endif + } + + /* 当前任务后处理 */ + if(true){ + #if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + sign_push = false; + #endif + if(s_task_current->status < OS_STATUS_STOPPED){ + /* 入栈监控 */ + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_task_current->stacksize < s_taskstacklen){ + #if MCUCFG_TASKSTACK_REALLOC == __ENABLED__ + if(s_task_current->create){ + s_task_current->stacksize = s_taskstacklen + MCUCFG_TASKSTACKREALLOC_INC; + s_free(s_task_current->bsp); + s_task_current->bsp = OS_NULL; + s_task_current->bsp = (s_u8_t _MALLOC_MEM_ *)s_malloc(s_task_current->stacksize); + if(s_task_current->bsp != OS_NULL){ + sign_push = 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{ + sign_push = true; + } + #else + sign_push = true; + #endif + } + } + + /* 新任务预处理 */ + __NEWTASK_PREPROCESS:{ + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_sign_taskmgr) tick_counter = mSysTick_Counter; + #endif + } + + /* 当前任务入栈 */ + if(sign_push){ + #if SYSCFG_SAFERUNTIME == __ENABLED__ + if(s_task_current->pri > node_news->pri){ + s_task_current->srt_counter = 0; + } + #endif + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_sign_taskmgr) mUsedTime_END; + #endif + mUserReg_CSave; + } + + /* 新任务出栈 */ + if(true){ + if(node_news->blocktype != OS_BLOCKED_DELAY){ + mSysIRQ_Disable; + } + #if SYSCFG_DEBUGGING == __ENABLED__ + if(s_sign_taskmgr) mUsedTime_INIT; + #endif + mUserReg_CRes; + s_task_news = node_news; + } + + if(sign_push) return 2; + else return 1; + } + + __TASKING_RETURN:{ + if(s_task_current->blocktype != OS_BLOCKED_DELAY){ + mSysIRQ_Disable; + } + return 0; + } +} diff --git a/System/os_hook.h b/System/os_hook.h new file mode 100644 index 00000000..53e50d71 --- /dev/null +++ b/System/os_hook.h @@ -0,0 +1,33 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_hook.h + * @brief 系统钩子函数声明 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#ifndef __OS_HOOK_H +#define __OS_HOOK_H + +/* 初始化钩子 */ +void init_hook(void); + +/* 启动钩子 */ +void start_hook(void); + +/* 空闲钩子 */ +void idle_hook(void); + +/* 滴答钩子 */ +void tick_hook(void); + +/* 挂起服务钩子 */ +void pendsv_hook(void); + +/* 副本钩子 */ +void copy_hook(void); + + + +#endif diff --git a/System/os_link.h b/System/os_link.h new file mode 100644 index 00000000..635bfdab --- /dev/null +++ b/System/os_link.h @@ -0,0 +1,29 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_link.h + * @brief 系统链接头文件 + * @details 用户的各个c文件中应包含此文件。 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#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_fifo.h" +#include "sv_int_pend_flag.h" +#include "ur_api.h" +#include "ur_eapi.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 00000000..d7f15667 --- /dev/null +++ b/System/os_main.c @@ -0,0 +1,37 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_main.c + * @brief 主函数 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#include "os_link.h" + +/** + \brief 主函数 + \param 无 + \return 无 + \note CosyOS 的主函数是系统托管的,如非必要不建议用户擅自调整及修改。 + 可在 init_hook 中进行前期的初始化工作,而后在 start_hook 中 + 启动用户任务。 + */ +int main(void) +{ + void s_init_timing(void); + #if SYSCFG_SAFERUNTIME == __ENABLED__ + s_tid_t i; + for(i = 0; i < OS_TASKTOTAL + 1; i++){ + s_sign_timeout[i] = 0; + } + #endif + #if OS_TIMINTTOTAL || OS_TIMQRYTOTAL + s_init_timing(); + #endif + init_hook(); + mSys_INIT; + uStartTask(Starter, OS_STATUS_READY); + uStartTask(Sysidle, OS_STATUS_READY); + while(true); +} diff --git a/System/os_redef.h b/System/os_redef.h new file mode 100644 index 00000000..93d180b1 --- /dev/null +++ b/System/os_redef.h @@ -0,0 +1,713 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_redef.h + * @brief 系统重定义 + * @details 基于 os_def.h、os_base.h、syscfg.h、mcucfg_x.h、port_x.h 等文件 + 中的定义而再次定义,包括宏定义和类型定义。 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#ifndef __OS_REDEF_H +#define __OS_REDEF_H + +/*------------------------------------------------------------------------------ + * SYSAPI */ + +#define sDefStr(s) sDefStr_0(s) +#define sDefStr_0(s) #s + +#define sCat2Str(s1, s2) sCat2Str_0(s1, s2) +#define sCat2Str_0(s1, s2) s1##s2 + +#define sCat3Str(s1, s2, s3) sCat3Str_0(s1, s2, s3) +#define sCat3Str_0(s1, s2, s3) s1##s2##s3 + +#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 + +/*------------------------------------------------------------------------------ + * INCLUDE */ + +#include +#include "..\Config\syscfg.h" +#include SYSCFG_STANDARDHEAD +#include sDefStr(sCat2Str(..\Port\port_, 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(定时器ID)*/ + +#define OS_TMID_DEBUGGER SYSCFG_USERTIMINTTOTAL /*!< TMID of Debugger */ +#define OS_TMID_DEBUGHOOK SYSCFG_USERTIMQRYTOTAL /*!< TMID of debug_hook */ +/** TMID of Taskmgr */ +#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(htask) SYSCFG_GLOBALTIMESHARING +#define OS_TIMESHARING_MAX SYSCFG_GLOBALTIMESHARING +#define OS_TIMESHARING_MIN SYSCFG_GLOBALTIMESHARING +#elif SYSCFG_TIMESHARINGMODE == 1 +#define OS_TIMESHARING(htask) SYSCFG_ALGORITHMTIMESHARING(htask->pri) +#define OS_TIMESHARING_MAX SYSCFG_ALGORITHMTIMESHARING(0) +#define OS_TIMESHARING_MIN SYSCFG_ALGORITHMTIMESHARING(SYSCFG_TASKPRIORITY - 1) +#elif SYSCFG_TIMESHARINGMODE == 2 +#define OS_TIMESHARING(htask) s_time_sharing[htask->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 + +#define OS_TASKMGR_LEN_LINE \ +( \ + SYSCFG_TASKNAMELEN_MAX \ + + OS_TASKMGR_LEN_TID + OS_TASKMGR_LEN_PRI + OS_TASKMGR_LEN_STA \ + + OS_TASKMGR_LEN_CPU + OS_TASKMGR_LEN_RAM \ +) + +/*------------------------------------------------------------------------------ + * DEBUGBUFF - SIZE */ + +#define OS_DEBUGRECVBUFFSIZE (SYSCFG_TASKNAMELEN_MAX + 64) /*!< size of DEBUG 接收缓存 */ +#define OS_CMDLINESENDBUFFSIZE (SYSCFG_TASKNAMELEN_MAX + 64) /*!< size of 命令行 发送缓存 */ +#define OS_TASKMGRSENDBUFFSIZE \ +( \ + (OS_TASKMGR_LEN_LINE + 2) * (OS_TASKTOTAL + 7 + SYSCFG_RTC_SHOW) + 2 * 2 + 1 \ +) /*!< size of Taskmgr 发送缓存 */ + +/*------------------------------------------------------------------------------ + * typedef base */ + +typedef s_u8_t s_ecode_t; /*!< 错误码类型 */ + +#if OS_TASKTOTAL + 1 < 256 +typedef s_u8_t s_tid_t; /*!< 任务ID类型 */ +#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 sCat3Str(s_u, SYSCFG_DELAYBITS, _t) s_delay_t; /*!< 延时定时器类型 */ +typedef sCat3Str(s_u, SYSCFG_TIMINTBITS, _t) s_timint_t; /*!< 定时中断定时器类型 */ +typedef sCat3Str(s_u, SYSCFG_TIMQRYBITS, _t) s_timqry_t; /*!< 定时查询定时器类型 */ +typedef sCat3Str(s_u, SYSCFG_SEMAPHOREBITS, _t) s_semsize_t; /*!< 计数信号量类型 */ + +/*------------------------------------------------------------------------------ + * typedef function and function pointer */ + +typedef s_bool_t s_boolvoid_tf(void); /*!< Keil C51 专用 */ +typedef s_bool_t (_CODE_MEM_ *s_boolvoid_tfp)(void); +typedef void (_CODE_MEM_ *s_voidvoid_tfp)(void); + +/*------------------------------------------------------------------------------ + * typedef struct */ + +/** + \brief 运行时间 + */ +typedef struct +{ + s_u16_t day; /*!< 天 */ + s_u8_t hour; /*!< 时 */ + s_u8_t minute; /*!< 分 */ + s_u8_t second; /*!< 秒 */ +}s_runtime_ts; + +/** + \brief 软件RTC + */ +typedef struct +{ + s_u8_t yeah; /*!< 年高八位 */ + s_u8_t year; /*!< 年低八位 */ + s_u8_t month; /*!< 月 */ + s_u8_t date; /*!< 日 */ + s_u8_t hour; /*!< 时 [24时制] */ + s_u8_t minute; /*!< 分 */ + s_u8_t second; /*!< 秒 */ + s_u8_t day; /*!< 周 [1:周一,7:周日] */ +}s_rtc_ts; + +/** + \brief 软件RTC-每信号 + \details 典型的应用示例参见 tick_hook。 + */ +typedef struct +{ + sDefBitField(year); /*!< 每年 */ + sDefBitField(month); /*!< 每月 */ + sDefBitField(day); /*!< 每日 */ + sDefBitField(hour); /*!< 每时 */ + sDefBitField(minute); /*!< 每分 */ + sDefBitField(second); /*!< 每秒 */ + sDefBitField(halfsec); /*!< 每半秒 */ + sDefBitField(set); /*!< 设置时间 */ +}s_every_ts; + +/** + \brief 系统警告 + */ +typedef struct +{ + sDefBitField(overflow_msgqueue); /*!<【omq】:消息队列溢出 ....... */ + sDefBitField(overflow_taskqueue); /*!<【otq】:任务队列溢出 ....... */ + sDefBitField(timedout_saferuntime); /*!<【osr】:安全运行时超时 ..... */ + sDefBitField(outrange_taskpriority); /*!<【otp】:任务优先级超出范围 . */ + sDefBitField(realloc_taskstack); /*!<【rts】:任务栈重分配发生 ... */ + sDefBitField(overflow_taskstack_future); /*!<【ots】:未来的任务栈溢出 ... */ + sDefVoidBits(2); +}s_alarm_ts; + +/** + \brief 系统异常 + */ +typedef struct +{ + sDefBitField(mallocfailed_msgnode); /*!<【mmn】:消息节点内存分配失败 */ + sDefBitField(mallocfailed_tasknode); /*!<【mtn】:任务节点内存分配失败 */ + sDefBitField(mallocfailed_taskstack); /*!<【mts】:任务栈内存分配失败 . */ + sDefBitField(reallocfailed_taskstack); /*!<【rts】:任务栈内存重分配失败 */ + sDefBitField(overflow_taskstack); /*!<【ots】:任务栈溢出 ......... */ + sDefBitField(failed_startuptask); /*!<【fst】:启动任务失败 ....... */ + sDefBitField(error_recvmsg_int); /*!<【erm】:中断中接收消息错误 . */ + sDefBitField(overflow_pendsvfifo); /*!<【opd】:PendSV_FIFO溢出 .... */ +}s_fault_ts; + +/** + \brief 任务节点(控制块) + \details CosyOS 的 任务节点 即 任务控制块,包含了任务所需的全部关键信息。 + 任务静态创建时,任务节点为静态;任务动态创建时,任务节点为动态。 + */ +typedef struct s_tasknode_ts +{ + mTaskNode_Head_ /*!< MSP:stacklen,PSP:psp,MSP+PSP:psp */ + s_tid_t tid; /*!< 任务ID */ + s_u8_t oldpri; /*!< 任务创建时的优先级 */ + m_stacksize_t stacksize; /*!< 任务栈size */ + struct s_tasknode_ts _OBJ_MEM_ * _STATIC_MEM_ *dualhandle; /*!< 任务二重句柄:指向任务句柄的指针 */ + 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 _OBJ_MEM_ *bsp; /*!< base stack pointer,任务栈的起始地址 */ + s_u8_t create; /*!< 任务创建 [0:静态创建,1:动态创建未重分配,2:动态创建已重分配] */ + s_u8_t pri; /*!< 任务当前优先级 */ + s_u8_t status; /*!< 任务状态 */ + s_u8_t blocktype; /*!< 阻塞类型 */ + s_delay_t timer; /*!< 软件定时器(延时/超时计数)*/ + void _STATIC_MEM_ *handle; /*!< 内核对象句柄,仅指向静态对象 */ + #if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ + s_sharing_t tc_counter; /*!< 滴答周期计数器 */ + #endif + #if SYSCFG_DEBUGGING == __ENABLED__ + s_u32_t usedtime[2]; /*!< CPU 使用时间计数 */ + m_stacksize_t stacklen_max; /*!< 任务栈的实际占用在历史上的最大值 */ + #endif + #if SYSCFG_SAFERUNTIME == __ENABLED__ + s_u32_t srt_counter; /*!< 安全运行时计数器 */ + #endif + struct s_tasknode_ts _OBJ_MEM_ *last; /*!< 上一节点 */ + struct s_tasknode_ts _OBJ_MEM_ *next; /*!< 下一节点 */ + mTaskNode_Tail_ /*!< MCS51/251:mUserReg_C_,减栈:psp_top */ +}s_tasknode_ts; +typedef s_tasknode_ts _OBJ_MEM_ *s_tasknode_tsp; /*!< 任务句柄 */ + +/** + \brief 任务HAND(装载块) + \details 创建任务时,用来装载任务的关键参数。 + 1、当任务为动态创建时,会定义此结构体;在启动任务时,会动态的分配任务节点, + 再把任务HAND中的参数传入任务节点。 + 2、当任务为静态创建时,任务节点就是任务HAND,不会再额外定义此结构体。 + 注:有关结构体成员的相关说明参见任务节点。 + */ +typedef struct +{ + const mTaskNode_Head_ + s_tid_t tid; + const s_u8_t oldpri; + const m_stacksize_t stacksize; + s_tasknode_ts _OBJ_MEM_ * _STATIC_MEM_ * const dualhandle; + s_voidvoid_tfp 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 _STATIC_MEM_ *s_taskhand_tsp; /*!< 任务装载块句柄 */ + +/** + \brief 定时中断HAND(控制块) + \details 创建定时中断任务或钩子时,会定义此结构体。 + */ +typedef struct +{ + s_timint_t timer; /*!< 定时器 */ + s_timint_t reload; /*!< 重装载值 */ + s_bool_t autoreload; /*!< 是否自动重装载定时器?*/ + const s_bool_t hookortask; /*!< 该定时中断是钩子还是任务?[0:hook,1:task] */ + void _CODE_MEM_ * const hookorhand; /*!< 钩子函数指针或任务HAND指针 */ +}s_timinthand_ts; +typedef s_timinthand_ts _STATIC_MEM_ *s_timinthand_tsp; /*!< 定时中断句柄 */ + +/** + \brief 定时查询HAND(控制块) + \details 创建定时查询任务或钩子时,会定义此结构体。 + */ +typedef struct +{ + s_timqry_t timer; /*!< 定时器 */ + s_timqry_t reload; /*!< 重装载值 */ + s_bool_t autoreload; /*!< 是否自动重装载定时器?*/ + const s_bool_t hookortask; /*!< 该定时查询是钩子还是任务?[0:hook,1:task] */ + void _CODE_MEM_ * const hookorhand; /*!< 钩子函数指针或任务HAND指针 */ + s_boolvoid_tfp const event; /*!< 定时查询事件函数指针 */ +}s_timqryhand_ts; +typedef s_timqryhand_ts _STATIC_MEM_ *s_timqryhand_tsp; /*!< 定时查询句柄 */ + +/** + \brief 互斥信号量控制块 + \details 创建互斥信号量时,会定义此结构体。 + */ +typedef struct +{ + volatile s_u8_t mutex; + s_tasknode_tsp htask; + s_u8_t oldpri; +}s_mutex_ts; +typedef s_mutex_ts _STATIC_MEM_ *s_mutex_tsp; /*!< 互斥信号量句柄 */ + +/** + \brief 二值信号量控制块 + \details 创建二值信号量时,会定义此结构体。 + */ +typedef struct +{ + volatile s_bool_t binary; + s_tasknode_tsp htask; +}s_binary_ts; +typedef s_binary_ts _STATIC_MEM_ *s_binary_tsp; /*!< 二值信号量句柄 */ + +/** + \brief 计数信号量控制块 + \details 创建计数信号量时,会定义此结构体。 + */ +typedef struct +{ + volatile s_semsize_t counter; + const s_semsize_t maximum; + s_tasknode_tsp htask; +}s_semaph_ts; +typedef s_semaph_ts _STATIC_MEM_ *s_semaph_tsp; /*!< 计数信号量句柄 */ + +/** + \brief 信箱控制块 + \details 创建信箱时,会定义此结构体。 + */ +typedef struct +{ + volatile m_fetion_t fetion; + s_tasknode_tsp htask; +}s_tionbox_ts; +typedef s_tionbox_ts _STATIC_MEM_ *s_tionbox_tsp; /*!< 信箱句柄 */ + +/** + \brief 邮箱控制块 + \details 创建邮箱时,会定义此结构体。 + */ +typedef struct +{ + volatile s_bool_t flag; + void *mail; + s_tasknode_tsp htask; +}s_mailbox_ts; +typedef s_mailbox_ts _STATIC_MEM_ *s_mailbox_tsp; /*!< 邮箱句柄 */ + +/** + \brief 消息节点 + \details 动态队列之消息节点。 + */ +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; /*!< 消息句柄 */ + +/** + \brief 动态队列控制块 + \details 创建动态队列时,会定义此结构体。 + */ +typedef struct +{ + size_t counter; + const s_u8_t type; + const s_u8_t mode; + const size_t len; + s_tasknode_tsp htask; + volatile s_bool_t mutex; + s_msgnode_tsp head; + s_msgnode_tsp tail; +}sd_queue_ts; +typedef sd_queue_ts _STATIC_MEM_ *sd_queue_tsp; /*!< 动态队列句柄 */ + +/** + \brief 静态队列控制块 + \details 创建静态队列时,会定义此结构体。 + */ +typedef struct +{ + size_t counter; + const s_u8_t type; + const s_u8_t mode; + const size_t len; + s_tasknode_tsp htask; + volatile s_bool_t mutex; + void * _STATIC_MEM_ * head; + void * _STATIC_MEM_ * tail; + void * _STATIC_MEM_ * const base; +}ss_queue_ts; +typedef ss_queue_ts _STATIC_MEM_ *ss_queue_tsp; /*!< 静态队列句柄 */ + +/** + \brief 队列控制块 + \details 创建队列时,并不会定义此结构体;访问队列时,通过其队列句柄, + 即可访问动态队列控制块,也可访问静态队列控制块。 + */ +typedef struct +{ + size_t counter; /*!< 队列计数器:记录队列中消息的数量 */ + const s_u8_t type; /*!< 队列类型 [0:静态队列,1:动态队列] */ + const s_u8_t mode; /*!< 传输模式 [0:FIFO,1:LIFO] */ + const size_t len; /*!< 队列长度 */ + s_tasknode_tsp htask; /*!< 任务句柄 */ + volatile s_bool_t mutex; /*!< 队列互斥量 */ +}s_queue_ts; +typedef s_queue_ts _STATIC_MEM_ *s_queue_tsp; /*!< 队列句柄 */ + +/** + \brief 线程内存控制块 + \details 创建线程内存池时,会定义此结构体。 + */ +typedef struct +{ + void _MALLOC_MEM_ *head; + void _MALLOC_MEM_ *move; + size_t size; +}s_thrmem_ts; +typedef s_thrmem_ts _STATIC_MEM_ *s_thrmem_tsp; /*!< 线程内存句柄 */ + +/*------------------------------------------------------------------------------ + * 中断挂起服务_FIFO 结构体类型定义 */ + +typedef struct +{ + const s_u8_t svid; + s_tasknode_tsp htask; +}sp_task_ts; +typedef sp_task_ts _STATIC_MEM_ *sp_task_tsp; + +typedef struct +{ + const s_u8_t svid; + s_tasknode_tsp htask; + const s_u8_t pri; +}sp_taskpri_ts; +typedef sp_taskpri_ts _STATIC_MEM_ *sp_taskpri_tsp; + +typedef struct +{ + const s_u8_t svid; + s_tasknode_tsp htask; + const s_delay_t tick; +}sp_blocktime_ts; +typedef sp_blocktime_ts _STATIC_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 _STATIC_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 _STATIC_MEM_ *sp_timqry_tsp; + +typedef struct +{ + const s_u8_t svid; + s_binary_tsp const hbin; + const s_bool_t value; +}sp_binary_ts; +typedef sp_binary_ts _STATIC_MEM_ *sp_binary_tsp; + +typedef struct +{ + const s_u8_t svid; + s_semaph_tsp const hsem; +}sp_semaph_ts; +typedef sp_semaph_ts _STATIC_MEM_ *sp_semaph_tsp; + +typedef struct +{ + const s_u8_t svid; + s_tionbox_tsp const htbox; + m_fetion_t fetion; +}sp_tionbox_ts; +typedef sp_tionbox_ts _STATIC_MEM_ *sp_tionbox_tsp; + +typedef struct +{ + const s_u8_t svid; + s_mailbox_tsp const hmbox; + void *mail; +}sp_mailbox_ts; +typedef sp_mailbox_ts _STATIC_MEM_ *sp_mailbox_tsp; + +typedef struct +{ + const s_u8_t svid; + s_queue_tsp const hque; + void *msg; +}sp_msg_ts; +typedef sp_msg_ts _STATIC_MEM_ *sp_msg_tsp; + +typedef struct +{ + const s_u8_t svid; + void _STATIC_MEM_ * const hgrp; + const char size; + m_group_t value; +}sp_group_ts; +typedef sp_group_ts _STATIC_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 _STATIC_MEM_ *sp_gvar_tsp; + +typedef struct +{ + const s_u8_t svid; + s_voidvoid_tfp const fp; +}sp_pendsvc_ts; +typedef sp_pendsvc_ts _STATIC_MEM_ *sp_pendsvc_tsp; + +typedef struct +{ + const s_u8_t svid; + s_bool_t * const sign; +}sp_sign_ts; +typedef sp_sign_ts _STATIC_MEM_ *sp_sign_tsp; + + + +#endif diff --git a/System/os_starter.c b/System/os_starter.c new file mode 100644 index 00000000..7984fbfa --- /dev/null +++ b/System/os_starter.c @@ -0,0 +1,40 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_starter.c + * @brief 启动任务(Starter) + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#include "os_link.h" + +sCat2Str +( + SYSCFG_STARTERCREATE, + CreateTask(Starter, SYSCFG_TASKPRIORITY - 2, MCUCFG_STACKSIZE_STARTER, 0, 0) +) +{ + #if OS_TIMINTTOTAL || OS_TIMQRYTOTAL + s_u8_t i; + #if OS_TIMQRYTOTAL + i = OS_TIMQRYTOTAL; + while(i--){ + if(s_timqry_handle[i]->hookortask){ + sStartTask_TimQry(i); + } + } + #endif + #if OS_TIMINTTOTAL + i = OS_TIMINTTOTAL; + while(i--){ + if(s_timint_handle[i]->hookortask){ + sStartTask_TimInt(i); + } + } + #endif + #endif + start_hook(); + uDeleteTasking; + uEndTasking; +} diff --git a/System/os_sysidle.c b/System/os_sysidle.c new file mode 100644 index 00000000..03f3a210 --- /dev/null +++ b/System/os_sysidle.c @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_sysidle.c + * @brief 系统空闲任务(Sysidle) + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#include "os_link.h" + +uCreateTask(Sysidle, 0, MCUCFG_STACKSIZE_SYSIDLE, 0, 0) +{ + #if SYSCFG_SAFERUNTIME == __ENABLED__ + if(true){ + s_tid_t i; + for(i = 1; i < OS_TASKTOTAL + 1; i++){ + s_sign_timeout[i] = 0; + } + } + #endif + #if SYSCFG_SOFTRTC == __ENABLED__ + if(true){ + static s_u8_t _SYS_MEM_ year = 0xFF; + if(year != s_rtc.year){ + year = s_rtc.year; + s_month2day = year ? ((year & 3) ? 28 : 29) : ((s_rtc.yeah & 3) ? 28 : 29); + } + } + #endif + #if SYSCFG_IDLEHOOK == __ENABLED__ + idle_hook(); + #endif + #if SYSCFG_LOWPOWERMODE == __ENABLED__ + mSys_Idle; + #endif + OS_NOPx2; + uEndTasking; +} diff --git a/System/os_task.h b/System/os_task.h new file mode 100644 index 00000000..335fb666 --- /dev/null +++ b/System/os_task.h @@ -0,0 +1,27 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_task.h + * @brief 系统任务声明 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#ifndef __OS_TASK_H +#define __OS_TASK_H + +/* 任务管理器 */ +uExternTask(Taskmgr); + +/* 调试任务 */ +uExternTask(Debugger); + +/* 启动任务 */ +sCat2Str(SYSCFG_STARTERCREATE, ExternTask(Starter)); + +/* 系统空闲任务 */ +uExternTask(Sysidle); + + + +#endif diff --git a/System/os_taskmgr.c b/System/os_taskmgr.c new file mode 100644 index 00000000..5c148f0d --- /dev/null +++ b/System/os_taskmgr.c @@ -0,0 +1,564 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_taskmgr.c + * @brief 任务管理器(Taskmgr) + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#include "os_link.h" +#if SYSCFG_DEBUGGING == __ENABLED__ + +/** + \brief 字符串内存 + \details 字符串缓存 str[8] 的内存存储域。 + \note 对于 8051/251 来说,用户可自定义该内存,以寻求在性能和资源之间取得平衡。 + 该内存默认被定义为 _SYS_MEM_,即 DATA 存储区,以实现高性能。 + */ +#define _STR_MEM_ _SYS_MEM_ + +static char _STR_MEM_ str[8]; /*!< 字符串缓存 */ +static char _XDATA_MEM_ * _SYS_MEM_ mptr; /*!< 指向任务管理器发送缓存的可移动指针 */ + +/** + \brief 字符拷贝 + \param[in] c 字符 + \return 无 + */ +#define _chrcpy_(c) *mptr++ = c + +/** + \brief 空格拷贝 + \param[in] n 空格的数量 + \return 无 + */ +static void _spccpy_(s_u8_t n) +{ + do{ + *mptr++ = ' '; + }while(--n); +} + +/** + \brief 字符串拷贝 + \param[in] s 字符串指针 + \return 无 + */ +static void _strcpy_(const char *s) +{ + while(*s){ + *mptr++ = *s++; + } +} + +/** + \brief 字符串长度 + \param[in] s 字符串指针 + \return 字符串长度 + */ +static s_u8_t _strlen_(const char *s) +{ + s_u8_t i = 0; + while(*s++){ + i++; + } + return i; +} + +/** + \brief u8转字符串 + \param[in] var u8型数据 + \return 无 + */ +static void _u8str_(const s_u8_t var) +{ + char _STR_MEM_ *ptr = str; + if(var >= 100){ + *ptr++ = var / 100 + '0'; + goto Lable_2; + } + if(var >= 10){ + *ptr++ = var / 10 + '0'; + goto Lable_1; + } + else{ + *ptr++ = var /**/+ '0'; + goto Lable_0; + } + Lable_2: *ptr++ = (var % 100) / 10 + '0'; + Lable_1: *ptr++ = (var % 10) /**/+ '0'; + Lable_0: *ptr = '\0'; +} + +/** + \brief u16转字符串 + \param[in] var u16型数据 + \return 无 + */ +static void _u16str_(const s_u16_t var) +{ + char _STR_MEM_ *ptr = str; + if(var >= 10000){ + *ptr++ = var / 10000 + '0'; + goto Lable_4; + } + if(var >= 1000){ + *ptr++ = var / 1000 + '0'; + goto Lable_3; + } + if(var >= 100){ + *ptr++ = var / 100 + '0'; + goto Lable_2; + } + if(var >= 10){ + *ptr++ = var / 10 + '0'; + goto Lable_1; + } + else{ + *ptr++ = var /**/+ '0'; + goto Lable_0; + } + Lable_4: *ptr++ = (var % 10000) / 1000 + '0'; + Lable_3: *ptr++ = (var % 1000) / 100 + '0'; + Lable_2: *ptr++ = (var % 100) / 10 + '0'; + Lable_1: *ptr++ = (var % 10) /**/+ '0'; + Lable_0: *ptr = '\0'; +} + +/** + \brief u16长度 + \param[in] var u16型数据 + \return 长度 + */ +static s_u8_t _u16len_(const s_u16_t var) +{ + if(var >= 10000) return 5; + if(var >= 1000) return 4; + if(var >= 100) return 3; + if(var >= 10) return 2; + return 1; +} + +/** + \brief cpu使用率 + \param[in] num 分子(分母:10000) + \return 无 + */ +static void _used_ratio_(const s_u16_t num) +{ + s_u8_t i; + if(!num){ + str[0] = '0'; + str[1] = '\0'; + i = 2; + } + else{ + _u16str_(num); + i = _strlen_(str); + if(i > 2){ + str[i-0] = str[i-1]; + str[i-1] = str[i-2]; + str[i-2] = '.'; + str[i+1] = '\0'; + i += 2; + } + else{ + if(i == 1){ + str[2] = '0'; + str[3] = str[0]; + } + else{ + str[2] = str[0]; + str[3] = str[1]; + } + str[0] = '0'; + str[1] = '.'; + str[4] = '\0'; + i = 5; + } + } + _spccpy_((s_u8_t)(OS_TASKMGR_LEN_CPU - i)); + _strcpy_(str); + _chrcpy_('%'); +} + +#if SYSCFG_TASKPC_MONITOR == __ENABLED__ +/** + \brief u8转十六进制字符串 + \param[in] var u8型数据 + \return 无 + \note 用于输出任务PC,十六进制字母为大写。 + */ +static void _u8str16_(const s_u8_t var) +{ + str[0] = (var >> 4) + '0'; + str[1] = (var & 0x0F) + '0'; + if(str[0] > '9') str[0] += 0x07; + if(str[1] > '9') str[1] += 0x07; + *mptr++ = str[0]; + *mptr++ = str[1]; +} +#endif + +uCreateTask_TimQry +( + OS_TMID_TASKMGR, s_sign_taskmgr, true, + Taskmgr, SYSCFG_TASKPRIORITY - 1, MCUCFG_STACKSIZE_TASKMGR, 0, 0 +) +{ + static char _XDATA_MEM_ *p[2]; + s_u8_t n = OS_TASKMGR_LEN_LINE; + mptr = s_taskmgr_sendbuff; + /* Title1 */ + _strcpy_("\x43\x6F\x73\x79\x4F\x53\x2D\x49\x49\x20\xC8\xCE\xCE\xF1\xB9\xDC\xC0\xED\xC6\xF7"); + _spccpy_(OS_TASKMGR_LEN_LINE - OS_TASKMGR_LEN_CPU - OS_TASKMGR_LEN_RAM - 20); + p[0] = mptr; + _spccpy_(OS_TASKMGR_LEN_CPU + OS_TASKMGR_LEN_RAM); + _strcpy_("\r\n"); + /* Title2 */ + _strcpy_("\xC3\xFB\xB3\xC6"); + _spccpy_(SYSCFG_TASKNAMELEN_MAX - 4); + _spccpy_(OS_TASKMGR_LEN_TID - 3); + _strcpy_("TID"); + _spccpy_(OS_TASKMGR_LEN_PRI - 3); + _strcpy_("PRI"); + _spccpy_(OS_TASKMGR_LEN_STA - 4); + _strcpy_("\xD7\xB4\xCC\xAC"); + _spccpy_(OS_TASKMGR_LEN_CPU - 3); + _strcpy_("CPU"); + _spccpy_(OS_TASKMGR_LEN_RAM - 4); + _strcpy_("\xC4\xDA\xB4\xE6"); + _strcpy_("\r\n"); + /* - */ + do{ + _chrcpy_('-'); + }while(--n); + _strcpy_("\r\n"); + /* - */ + p[1] = mptr; + while(true){ + static s_timqry_t upspeed = (1000UL * SYSCFG_TASKMGRUPSPEED) / SYSCFG_SYSTICKCYCLE; + static s_tasknode_ts node_temp; + s_tasknode_tsp node_curr = u_taskhandle_Taskmgr; + s_u16_t numerator1 = 10000; + #if SYSCFG_TASKPC_MONITOR == __ENABLED__ + m_pc_t pc = s_pc; + #endif + mptr = p[1]; + while(true){ + s_u16_t numerator2; + mSysIRQ_Disable; + s_memcpy(&node_temp, node_curr, sizeof(s_tasknode_ts)); + node_curr->usedtime[0] = 0; + node_curr->usedtime[1] = 0; + mSysIRQ_Enable; + /* Name */ + _strcpy_(node_temp.name); + if(SYSCFG_TASKNAMELEN_MAX > _strlen_(node_temp.name)){ + _spccpy_((s_u8_t)(SYSCFG_TASKNAMELEN_MAX - _strlen_(node_temp.name))); + } + /* TID */ + _u8str_ (node_temp.tid); + _spccpy_((s_u8_t)(OS_TASKMGR_LEN_TID - _strlen_(str))); + _strcpy_(str); + /* PRI */ + _u8str_ (node_temp.pri); + _spccpy_((s_u8_t)(OS_TASKMGR_LEN_PRI - _strlen_(str))); + _strcpy_(str); + /* STA */ + _spccpy_(OS_TASKMGR_LEN_STA - 3); + if(node_temp.status == OS_STATUS_READY){ + _strcpy_("RDY"); + } + else if(node_temp.status == OS_STATUS_BLOCKED){ + node_temp.blocktype &= 0xF0; + switch(node_temp.blocktype){ + case OS_BLOCKED_DELAY: _strcpy_("DLY"); break; + case OS_BLOCKED_BINARY: _strcpy_("BIN"); break; + case OS_BLOCKED_MUTEX: _strcpy_("MUT"); break; + case OS_BLOCKED_SEMAPHORE: _strcpy_("SEM"); break; + case OS_BLOCKED_FLAGGROUP: _strcpy_("GRP"); break; + case OS_BLOCKED_TASKMSG: _strcpy_(" TM"); break; + case OS_BLOCKED_FETION: _strcpy_("FET"); break; + case OS_BLOCKED_MAIL: _strcpy_("MAL"); break; + case OS_BLOCKED_MSG: _strcpy_("MSG"); break; + } + } + else if(node_temp.status == OS_STATUS_OVERTIME){ + _strcpy_("OSR"); + } + else if(node_temp.status & OS_STATUS_SUSPENDED){ + _strcpy_("SPD"); + } + else if(node_temp.status == OS_STATUS_STOPPED_TSOF){ + _strcpy_("!OF"); + } + else if(node_temp.status == OS_STATUS_STOPPED_TSRF){ + _strcpy_("!RF"); + } + else{ + _strcpy_("!XX"); + } + /* CPU */ + numerator2 = ( + ( + (node_temp.usedtime[0] * 10000UL) + + (node_temp.usedtime[1] * 10000UL) / mSysTick_Cycle + ) / upspeed + ); + _used_ratio_(numerator2); + if(!node_temp.pri){ + numerator1 -= numerator2; + } + /* RAM */ + _spccpy_( + (s_u8_t)( + OS_TASKMGR_LEN_RAM - 4 + - _u16len_((s_u16_t)node_temp.stacklen_max) + - _u16len_((s_u16_t)node_temp.stacksize) + ) + ); + _u16str_(node_temp.stacklen_max); + _strcpy_(str); + _strcpy_("B/"); + switch(node_temp.create){ + case 0: _chrcpy_('s'); break; + case 1: _chrcpy_('m'); break; + case 2: _chrcpy_('r'); break; + } + _u16str_(node_temp.stacksize); + _strcpy_(str); + _chrcpy_('B'); + _strcpy_("\r\n"); + /* - */ + if(node_temp.next == u_taskhandle_Taskmgr){ + break; + } + node_curr = node_temp.next; + } + /* CPU-TOTAL */ + if(true){ + char _XDATA_MEM_ *p0 = mptr; + mptr = p[0]; + _used_ratio_(numerator1); + mptr = p0; + } + /* NULL Line */ + _strcpy_("\r\n"); + /* PSV_FIFO */ + _strcpy_("PSV_FIFO: "); + #if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__ + if(mPendSV_FIFO_DepthMAX > MCUCFG_PENDSVFIFO_DEPTH){ + s_fault.overflow_pendsvfifo = true; + } + _u16str_(mPendSV_FIFO_DepthMAX); + _strcpy_(str); + _strcpy_("/"); + _u16str_(MCUCFG_PENDSVFIFO_DEPTH); + _strcpy_(str); + _spccpy_( + (s_u8_t)( + OS_TASKMGR_LEN_LINE - 20 - 10 - 1 + - _u16len_((s_u16_t)mPendSV_FIFO_DepthMAX) + - _u16len_((s_u16_t)MCUCFG_PENDSVFIFO_DEPTH) + ) + ); + #else + _strcpy_("null"); + _spccpy_(OS_TASKMGR_LEN_LINE - 20 - 10 - 4); + #endif + _strcpy_("| "); + /* Task-PC */ + _strcpy_("\xC8\xCE\xCE\xF1pc\xD6\xB5: "); + #if SYSCFG_TASKPC_MONITOR == __ENABLED__ + #if MCUCFG_PCLEN > 2 + _u8str16_((s_u8_t)(pc >> 24)); + _u8str16_((s_u8_t)(pc >> 16)); + #endif + _u8str16_((s_u8_t)(pc >> 8)); + _u8str16_((s_u8_t)(pc)); + #else + _strcpy_("null"); + #endif + _strcpy_("\r\n"); + /* 运行时间 */ + _strcpy_("\xD4\xCB\xD0\xD0\xCA\xB1\xBC\xE4: "); + #if SYSCFG_RUNTIME_COUNT == __ENABLED__ + if(true){ + s_runtime_ts runtime; + mSysIRQ_Disable; + runtime = s_runtime; + mSysIRQ_Enable; + _u16str_(runtime.day); + _strcpy_(str); + _chrcpy_('-'); + if(runtime.hour < 10) _chrcpy_('0'); + _u8str_(runtime.hour); + _strcpy_(str); + _chrcpy_(':'); + if(runtime.minute < 10) _chrcpy_('0'); + _u8str_(runtime.minute); + _strcpy_(str); + _chrcpy_(':'); + if(runtime.second < 10) _chrcpy_('0'); + _u8str_(runtime.second); + _strcpy_(str); + _spccpy_((s_u8_t)(OS_TASKMGR_LEN_LINE - 20 - 10 - 9 - _u16len_(runtime.day))); + } + #else + _strcpy_("null"); + _spccpy_(OS_TASKMGR_LEN_LINE - 20 - 10 - 4); + #endif + _strcpy_("| "); + /* SysTick */ + _strcpy_("\xB5\xCE\xB4\xF0\xCA\xB1\xBC\xE4: "); + #if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__ + mSysIRQ_Disable; + if(s_tick_counter2){ + s_u32_t counter1 = s_tick_counter1; + s_u32_t counter2 = s_tick_counter2; + s_tick_counter1 = 0; + s_tick_counter2 = 0; + mSysIRQ_Enable; + counter2 = (counter1 * 100 * mSysTick_CLKMOD) / (SYSCFG_SYSCLK / 1000000UL) / counter2; + _u16str_((s_u16_t)(counter2 / 100)); + _strcpy_(str); + _chrcpy_('.'); + _u8str_((s_u8_t)((counter2 % 100) / 10)); + _strcpy_(str); + _u8str_((s_u8_t)(counter2 % 10)); + _strcpy_(str); + _strcpy_("us"); + } + else{ + mSysIRQ_Enable; + } + #else + _strcpy_("null"); + #endif + _strcpy_("\r\n"); + /* Alarm */ + _strcpy_("\xCF\xB5\xCD\xB3\xBE\xAF\xB8\xE6: "); + if(*(s_u8_t *)&s_alarm){ + if(s_alarm.overflow_msgqueue){ + _strcpy_("omq, "); + } + if(s_alarm.overflow_taskqueue){ + _strcpy_("otq, "); + } + if(s_alarm.timedout_saferuntime){ + _strcpy_("osr, "); + } + if(s_alarm.outrange_taskpriority){ + _strcpy_("otp, "); + } + if(s_alarm.realloc_taskstack){ + _strcpy_("rts, "); + } + if(s_alarm.overflow_taskstack_future){ + _strcpy_("ots, "); + } + mptr -= 2; + } + else{ + _strcpy_("\xCE\xDE"); + } + _strcpy_("\r\n"); + /* Fault */ + _strcpy_("\xCF\xB5\xCD\xB3\xD2\xEC\xB3\xA3: "); + if(*(s_u8_t *)&s_fault){ + if(s_fault.mallocfailed_msgnode){ + _strcpy_("mmn, "); + } + if(s_fault.mallocfailed_tasknode){ + _strcpy_("mtn, "); + } + if(s_fault.mallocfailed_taskstack){ + _strcpy_("mts, "); + } + if(s_fault.reallocfailed_taskstack){ + _strcpy_("rts, "); + } + if(s_fault.overflow_taskstack){ + _strcpy_("ots, "); + } + if(s_fault.failed_startuptask){ + _strcpy_("fst, "); + } + if(s_fault.error_recvmsg_int){ + _strcpy_("erm, "); + } + #if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__ + if(s_fault.overflow_pendsvfifo){ + _strcpy_("opd, "); + } + #endif + mptr -= 2; + } + else{ + _strcpy_("\xCE\xDE"); + } + _strcpy_("\r\n"); + /* 当前时间 */ + #if SYSCFG_RTC_SHOW == __ENABLED__ + if(true){ + s_rtc_ts rtc; + mSysIRQ_Disable; + rtc = s_rtc; + mSysIRQ_Enable; + _spccpy_(OS_TASKMGR_LEN_LINE - 24); + _u8str_(rtc.yeah); + _strcpy_(str); + if(rtc.year < 10) _chrcpy_('0'); + _u8str_(rtc.year); + _strcpy_(str); + _chrcpy_('.'); + if(rtc.month < 10) _chrcpy_('0'); + _u8str_(rtc.month); + _strcpy_(str); + _chrcpy_('.'); + if(rtc.date < 10) _chrcpy_('0'); + _u8str_(rtc.date); + _strcpy_(str); + _chrcpy_('-'); + if(rtc.hour < 10) _chrcpy_('0'); + _u8str_(rtc.hour); + _strcpy_(str); + _chrcpy_(':'); + if(rtc.minute < 10) _chrcpy_('0'); + _u8str_(rtc.minute); + _strcpy_(str); + _chrcpy_(':'); + if(rtc.second < 10) _chrcpy_('0'); + _u8str_(rtc.second); + _strcpy_(str); + _chrcpy_(' '); + _strcpy_("\xD6\xDC"); + switch(rtc.day){ + case 1: _strcpy_("\xD2\xBB"); break; + case 2: _strcpy_("\xB6\xFE"); break; + case 3: _strcpy_("\xC8\xFD"); break; + case 4: _strcpy_("\xCB\xC4"); break; + case 5: _strcpy_("\xCE\xE5"); break; + case 6: _strcpy_("\xC1\xF9"); break; + case 7: _strcpy_("\xC8\xD5"); break; + } + _strcpy_("\r\n"); + } + #endif + /* NULL Line */ + _strcpy_("\r\n"); + /* string tail */ + _chrcpy_('\0'); + /* - */ + mSysIRQ_Disable; + upspeed = s_timqry_handle[OS_TMID_TASKMGR]->reload; + s_debug_sendtype |= OS_DEBUG_SEND_TASKMGR; + s_task_current->status |= OS_STATUS_SUSPENDED; + su_kernel_unlock_psv(); + } + uEndTasking; +} + +#endif diff --git a/System/os_timing.c b/System/os_timing.c new file mode 100644 index 00000000..879687b1 --- /dev/null +++ b/System/os_timing.c @@ -0,0 +1,823 @@ +/**************************************************************************//** + * @item CosyOS-II Kernel + * @file os_timing.c + * @brief 初始化定时中断、定时查询 + * @author 迟凯峰 + * @version V3.3.0 + * @date 2024.12.25 + ******************************************************************************/ + +#include "os_var.h" + +#if OS_TIMINTTOTAL || OS_TIMQRYTOTAL + +#define __EXT_TIMINT(tmid) extern s_timinthand_ts _STATIC_MEM_ u_timinthand_##tmid; +#define __EXT_TIMQRY(tmid) extern s_timqryhand_ts _STATIC_MEM_ u_timqryhand_##tmid; +#define __INIT_TIMINT(tmid) s_timint_handle[tmid] = &u_timinthand_##tmid; +#define __INIT_TIMQRY(tmid) s_timqry_handle[tmid] = &u_timqryhand_##tmid; + +#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 + +#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 + +void s_init_timing(void) +{ + #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 + + #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_handle[OS_TMID_DEBUGHOOK]->timer + = s_timqry_handle[OS_TMID_DEBUGHOOK]->reload + = 0; + #endif + s_timqry_handle[OS_TMID_TASKMGR]->timer + = s_timqry_handle[OS_TMID_TASKMGR]->reload + = (1000UL * SYSCFG_TASKMGRUPSPEED) / SYSCFG_SYSTICKCYCLE; + #endif +} + +#endif