diff --git a/System/CosyOS.H b/System/CosyOS.H new file mode 100644 index 00000000..ad6425ba --- /dev/null +++ b/System/CosyOS.H @@ -0,0 +1,28 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file CosyOS.H + * @brief 系统链接头文件 + * @details 用户的各个c文件中应包含此文件。 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#ifndef __COSYOS_H +#define __COSYOS_H + +#include "os_var.h" +#include "os_api.h" +#include "sv_com.h" +#include "sv_create.h" +#include "sv_task.h" +#include "sv_tick.h" +#include "sv_int_loc.h" +#include "sv_int_pend.h" +#include "sv_int_pend_fifo.h" +#include "ur_api.h" +#include "ur_eapi.h" + + + +#endif diff --git a/System/os_api.h b/System/os_api.h new file mode 100644 index 00000000..afa2a7e5 --- /dev/null +++ b/System/os_api.h @@ -0,0 +1,313 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_api.h + * @brief 系统内核专用API + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#ifndef __OS_API_H +#define __OS_API_H + + +/* + * 引用.标准库函数 + */ + +#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_0(s_timint_handle[tmid]->hookorhand.hand, OS_STATUS_SUSPENDED) + +/** 启动定时查询任务 */ +#define sStartTask_TimQry(tmid) \ + sUSV_StartTask_0(s_timqry_handle[tmid]->hookorhand.hand, OS_STATUS_SUSPENDED) + +/** 恢复定时中断任务 */ +#define sResumeTask_TimInt(tmid) \ + sTSV_ResumeTask(*(s_timint_handle[tmid]->hookorhand.hand)->dualhandle) + +/** 恢复定时查询任务 */ +#define sResumeTask_TimQry(tmid) \ + sTSV_ResumeTask(*(s_timqry_handle[tmid]->hookorhand.hand)->dualhandle) + +/** 调用定时中断钩子 */ +#define sCallHook_TimInt(tmid) \ + (*s_timint_handle[tmid]->hookorhand.hook)() + +/** 调用定时查询钩子 */ +#define sCallHook_TimQry(tmid) \ + (*s_timqry_handle[tmid]->hookorhand.hook)() + + +/* + * 事件标志组 - 写标志位 + */ + +#define stWriteFlagBits_1(g, v, b0) \ + g.b0 = v + +#define stWriteFlagBits_2(g, v, b0, b1) \ + g.b0 = g.b1 = v + +#define stWriteFlagBits_3(g, v, b0, b1, b2) \ + g.b0 = g.b1 = g.b2 = v + +#define stWriteFlagBits_4(g, v, b0, b1, b2, b3) \ + g.b0 = g.b1 = g.b2 = g.b3 = v + +#define stWriteFlagBits_5(g, v, b0, b1, b2, b3, b4) \ + g.b0 = g.b1 = g.b2 = g.b3 = g.b4 = v + +#define stWriteFlagBits_6(g, v, b0, b1, b2, b3, b4, b5) \ + g.b0 = g.b1 = g.b2 = g.b3 = g.b4 = g.b5 = v + +#define stWriteFlagBits_7(g, v, b0, b1, b2, b3, b4, b5, b6) \ + g.b0 = g.b1 = g.b2 = g.b3 = g.b4 = g.b5 = g.b6 = v + +#define stWriteFlagBits_8(g, v, b0, b1, b2, b3, b4, b5, b6, b7) \ + g.b0 = g.b1 = g.b2 = g.b3 = g.b4 = g.b5 = g.b6 = g.b7 = v + +#define suWriteFlagBits_1(g, v, b0) \ +do{ \ + su_kernel_locks(); \ + stWriteFlagBits_1(g, v, b0); \ + su_kernel_unlocks(); \ +}while(false) + +#define suWriteFlagBits_2(g, v, b0, b1) \ +do{ \ + su_kernel_locks(); \ + stWriteFlagBits_2(g, v, b0, b1); \ + su_kernel_unlocks(); \ +}while(false) + +#define suWriteFlagBits_3(g, v, b0, b1, b2) \ +do{ \ + su_kernel_locks(); \ + stWriteFlagBits_3(g, v, b0, b1, b2); \ + su_kernel_unlocks(); \ +}while(false) + +#define suWriteFlagBits_4(g, v, b0, b1, b2, b3) \ +do{ \ + su_kernel_locks(); \ + stWriteFlagBits_4(g, v, b0, b1, b2, b3); \ + su_kernel_unlocks(); \ +}while(false) + +#define suWriteFlagBits_5(g, v, b0, b1, b2, b3, b4) \ +do{ \ + su_kernel_locks(); \ + stWriteFlagBits_5(g, v, b0, b1, b2, b3, b4); \ + su_kernel_unlocks(); \ +}while(false) + +#define suWriteFlagBits_6(g, v, b0, b1, b2, b3, b4, b5) \ +do{ \ + su_kernel_locks(); \ + stWriteFlagBits_6(g, v, b0, b1, b2, b3, b4, b5); \ + su_kernel_unlocks(); \ +}while(false) + +#define suWriteFlagBits_7(g, v, b0, b1, b2, b3, b4, b5, b6) \ +do{ \ + su_kernel_locks(); \ + stWriteFlagBits_7(g, v, b0, b1, b2, b3, b4, b5, b6); \ + su_kernel_unlocks(); \ +}while(false) + +#define suWriteFlagBits_8(g, v, b0, b1, b2, b3, b4, b5, b6, b7) \ +do{ \ + su_kernel_locks(); \ + stWriteFlagBits_8(g, v, b0, b1, b2, b3, b4, b5, b6, b7); \ + su_kernel_unlocks(); \ +}while(false) + +#define siWriteFlagBits_1(b0) \ + stWriteFlagBits_1(u_grp, true, b0); \ + siWriteFlagBits() + +#define siWriteFlagBits_2(b0, b1) \ + stWriteFlagBits_2(u_grp, true, b0, b1); \ + siWriteFlagBits() + +#define siWriteFlagBits_3(b0, b1, b2) \ + stWriteFlagBits_3(u_grp, true, b0, b1, b2); \ + siWriteFlagBits() + +#define siWriteFlagBits_4(b0, b1, b2, b3) \ + stWriteFlagBits_4(u_grp, true, b0, b1, b2, b3); \ + siWriteFlagBits() + +#define siWriteFlagBits_5(b0, b1, b2, b3, b4) \ + stWriteFlagBits_5(u_grp, true, b0, b1, b2, b3, b4); \ + siWriteFlagBits() + +#define siWriteFlagBits_6(b0, b1, b2, b3, b4, b5) \ + stWriteFlagBits_6(u_grp, true, b0, b1, b2, b3, b4, b5); \ + siWriteFlagBits() + +#define siWriteFlagBits_7(b0, b1, b2, b3, b4, b5, b6) \ + stWriteFlagBits_7(u_grp, true, b0, b1, b2, b3, b4, b5, b6); \ + siWriteFlagBits() + +#define siWriteFlagBits_8(b0, b1, b2, b3, b4, b5, b6, b7) \ + stWriteFlagBits_8(u_grp, true, b0, b1, b2, b3, b4, b5, b6, b7); \ + siWriteFlagBits() + +#define siWriteFlagBits() \ + u_psv.value = ( \ + sizeof(u_grp) == 1 ? *(s_u8_t *)&u_grp \ + : sizeof(u_grp) == 2 ? *(s_u16_t *)&u_grp \ + : sizeof(u_grp) == 4 ? *(s_u32_t *)&u_grp \ + : 0 \ + ); \ + } \ + mPendSV_FIFOLoad(); \ +}while(false) + + +/* + * 私信 - 创建信箱 + */ + +#define sTaskMsg_Init_1(g) \ +tm1##g = tm1_##g + +#define sTaskMsg_Init_2(g) \ +sTaskMsg_Init_1(g); \ +tm2##g = tm2_##g + +#define sTaskMsg_Init_3(g) \ +sTaskMsg_Init_2(g); \ +tm3##g = tm3_##g + +#define sTaskMsg_Init_4(g) \ +sTaskMsg_Init_3(g); \ +tm4##g = tm4_##g + +#define sTaskMsg_Init_5(g) \ +sTaskMsg_Init_4(g); \ +tm5##g = tm5_##g + +#define sTaskMsg_Init_6(g) \ +sTaskMsg_Init_5(g); \ +tm6##g = tm6_##g + +#define sTaskMsg_Init_7(g) \ +sTaskMsg_Init_6(g); \ +tm7##g = tm7_##g + +#define sTaskMsg_Init_8(g) \ +sTaskMsg_Init_7(g); \ +tm8##g = tm8_##g + +#define sTaskMsg_Init(n) \ +static volatile s_u8_t u_tmrf = 0; \ +if(s_taskmsg_sign){ \ + u_tmrf = 1; \ + sTaskMsg_Init_##n(_); \ + if(--s_taskmsg_sign){ \ + s_taskmsg_sign = 0; \ + su_kernel_unlocks(); \ + } \ + return; \ +} \ +else if(u_tmrf == 2){ \ + u_tmrf = 0; \ + sTaskMsg_Init_##n( ); \ + return; \ +} + +#define sCreateTaskMsg_0_1(m1) \ +(m1##__) \ +{ \ + static m1##_; \ + static m1 ; \ + sTaskMsg_Init(1); \ + do + +#define sCreateTaskMsg_0_2(m1, m2) \ +(m1##__, m2##__) \ +{ \ + static m1##_; static m2##_; \ + static m1 ; static m2 ; \ + sTaskMsg_Init(2); \ + do + +#define sCreateTaskMsg_0_3(m1, m2, m3) \ +(m1##__, m2##__, m3##__) \ +{ \ + static m1##_; static m2##_; static m3##_; \ + static m1 ; static m2 ; static m3 ; \ + sTaskMsg_Init(3); \ + do + +#define sCreateTaskMsg_0_4(m1, m2, m3, m4) \ +(m1##__, m2##__, m3##__, m4##__) \ +{ \ + static m1##_; static m2##_; static m3##_; static m4##_; \ + static m1 ; static m2 ; static m3 ; static m4 ; \ + sTaskMsg_Init(4); \ + do + +#define sCreateTaskMsg_0_5(m1, m2, m3, m4, m5) \ +(m1##__, m2##__, m3##__, m4##__, m5##__) \ +{ \ + static m1##_; static m2##_; static m3##_; static m4##_; static m5##_; \ + static m1 ; static m2 ; static m3 ; static m4 ; static m5 ; \ + sTaskMsg_Init(5); \ + do + +#define sCreateTaskMsg_0_6(m1, m2, m3, m4, m5, m6) \ +(m1##__, m2##__, m3##__, m4##__, m5##__, m6##__) \ +{ \ + static m1##_; static m2##_; static m3##_; static m4##_; static m5##_; static m6##_; \ + static m1 ; static m2 ; static m3 ; static m4 ; static m5 ; static m6 ; \ + sTaskMsg_Init(6); \ + do + +#define sCreateTaskMsg_0_7(m1, m2, m3, m4, m5, m6, m7) \ +(m1##__, m2##__, m3##__, m4##__, m5##__, m6##__, m7##__) \ +{ \ + static m1##_; static m2##_; static m3##_; static m4##_; static m5##_; static m6##_; static m7##_; \ + static m1 ; static m2 ; static m3 ; static m4 ; static m5 ; static m6 ; static m7 ; \ + sTaskMsg_Init(7); \ + do + +#define sCreateTaskMsg_0_8(m1, m2, m3, m4, m5, m6, m7, m8) \ +(m1##__, m2##__, m3##__, m4##__, m5##__, m6##__, m7##__, m8##__) \ +{ \ + static m1##_; static m2##_; static m3##_; static m4##_; static m5##_; static m6##_; static m7##_; static m8##_; \ + static m1 ; static m2 ; static m3 ; static m4 ; static m5 ; static m6 ; static m7 ; static m8 ; \ + sTaskMsg_Init(8); \ + do + +#define sCreateTaskMsg_1(m1) sCreateTaskMsg_0_1(m1) +#define sCreateTaskMsg_2(m1, m2) sCreateTaskMsg_0_2(m1, m2) +#define sCreateTaskMsg_3(m1, m2, m3) sCreateTaskMsg_0_3(m1, m2, m3) +#define sCreateTaskMsg_4(m1, m2, m3, m4) sCreateTaskMsg_0_4(m1, m2, m3, m4) +#define sCreateTaskMsg_5(m1, m2, m3, m4, m5) sCreateTaskMsg_0_5(m1, m2, m3, m4, m5) +#define sCreateTaskMsg_6(m1, m2, m3, m4, m5, m6) sCreateTaskMsg_0_6(m1, m2, m3, m4, m5, m6) +#define sCreateTaskMsg_7(m1, m2, m3, m4, m5, m6, m7) sCreateTaskMsg_0_7(m1, m2, m3, m4, m5, m6, m7) +#define sCreateTaskMsg_8(m1, m2, m3, m4, m5, m6, m7, m8) sCreateTaskMsg_0_8(m1, m2, m3, m4, m5, m6, m7, m8) + + +#endif diff --git a/System/os_base.h b/System/os_base.h new file mode 100644 index 00000000..4e987819 --- /dev/null +++ b/System/os_base.h @@ -0,0 +1,22 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_base.h + * @brief 基本数据类型定义 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#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_ecode_t; /*!< 错误码类型 */ + + +#endif diff --git a/System/os_debug.c b/System/os_debug.c new file mode 100644 index 00000000..ee35d9f9 --- /dev/null +++ b/System/os_debug.c @@ -0,0 +1,141 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_debug.c + * @brief DEBUG接口 + * @details DEBUG接口,串口发送和接收解析。 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#include "os_var.h" +#if (SYSCFG_DEBUGGING == __ENABLED__) +#include "os_api.h" +#include "sv_com.h" +#include "sv_create.h" +#include "sv_task.h" +#include "ur_api.h" +#include + +/** + \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; + } +} + +/** + \brief 接收解析 + \details DEBUG接口,串口接收解析。 + \return 无 + */ +void os_debug_recv(void) +{ + #define p s_debug_recvptr + #define len s_debug_recvlen + p[len] = '\0'; + if(len == 9 && !s_memcmp(p, "taskmgr\r\n", 9)){ + s_taskmgr_sign = true; + s_taskmgr_upspeed = 0; + s_timqry_handle[OS_TMID_TASKMGR]->timer = s_timqry_handle[OS_TMID_TASKMGR]->reload; + } + else if(len == 6 && !s_memcmp(p, "exit\r\n", 6)){ + s_taskmgr_sign = false; + } + else if(len >= 15 && !s_memcmp(p, "taskmgr /s=", 11)){ + s_u8_t i; + char *mptr = p + 11; + for(i = 0; i < 5; i++){ + if(mptr[i] >= '0' && mptr[i] <= '9'); + else break; + } + if(i >= 2 && !s_memcmp(mptr + i, "\r\n", 2)){ + s_u16_t temp; + mptr[i] = '\0'; + temp = _atoi_(mptr); + if(temp >= 50 && temp <= 5000){ + s_timqry_handle[OS_TMID_TASKMGR]->reload = (temp * 1000UL) / SYSCFG_SYSTICK_CYCLE; + } + } + } + #undef p + #undef len +} + +/** + \brief 系统调试器 + \details 负责系统DEBUG信息的输出,具体包括命令行和任务管理器。 + \param[in] 定时器ID OS_TMID_DEBUGGER + \param[in] 定时查询事件 s_debug_sendtype + \param[in] 自动重装载 false + \param[in] 任务名称 Debugger + \param[in] 任务优先级 SYSCFG_TASKPRIORITY - 1 + \param[in] 任务栈大小 SYSCFG_STACKSIZE_DEBUGGER + \param[in] 安全运行时 0 + \param[in] 任务名称文本 遗产模式:"Debugger",标准/兼容模式:"系统调试器" + \return 无 + \note 定时查询任务 + */ +#define _taskname "\xCF\xB5\xCD\xB3\xB5\xF7\xCA\xD4\xC6\xF7" /*!< "系统调试器" */ +uCreateTask_TimQry +( + OS_TMID_DEBUGGER, s_debug_sendtype, false, + Debugger, SYSCFG_TASKPRIORITY - 1, SYSCFG_STACKSIZE_DEBUGGER, 0, _taskname +) +{ + #if (SYSCFG_DEBUG_SENDLEN == __DISABLED__) + void debug_hook(char _XDATA_MEM_ *p); + #else + void debug_hook(char _XDATA_MEM_ *p, s_u16_t len); + #endif + while(true){ + if(s_debug_sendtype & OS_DEBUG_SEND_TASKMGR){ + s_debug_sendtype &= ~OS_DEBUG_SEND_TASKMGR; + #if (SYSCFG_DEBUG_SENDLEN == __DISABLED__) + debug_hook(s_taskmgr_sendbuff); + #else + debug_hook(s_taskmgr_sendbuff, s_taskmgr_sendlen); + #endif + }/* + else if(s_debug_sendtype & OS_DEBUG_SEND_CMDLINE){ + s_debug_sendtype &= ~OS_DEBUG_SEND_CMDLINE; + #if (SYSCFG_DEBUG_SENDLEN == __DISABLED__) + debug_hook(s_cmdline_sendbuff); + #else + debug_hook(s_cmdline_sendbuff, s_cmdline_sendlen); + #endif + }*/ + uSuspendTasking(); + } +} +#undef _taskname + +#endif diff --git a/System/os_def.h b/System/os_def.h new file mode 100644 index 00000000..03f40c56 --- /dev/null +++ b/System/os_def.h @@ -0,0 +1,145 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_def.h + * @brief 初始宏定义 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#ifndef __OS_DEF_H +#define __OS_DEF_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) s_u8_t v:1 +#define sDefVoidBits(n) s_u8_t :n + + +/* + * CONST + */ + +#define true 1 +#define false 0 +#define OS_NULL 0 /*!< 通用的空指针 */ +#define OS_VOID ((s_tasknode_tsp)~0) /*!< 专用的空指针,超时链表专用。*/ + + +/* + * CONFIG VALUE + */ + +#define __DISABLED__ 0 +#define __ENABLED__ 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_STATUS_READY 0x00 /*!< 就绪/运行状态 ............ */ +#define OS_STATUS_FLOATING 0x01 /*!< 浮动状态 ................. */ +#define OS_STATUS_BLOCKED 0x02 /*!< 阻塞状态 ................. */ +#define OS_STATUS_TIMEOUT 0x04 /*!< 超时状态 ................. */ +#define OS_STATUS_SUSPENDED 0x08 /*!< 挂起状态 ................. */ +#define OS_STATUS_STOPPED 0x40 /*!< 停止状态 ................. */ +#define OS_STATUS_DELETED 0x80 /*!< 已删除/未启动状态 ........ */ + +/* 阻塞类型 */ +#define OS_BLOCKED_DELAY 0x00 /*!< 延时阻塞 ................. */ +/*- 0x01/0x02/0x04:sizeof(Group) -*//*!< 事件标志组阻塞(等待).... */ +#define OS_BLOCKED_BINARY 0x10 /*!< 二值信号量阻塞(获取/等待)*/ +#define OS_BLOCKED_MUTEX 0x20 /*!< 互斥信号量阻塞(获取).... */ +#define OS_BLOCKED_SEMAPHORE 0x30 /*!< 计数信号量阻塞(获取).... */ +#define OS_BLOCKED_TASKMSG 0x40 /*!< 接收私信阻塞 ............. */ +#define OS_BLOCKED_FETION 0x50 /*!< 接收飞信阻塞 ............. */ +#define OS_BLOCKED_MAIL 0x60 /*!< 接收邮件阻塞 ............. */ +#define OS_BLOCKED_MSG 0x70 /*!< 接收消息阻塞 ............. */ + + +/* + * 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_RESUMETASK 0x01 +#define OS_SVID_SUSPENDTASK 0x02 +#define OS_SVID_DELETETASK 0x03 +#define OS_SVID_CLEARBLOCK 0x04 +#define OS_SVID_SETBLOCK 0x05 +#define OS_SVID_SETTASKPRI 0x06 +#define OS_SVID_WRITEBINARY 0x07 +#define OS_SVID_GIVESEMAPH 0x08 +#define OS_SVID_SENDFETION 0x09 +#define OS_SVID_SENDMAIL 0x0A +#define OS_SVID_SENDMSG 0x0B +#define OS_SVID_TIMINT 0x0C +#define OS_SVID_TIMQRY 0x0D +#define OS_SVID_WRITEGROUP 0x0E +#define OS_SVID_WRITEGVAR 0x0F +#define OS_SVID_PENDSVC 0x10 +#define OS_SVID_END 0x11 + + +/* + * ECODE(错误码) + */ + +#define OS_ECODE_NOERROR 0 /*!< 无错误 ............. */ +#define OS_ECODE_OVERFLOW_MSGQUEUE 1 /*!< 消息队列溢出 ....... */ +#define OS_ECODE_OVERFLOW_TASKQUEUE 2 /*!< 任务队列溢出 ....... */ +#define OS_ECODE_OVERFLOW_TASKSTACK 3 /*!< 任务栈溢出 ......... */ +#define OS_ECODE_MALLOCFAIL_MSGNODE 4 /*!< 消息节点内存分配失败 */ +#define OS_ECODE_MALLOCFAIL_TASKNODE 5 /*!< 任务节点内存分配失败 */ +#define OS_ECODE_MALLOCFAIL_TASKSTACK 6 /*!< 任务栈内存分配失败 . */ +#define OS_ECODE_TASKSUSPENDED 7 /*!< 任务已挂起 ......... */ +#define OS_ECODE_TASKSTOPPED 8 /*!< 任务已停止 ......... */ +#define OS_ECODE_TASKNOTSTARTED 9 /*!< 任务未启动/已删除 .. */ +#define OS_ECODE_TASKNOTREADY 10 /*!< 任务未就绪 ......... */ +#define OS_ECODE_TASKNOTBLOCKED 11 /*!< 任务未阻塞 ......... */ +#define OS_ECODE_TASKNOTSUSPENDED 12 /*!< 任务未挂起 ......... */ +#define OS_ECODE_TASKPRIUNCHANGED 13 /*!< 任务优先级未改变 ... */ +#define OS_ECODE_DONOTKNOW 255 /*!< 未知错误 ........... */ + + + +#endif diff --git a/System/os_handler.c b/System/os_handler.c new file mode 100644 index 00000000..2c40176c --- /dev/null +++ b/System/os_handler.c @@ -0,0 +1,680 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_handler.c + * @brief tCosyTick_Handler and sPendSV_Handler + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#include "os_var.h" +#include "os_api.h" +#include "sv_com.h" +#include "sv_create.h" +#include "sv_tick.h" +#include "ur_api.h" +#include "ur_eapi.h" + +#if defined ( __ICCARM__ ) +#define __IAR_WEAK __WEAK +#else +#define __IAR_WEAK +#endif + +#if defined ( __GNUC__ ) +#define sKill_W(p) p +#else +#define sKill_W(p) +#endif + +sCat2Str(SYSCFG_STARTERCREATE, ExternTask(Starter)); +#if (SYSCFG_DEBUGGING == __ENABLED__) +__IAR_WEAK s_u32_t usedtime[2]/**/sZeroInstall_Group; +__IAR_WEAK m_stacklen_t _SYS_MEM_ s_taskstacklen; +#endif + +__IAR_WEAK void tCosyTick_Handler(void) MCUCFG_SYSTICK_ATTRIBUTE +{ + #if (OS_TIMINTTOTAL > 0 || OS_TIMQRYTOTAL > 0) + s_u8_t _SYS_REG_ i; + #endif + #if (SYSCFG_SYSTICKTIME_COUNT == __ENABLED__) + m_tick_t ticktemp_s sKill_W(=0); + #endif + s_tasknode_tsp _SYS_REG_ htask; + + /* 清除中断标志位 */ + mSysTick_Clear(); + + /* 系统滴答开始时刻 */// 此刻定义为系统滴答开始时刻 for 系统滴答时间统计。 + #if (SYSCFG_SYSTICKTIME_COUNT == __ENABLED__) + if(s_taskmgr_sign){ + ticktemp_s = MCUCFG_SYSTICK_CURRVALUE; + } + #endif + + /* 软件RTC */ + #if (SYSCFG_SOFTRTC == __ENABLED__) + #define counter s_rtc_counter + if(true){ + if(counter < 1000000UL / SYSCFG_SYSTICK_CYCLE - 1){ + counter++; + if(counter == 1000000UL / SYSCFG_SYSTICK_CYCLE / 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++; + } + } + } + } + } + } + } + } + #undef counter + #endif + + /* 运行时间统计 */ + #if (SYSCFG_RUNTIME_COUNT == __ENABLED__) + if(true){ + static m_rtccount_t _SYS_MEM_ counter = 0; + if(counter < 1000000UL / SYSCFG_SYSTICK_CYCLE - 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_TICKHOOK == __ENABLED__) + if(true){ + void tick_hook(void); + tick_hook(); + } + #endif + + /* 任务管理器 */ + #if (SYSCFG_DEBUGGING == __ENABLED__) + if(s_debug_recvlen){ + void os_debug_recv(void); + os_debug_recv(); + s_debug_recvlen = 0; + } + if(s_debug_sendsign){ + s_debug_sendsign = false; + tTimQry_ms(OS_TMID_DEBUGGER, 10); + } + #endif + + /* 定时中断 */ + #if (OS_TIMINTTOTAL > 0) + 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 > 0) + 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 + + /* 任务定时器 */// 定时器链表中的任务状态:就绪、浮动、阻塞、挂起。 + if(true){ + s_timer_pointer = (s_timer_pointer + 1) & (OS_TIMESLOTNUM - 1UL); + htask = s_timer_list[s_timer_pointer]; + if(htask != OS_NULL){ + bool loop_sign = true; + s_tasknode_tsp _SYS_REG_ hnext sKill_W(=OS_NULL); + s_tasknode_tsp _SYS_REG_ htail = htask->last_t; + __TIMER_LOOP: + if(htask == htail){ + loop_sign = false; + } + else{ + hnext = htask->next_t; + } + if(htask->status < OS_STATUS_SUSPENDED){ + if( htask->timer.cycle){ + htask->timer.cycle--; + } + else if(htask->status == OS_STATUS_READY){ + sa_remove_timerlist(htask); + s_sign_delay = false; + } + else{ + sa_clear_block(htask); + } + } + if(loop_sign){ + htask = hnext; + goto __TIMER_LOOP; + } + } + } + + /* 时间片 */ + #if (SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__) + if(s_task_current->tc_counter < OS_TIMESHARING(s_task_current)){ + s_task_current->tc_counter++; + } + else{ + s_sign_schedule.every[1] = false; + } + #endif + + /* 安全运行时 */// 超时链表中的任务状态:超时、超时|挂起、停止、删除。 + #if (SYSCFG_SAFERUNTIME == __ENABLED__) + if(!s_timeout_sign){ + htask = s_timeout_list; + while(htask != OS_VOID){ + if(htask->status == OS_STATUS_TIMEOUT){ + htask->srt_counter = 0; + sa_add_ready(htask); + htask->status = OS_STATUS_READY; + } + else if(htask->status & OS_STATUS_SUSPENDED){ + htask->srt_counter = 0; + htask->status = OS_STATUS_READY | OS_STATUS_SUSPENDED; + } + else if(htask->status == OS_STATUS_DELETED){ + if(htask->create){ + sa_free_task(htask); + } + } + s_timeout_list = htask->next_o; + htask->next_o = OS_NULL; + htask = s_timeout_list; + } + } + htask = s_task_current; + if(htask->pri && htask->saferuntime){ + htask->srt_counter++; + if(htask->srt_counter > htask->saferuntime){ + if(htask->status == OS_STATUS_READY){ + htask->next_o = s_timeout_list; + s_timeout_list = htask; + sa_remove_ready(htask); + htask->status = OS_STATUS_TIMEOUT; + s_timeout_sign = true; + #if (SYSCFG_DEBUGGING == __ENABLED__) + s_alarm.timeout_saferuntime = true; + #endif + } + } + } + #endif + + /* 任务管理器 */ + #if (SYSCFG_DEBUGGING == __ENABLED__) + if(s_taskmgr_sign){ + /* CPU使用时间计数 */ + usedtime[0]++; + s_taskmgr_upspeed++; + /* 系统滴答时间统计 */// 此刻定义为系统滴答结束时刻。 + #if (SYSCFG_SYSTICKTIME_COUNT == __ENABLED__) + if(true){ + m_tick_t ticktemp_e = MCUCFG_SYSTICK_CURRVALUE; + #if (MCUCFG_SYSTICK_COUNTMODE == 1 || MCUCFG_SYSTICK_COUNTMODE == 3) + if(ticktemp_e > ticktemp_s){ + s_tick_count1 += ticktemp_e - ticktemp_s; + } + #elif (MCUCFG_SYSTICK_COUNTMODE == 2 || MCUCFG_SYSTICK_COUNTMODE == 4) + if(ticktemp_s > ticktemp_e){ + s_tick_count1 += ticktemp_s - ticktemp_e; + } + #endif + s_tick_count2++; + } + #endif + } + #endif + + /* 触发任务调度 */ + if(!s_sign_schedule.total){ + mPendSV_Set(); + } +} + +#if (SYSCFG_DEBUGGING == __ENABLED__) +__IAR_WEAK void _cpu_usedtime_(m_tick_t ticktemp_0) MCUCFG_OSIT_ATTRIBUTE +{ + #if (MCUCFG_SYSTICK_COUNTMODE == 1 || MCUCFG_SYSTICK_COUNTMODE == 3) + if(usedtime[0]){ + s_task_current->usedtime[0] += usedtime[0] - 1; + usedtime[0] = 0; + usedtime[1] = (MCUCFG_SYSTICK_MAXVALUE - usedtime[1]) + (ticktemp_0 - MCUCFG_SYSTICK_MINVALUE); + } + else if(ticktemp_0 < usedtime[1]){ + usedtime[0] = ~0; + usedtime[1] = (MCUCFG_SYSTICK_MAXVALUE - usedtime[1]) + (ticktemp_0 - MCUCFG_SYSTICK_MINVALUE); + } + else{ + usedtime[1] = (ticktemp_0 - usedtime[1]); + } + #elif (MCUCFG_SYSTICK_COUNTMODE == 2 || MCUCFG_SYSTICK_COUNTMODE == 4) + if(usedtime[0]){ + s_task_current->usedtime[0] += usedtime[0] - 1; + usedtime[0] = 0; + usedtime[1] = (usedtime[1] - MCUCFG_SYSTICK_MINVALUE) + (MCUCFG_SYSTICK_MAXVALUE - ticktemp_0); + } + else if(usedtime[1] < ticktemp_0){ + usedtime[0] = ~0; + usedtime[1] = (usedtime[1] - MCUCFG_SYSTICK_MINVALUE) + (MCUCFG_SYSTICK_MAXVALUE - ticktemp_0); + } + else{ + usedtime[1] = (usedtime[1] - ticktemp_0); + } + #endif + s_task_current->usedtime[0] += (s_task_current->usedtime[1] + usedtime[1]) / MCUCFG_SYSTICK_COUNT1CYC; + s_task_current->usedtime[1] = (s_task_current->usedtime[1] + usedtime[1]) % MCUCFG_SYSTICK_COUNT1CYC; +} +#endif + +__IAR_WEAK void _float_to_ready_(s_tasknode_tsp htask) MCUCFG_OSIT_ATTRIBUTE +{ + htask->status = OS_STATUS_READY; +// if(htask->next_b != OS_NULL){ + sa_remove_blocklist(htask); +// } + if(htask->next_t != OS_NULL){ + sa_remove_timerlist(htask); + } +} + +__IAR_WEAK s_tasknode_tsp _SYS_MEM_ s_task_news/**/sZeroInstall; + +__IAR_WEAK s_u8_t _start_task_(void) MCUCFG_OSIT_ATTRIBUTE +{ + s_tasknode_tsp _SYS_REG_ node_news; + /* 静态创建 */ + 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_ecode = 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->opri = s_task_starter->opri; + node_news->dualhandle = s_task_starter->dualhandle; + *node_news->dualhandle = node_news; + node_news->entry = s_task_starter->entry; + #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_ecode = 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_ecode = OS_ECODE_MALLOCFAIL_TASKNODE; + goto __STARTUP_END; + } + } + /* 公共部分 */ + if(node_news->opri <= (s_u8_t)(SYSCFG_TASKPRIORITY - 1)){ + node_news->pri = node_news->opri; + } + else{ + node_news->pri = SYSCFG_TASKPRIORITY - 1; + #if (SYSCFG_DEBUGGING == __ENABLED__) + s_alarm.outrange_taskpriority = true; + #endif + } + node_news->status = s_task_status0; + node_news->blocktype = 0; + node_news->timer.slots = 0; + node_news->timer.cycle = 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; + node_news->next_o = OS_NULL; + #endif + node_news->last_b = OS_NULL; + node_news->next_b = OS_NULL; + node_news->last_t = OS_NULL; + node_news->next_t = OS_NULL; + #if (SYSCFG_SAMEPRISCHEDULE && SYSCFG_MUTEX == __ENABLED__) + node_news->link = OS_NULL; + #endif + sa_insert_taskque(node_news); + s_task_queue_count++; + if(s_task_status0 == OS_STATUS_READY){ + sa_add_ready(node_news); + } + s_startup_ecode = OS_ECODE_NOERROR; + __STARTUP_END: + s_task_starter = OS_NULL; + if(node_news == Starter){ + if(s_startup_ecode == OS_ECODE_NOERROR){ + #if (SYSCFG_DEBUGGING == __ENABLED__) + if(s_taskmgr_sign){ + usedtime[1] = MCUCFG_SYSTICK_CURRVALUE; + } + #endif + mUserReg_RESc(); + s_task_news = Starter; + return 1; + } + else return 0; + } + else return 2; +} + +void pendsv_hook(void); +#if (SYSCFG_MCUCORE == 80251) +#pragma functions(static) +#endif +__IAR_WEAK s_u8_t sPendSV_Handler(void) MCUCFG_OSIT_ATTRIBUTE +{ + /* 中断挂起服务_FIFO */ + #if (MCUCFG_PENDSVFIFO_DEPTH > 0) + mPendSV_FIFOHandle(); + #endif + + /* 中断挂起服务_FLAG */ + #if (SYSCFG_PENDSVHOOK == __ENABLED__) + pendsv_hook(); + #endif + + /* 每PendSV监控(假定入栈)*/ + #if (SYSCFG_DEBUGGING == __ENABLED__) + if(s_task_current != OS_NULL){ + mTaskStack_LEN(); + 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 = true; + } + } + } + #endif + + /* 任务启动 */ + if(!s_sign_startup){ + s_sign_startup = true; + if(s_task_starter != OS_NULL){ + s_u8_t r = _start_task_(); + if(r < 2) return r; + } + } + + /* 任务调度 */ + if(s_sign_schedule.total) return 0; + else{ + #if (SYSCFG_DEBUGGING == __ENABLED__) + m_tick_t _SYS_REG_ ticktemp_0 sKill_W(=0); + m_bit_t push_sign = false; /*!< 入栈信号 */ + #else + #define push_sign true + #endif + s_u8_t _SYS_REG_ pri; + s_tasknode_tsp _SYS_REG_ node_news; + s_sign_schedule.every[1] = true; + + /* 抢占式调度(选择就绪)*/ + if(true){ + #if (SYSCFG_TASKPRIORITY > 64) + s_u8_t table_index = s_task_pickmap[s_task_table_index >> (SYSCFG_TASKPICKBITMAP & 1)]; + s_u8_t bytes_index = s_task_pickmap[s_task_bytes_index[table_index] >> (SYSCFG_TASKPICKBITMAP & 1)]; + s_u8_t bit_index = s_task_pickmap[s_task_ready_table[table_index][bytes_index] >> (SYSCFG_TASKPICKBITMAP & 1)]; + pri = (table_index << 6) + (bytes_index << 3) + bit_index; + #elif (SYSCFG_TASKPRIORITY > 8) + s_u8_t bytes_index = s_task_pickmap[s_task_bytes_index >> (SYSCFG_TASKPICKBITMAP & 1)]; + s_u8_t bit_index = s_task_pickmap[s_task_ready_table[bytes_index] >> (SYSCFG_TASKPICKBITMAP & 1)]; + pri = (bytes_index << 3) + bit_index; + #else + pri = s_task_pickmap[s_task_ready_table >> (SYSCFG_TASKPICKBITMAP & 1)]; + #endif + node_news = s_task_queue[pri]; + } + + /* 协作式调度 */ + #if (SYSCFG_SAMEPRISCHEDULE == __COOPERATIVE__) + while(true){ + if(node_news->status <= OS_STATUS_FLOATING){ + break; + } + node_news = node_news->next; + } + + /* 时间片轮转调度 */ + #elif (SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__) + while(true){ + s_tasknode_tsp _SYS_REG_ node_temp sKill_W(=OS_NULL); + if(node_news->status <= OS_STATUS_FLOATING){ + if(node_news->tc_counter < OS_TIMESHARING(node_news)){ /* 时间片未到期 */ + break; + } + else{ /* 时间片已到期 */ + node_news->tc_counter = 0; + node_temp = node_news; + } + } + if(node_news != s_task_queue[pri]->last){ + node_news = node_news->next; + } + else{ /* 在该优先级组中,未能找到时间片未到期的就绪任务,继续已到期的就绪任务 */ + node_news = node_temp; + break; + } + } + #endif + + /* 新任务为事件阻塞 */ + if(node_news->blocktype){ + node_news->blocktype = 0; + if(node_news->status == OS_STATUS_FLOATING){ /* 浮动变就绪 */ + _float_to_ready_(node_news); + } + mSysIRQ_Disable(); /* 内核上锁 */// 使服务层临界区连续。 + } + + /* 新任务仍为当前任务 -> 返回 */ + if(node_news == s_task_current){ + return 0; + } + + /* 新任务轮转至其优先级组首节点 */ + #if (SYSCFG_SAMEPRISCHEDULE) + if(node_news != s_task_queue[pri]){ + s_task_queue[pri] = node_news; + } + #endif + + /* 入栈监控 */ + #if (SYSCFG_DEBUGGING == __ENABLED__) + if(s_task_current->status < OS_STATUS_STOPPED){ + if(s_task_current->stacksize < s_taskstacklen){ + #if (MCUCFG_TASKSTACK_REALLOC == __ENABLED__) + if(s_task_current->create){ + s_task_current->stacksize = s_taskstacklen + SYSCFG_TASKSTACK_REALLOCINC; + 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){ + push_sign = true; + s_task_current->create = 2; + s_alarm.realloc_taskstack = true; + } + else{ + sa_stop_task(s_task_current); + s_fault.reallocfailed_taskstack = true; + } + } + else{ + sa_stop_task(s_task_current); + s_fault.overflow_taskstack = true; + } + #else + sa_stop_task(s_task_current); + s_fault.overflow_taskstack = true; + #endif + } + else{ + push_sign = true; + } + } + #endif + + /* 任务切换时刻 */// 此刻定义为任务切换时刻 for CPU使用率统计。 + #if (SYSCFG_DEBUGGING == __ENABLED__) + if(s_taskmgr_sign){ + ticktemp_0 = MCUCFG_SYSTICK_CURRVALUE; + } + #endif + + /* 当前任务入栈-预处理 */ + if(push_sign){ + #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_taskmgr_sign){ + _cpu_usedtime_(ticktemp_0); + } + #endif + mUserReg_SAVEc(); + } + + /* 新任务出栈-预处理 */ + if(true){ + #if (SYSCFG_DEBUGGING == __ENABLED__) + if(s_taskmgr_sign){ + usedtime[1] = ticktemp_0; + } + #endif + mUserReg_RESc(); + s_task_news = node_news; + } + + return (s_u8_t)push_sign + 1; + } +} diff --git a/System/os_main.c b/System/os_main.c new file mode 100644 index 00000000..afcb1087 --- /dev/null +++ b/System/os_main.c @@ -0,0 +1,33 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_main.c + * @brief 启动-CosyOS + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#include "os_var.h" +#include "os_api.h" +#include "sv_create.h" +#include "sv_task.h" +#include "ur_api.h" + +/** + \brief 启动-CosyOS + \param 无 + \return 错误码 + \note 用户应自主创建main函数,并在其末尾处调用该函数来启动-CosyOS; + 在正常情况下,该函数并不会返回,而是直接调度至 Starter 运行; + 只有当 Starter 启动失败时,才会返回错误码提示用户。 + */ +s_ecode_t uStartCosyOS(void) +{ + sCat2Str(SYSCFG_STARTERCREATE, ExtTask(Starter)); + #if (OS_TIMINTTOTAL > 0 || OS_TIMQRYTOTAL > 0) + void os_init_timing(void); + os_init_timing(); + #endif + mCosyOS_INIT(); + return uStartTask_Ready(Starter); +} diff --git a/System/os_redef.h b/System/os_redef.h new file mode 100644 index 00000000..1916272b --- /dev/null +++ b/System/os_redef.h @@ -0,0 +1,680 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_redef.h + * @brief 系统重定义 + * @details 基于 os_def.h、os_base.h、syscfg.h、mcucfg_x.h、port_x.h 等文件 + 中的定义而再次定义,包括宏定义和类型定义。 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#ifndef __OS_REDEF_H +#define __OS_REDEF_H + +/*------------------------------------------------------------------------------ + * INCLUDE */ + +#include +#include "os_def.h" +#include "syscfg.h" +#include sDefStr(sCat2Str(port_, SYSCFG_MCUCORE.h)) + +/*------------------------------------------------------------------------------ + * ZERO-INSTALL */ + +#if (MCUCFG_OSZEROINSTALL == __ENABLED__) +#define sZeroInstall = 0 +#define sZeroInstall_Group = {0} +#else +#define sZeroInstall +#define sZeroInstall_Group +#endif + +/*------------------------------------------------------------------------------ + * OS-NOP */ + +#define OS_NOPx1 __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 +#define OS_NOP(n) sCat2Str(OS_NOPx, n) + +/*------------------------------------------------------------------------------ + * TOTAL */ + +#if (SYSCFG_TIMESLOTBITS >= 1 && SYSCFG_TIMESLOTBITS <= 8) +#define OS_TIMESLOTBITS SYSCFG_TIMESLOTBITS +#elif (SYSCFG_TIMESLOTBITS == 251 || SYSCFG_TIMESLOTBITS == 253 || SYSCFG_TIMESLOTBITS == 256) +#define __OS_TIMESLOTNUM (SYSCFG_TASKPRIORITY * (SYSCFG_SAMEPRISCHEDULE ? 3 : 1)) / (SYSCFG_TIMESLOTBITS - 250) + #if (__OS_TIMESLOTNUM >= (128 + 64)) +#define OS_TIMESLOTBITS 8 +#elif (__OS_TIMESLOTNUM >= (64 + 32)) +#define OS_TIMESLOTBITS 7 +#elif (__OS_TIMESLOTNUM >= (32 + 16)) +#define OS_TIMESLOTBITS 6 +#elif (__OS_TIMESLOTNUM >= (16 + 8)) +#define OS_TIMESLOTBITS 5 +#elif (__OS_TIMESLOTNUM >= (8 + 4)) +#define OS_TIMESLOTBITS 4 +#elif (__OS_TIMESLOTNUM >= (4 + 2)) +#define OS_TIMESLOTBITS 3 +#elif (__OS_TIMESLOTNUM >= (2 + 1)) +#define OS_TIMESLOTBITS 2 +#else +#define OS_TIMESLOTBITS 1 +#endif +#else +#error 参数非法 of 延时定时器时间轮槽数! +#endif +#define OS_TIMESLOTNUM (1UL << OS_TIMESLOTBITS) + +#define OS_TIMINTTOTAL SYSCFG_USERTIMINTTOTAL /*!< 定时中断总数 */ +#if (SYSCFG_DEBUGGING == __DISABLED__) +#define OS_TIMQRYTOTAL SYSCFG_USERTIMQRYTOTAL /*!< 定时查询总数 */ +#else +#define OS_TIMQRYTOTAL (SYSCFG_USERTIMQRYTOTAL + 2) + +/*------------------------------------------------------------------------------ + * TMID(定时器ID)*/ + +#define OS_TMID_DEBUGGER SYSCFG_USERTIMQRYTOTAL /*!< TMID of Debugger */ +/** 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 +#endif +#endif + +/*------------------------------------------------------------------------------ + * Time Sharing(时间片)*/ + +#if (SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__) + #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_FORMULATIMESHARING(htask->pri) +#define OS_TIMESHARING_MAX SYSCFG_FORMULATIMESHARING(0) +#define OS_TIMESHARING_MIN SYSCFG_FORMULATIMESHARING(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 参数非法 of 时间片! +#endif +#endif + +/*------------------------------------------------------------------------------ + * DEBUG */ + +#if (SYSCFG_DEBUGGING == __ENABLED__) + +#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_PRI + OS_TASKMGR_LEN_STA \ + + OS_TASKMGR_LEN_CPU + OS_TASKMGR_LEN_RAM \ +) + +#define OS_CMDLINESENDBUFFSIZE (SYSCFG_TASKNAMELEN_MAX + 64) /*!< size of 命令行发送缓存 */ + +#if (SYSCFG_SAMEPRISCHEDULE == 0) +#define OS_TASKTOTAL SYSCFG_TASKPRIORITY /*!< 在线任务总数 */ +#else +#define OS_TASKTOTAL (SYSCFG_USERTASKTOTAL + 4) +#endif + +#define OS_TASKMGRSENDBUFFSIZE \ +( \ + (OS_TASKMGR_LEN_LINE + 2) * (OS_TASKTOTAL + 7 + SYSCFG_RTC_SHOW) + 2 * 2 + 1 \ +) /*!< size of Taskmgr发送缓存 */ + +#endif + +/*------------------------------------------------------------------------------ + * typedef base */ + + #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 参数非法 of 时间片! +#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 bool s_boolvoid_tf(void); /*!< Keil C51 专用 */ +typedef bool (_CODE_MEM_ *s_boolvoid_tfp)(void); +typedef void (_CODE_MEM_ *s_voidvoid_tfp)(void); + +/*------------------------------------------------------------------------------ + * typedef union */ + +/** + \brief 调度信号 + */ +typedef union +{ + volatile s_u8_t every[2]; + volatile s_u16_t total; +}s_schesign_tu; + +/*------------------------------------------------------------------------------ + * 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); /*!< 每半秒 */ + sDefVoidBits(1); +}s_every_ts; + +/** + \brief 系统警告 + */ +typedef struct +{ + sDefBitField(overflow_msgqueue); /*!<【omq】:消息队列溢出 ....... */ + sDefBitField(timeout_saferuntime); /*!<【srt】:安全运行时超时 ..... */ + sDefBitField(outrange_taskpriority); /*!<【otp】:任务优先级超出范围 . */ + sDefBitField(realloc_taskstack); /*!<【rts】:任务栈重分配发生 ... */ + sDefBitField(overflow_taskstack); /*!<【ots】:未来的任务栈溢出 ... */ + sDefVoidBits(3); +}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_u8_t opri; /*!< 任务创建时的优先级 */ + 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__) + unsigned int 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; /*!< 阻塞类型 */ + struct{ + s_u8_t slots; + s_delay_t cycle; + }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_stacklen_t stacklen_max; /*!< 任务栈的实际占用在历史上的最大值 */ + #endif + #if (SYSCFG_SAFERUNTIME == __ENABLED__) + unsigned int srt_counter; /*!< 安全运行时计数器 */ + struct s_tasknode_ts _OBJ_MEM_ *next_o; /*!< 下一节点 of 超时链表 */ + #endif + struct s_tasknode_ts _OBJ_MEM_ *last_b; /*!< 上一节点 of 阻塞链表 */ + struct s_tasknode_ts _OBJ_MEM_ *next_b; /*!< 下一节点 of 阻塞链表 */ + struct s_tasknode_ts _OBJ_MEM_ *last_t; /*!< 上一节点 of 定时器链表 */ + struct s_tasknode_ts _OBJ_MEM_ *next_t; /*!< 下一节点 of 定时器链表 */ + #if (SYSCFG_SAMEPRISCHEDULE) + struct s_tasknode_ts _OBJ_MEM_ *last; /*!< 上一节点 of 任务链表 */ + struct s_tasknode_ts _OBJ_MEM_ *next; /*!< 下一节点 of 任务链表 */ + #if (SYSCFG_MUTEX == __ENABLED__) + struct s_tasknode_ts _OBJ_MEM_ *link; /*!< 互斥信号量获取阻塞-任务链接 */ + #endif + #endif + mTaskNode_Tail_ /*!< MCS51/251:mUserReg_DEFc_,减栈: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_ + const s_u8_t opri; + 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; /*!< 任务装载块句柄 */ + +typedef union +{ + s_voidvoid_tfp hook; + s_taskhand_tsp hand; +}s_hookorhand_tu; + +/** + \brief 定时中断HAND(控制块) + \details 创建定时中断任务或钩子时,会定义此结构体。 + */ +typedef struct +{ + s_timint_t timer; /*!< 定时器 */ + s_timint_t reload; /*!< 重装载值 */ + bool autoreload; /*!< 是否自动重装载定时器?*/ + const bool hookortask; /*!< 该定时中断是钩子还是任务?[0:hook,1:task] */ + s_hookorhand_tu 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; /*!< 重装载值 */ + bool autoreload; /*!< 是否自动重装载定时器?*/ + const bool hookortask; /*!< 该定时查询是钩子还是任务?[0:hook,1:task] */ + s_hookorhand_tu const hookorhand; /*!< 钩子函数指针或任务HAND指针 */ + s_boolvoid_tfp const event; /*!< 定时查询事件函数指针 */ +}s_timqryhand_ts; +typedef s_timqryhand_ts _STATIC_MEM_ *s_timqryhand_tsp; /*!< 定时查询句柄 */ + +/** + \brief 互斥信号量控制块 + \details 创建互斥信号量时,会定义此结构体。 + */ +typedef struct +{ + s_tasknode_tsp htask; + s_tasknode_tsp otask; + s_u8_t opri; + volatile s_u8_t mutex; +}s_mutex_ts; +typedef s_mutex_ts _STATIC_MEM_ *s_mutex_tsp; /*!< 互斥信号量句柄 */ + +/** + \brief 二值信号量控制块 + \details 创建二值信号量时,会定义此结构体。 + */ +typedef struct +{ + s_tasknode_tsp htask; + volatile bool binary; +}s_binary_ts; +typedef s_binary_ts _STATIC_MEM_ *s_binary_tsp; /*!< 二值信号量句柄 */ + +/** + \brief 计数信号量控制块 + \details 创建计数信号量时,会定义此结构体。 + */ +typedef struct +{ + s_tasknode_tsp htask; + volatile s_semsize_t counter; + const s_semsize_t maximum; +}s_semaph_ts; +typedef s_semaph_ts _STATIC_MEM_ *s_semaph_tsp; /*!< 计数信号量句柄 */ + +/** + \brief 信箱控制块 + \details 创建信箱时,会定义此结构体。 + */ +typedef struct +{ + s_tasknode_tsp htask; + volatile m_fetion_t tion; +}s_tionbox_ts; +typedef s_tionbox_ts _STATIC_MEM_ *s_tionbox_tsp; /*!< 信箱句柄 */ + +/** + \brief 邮箱控制块 + \details 创建邮箱时,会定义此结构体。 + */ +typedef struct +{ + s_tasknode_tsp htask; + volatile bool flag; + void *mail; +}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 +{ + s_tasknode_tsp htask; + volatile bool mutex; + volatile size_t counter; + const s_u8_t type; + const s_u8_t mode; + const size_t len; + s_msgnode_tsp head; + s_msgnode_tsp tail; +}s_dynque_ts; +typedef s_dynque_ts _STATIC_MEM_ *s_dynque_tsp; /*!< 动态队列句柄 */ + +/** + \brief 静态队列控制块 + \details 创建静态队列时,会定义此结构体。 + */ +typedef struct +{ + s_tasknode_tsp htask; + volatile bool mutex; + volatile size_t counter; + const s_u8_t type; + const s_u8_t mode; + const size_t len; + void * _STATIC_MEM_ * head; + void * _STATIC_MEM_ * tail; + void * _STATIC_MEM_ * const base; +}s_staque_ts; +typedef s_staque_ts _STATIC_MEM_ *s_staque_tsp; /*!< 静态队列句柄 */ + +/** + \brief 队列控制块 + \details 创建队列时,并不会定义此结构体;访问队列时,通过其队列句柄, + 即可访问动态队列控制块,也可访问静态队列控制块。 + */ +typedef struct +{ + s_tasknode_tsp htask; /*!< 任务句柄 */ + volatile bool mutex; /*!< 队列互斥量 */ + volatile size_t counter; /*!< 队列计数器:记录队列中消息的数量 */ + const s_u8_t type; /*!< 队列类型 [0:静态队列,1:动态队列] */ + const s_u8_t mode; /*!< 传输模式 [0:FIFO,1:LIFO] */ + const size_t len; /*!< 队列长度 */ +}s_msgque_ts; +typedef s_msgque_ts _STATIC_MEM_ *s_msgque_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; +}sp_svid_ts; +typedef sp_svid_ts _STATIC_MEM_ *sp_svid_tsp; + +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 npri; +}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 bool 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 tion; +}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_msgque_tsp const hque; + void *msg; +}sp_msgque_ts; +typedef sp_msgque_ts _STATIC_MEM_ *sp_msgque_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; + + + +#endif diff --git a/System/os_starter.c b/System/os_starter.c new file mode 100644 index 00000000..46b1742b --- /dev/null +++ b/System/os_starter.c @@ -0,0 +1,66 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_starter.c + * @brief 任务启动器(Starter) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#include "os_var.h" +#include "os_api.h" +#include "sv_com.h" +#include "sv_create.h" +#include "sv_task.h" +#include "ur_api.h" + +/** + \brief 任务启动器 + \param[in] 任务名称 Starter + \param[in] 任务优先级 SYSCFG_TASKPRIORITY - (SYSCFG_DEBUGGING ? 3 : 1) + \param[in] 任务栈大小 SYSCFG_STACKSIZE_STARTER + \param[in] 安全运行时 0 + \param[in] 任务名称文本 遗产模式:"Starter",标准/兼容模式:"任务启动器" + \return 无 + */ +#define _taskname "\xC8\xCE\xCE\xF1\xC6\xF4\xB6\xAF\xC6\xF7" /*!< "任务启动器" */ +sCat2Str +( + SYSCFG_STARTERCREATE, + CreateTask(Starter, SYSCFG_TASKPRIORITY - (SYSCFG_DEBUGGING ? 3 : 1), SYSCFG_STACKSIZE_STARTER, 0, _taskname) +) +{ +// uScheduleLock(); + if(true){ + uExtTask(Sysidle); + uStartTask_Ready(Sysidle); + } + #if (OS_TIMINTTOTAL > 0 || OS_TIMQRYTOTAL > 0) + if(true){ + s_u8_t i; + #if (OS_TIMINTTOTAL > 0) + i = OS_TIMINTTOTAL; + while(i--){ + if(s_timint_handle[i]->hookortask){ + sStartTask_TimInt(i); + } + } + #endif + #if (OS_TIMQRYTOTAL > 0) + i = OS_TIMQRYTOTAL; + while(i--){ + if(s_timqry_handle[i]->hookortask){ + sStartTask_TimQry(i); + } + } + #endif + } + #endif +// uScheduleUnlock(); + if(true){ + void start_hook(void); + start_hook(); + } + uDeleteTasking(); +} +#undef _taskname diff --git a/System/os_sysidle.c b/System/os_sysidle.c new file mode 100644 index 00000000..31ec1c2a --- /dev/null +++ b/System/os_sysidle.c @@ -0,0 +1,49 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_sysidle.c + * @brief 系统空闲任务(Sysidle) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#include "os_var.h" +#include "os_api.h" +#include "sv_create.h" +#include "sv_task.h" +#include "ur_api.h" + +/** + \brief 系统空闲任务 + \param[in] 任务名称 Sysidle + \param[in] 任务优先级 0 + \param[in] 任务栈大小 SYSCFG_STACKSIZE_SYSIDLE + \param[in] 安全运行时 0 + \param[in] 任务名称文本 遗产模式:"Sysidle",标准/兼容模式:"系统空闲" + \return 无 + */ +#define _taskname "\xCF\xB5\xCD\xB3\xBF\xD5\xCF\xD0" /*!< "系统空闲" */ +uCreateTask(Sysidle, 0, SYSCFG_STACKSIZE_SYSIDLE, 0, _taskname) +{ + void idle_hook(void); + while(true){ + #if (SYSCFG_SOFTRTC == __ENABLED__) + static s_u8_t _RTC_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_SAFERUNTIME == __ENABLED__) + s_timeout_sign = false; + #endif + #if (SYSCFG_IDLEHOOK == __ENABLED__) + idle_hook(); + #endif + #if (SYSCFG_LOWPOWERMODE == __ENABLED__) + mCosyOS_IDLE(); + #endif + OS_NOP(4); + } +} +#undef _taskname diff --git a/System/os_taskmgr.c b/System/os_taskmgr.c new file mode 100644 index 00000000..96b43a17 --- /dev/null +++ b/System/os_taskmgr.c @@ -0,0 +1,627 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_taskmgr.c + * @brief 任务管理器(Taskmgr) + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#include "os_var.h" +#if (SYSCFG_DEBUGGING == __ENABLED__) +#include "os_api.h" +#include "sv_com.h" +#include "sv_create.h" +#include "sv_task.h" +#include "ur_api.h" +#include + +/** + \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 字符n拷贝 + \param[in] c 字符 + \param[in] n 字符的数量 + \return 无 + */ +static void _chrncpy_(const char c, s_u8_t n) +{ + do{ + *mptr++ = c; + }while(--n); +} + +/** + \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 + +/** + \brief 任务管理器 + \param[in] 定时器ID OS_TMID_TASKMGR + \param[in] 定时查询事件 s_sign_taskmgr + \param[in] 自动重装载 true + \param[in] 任务名称 Taskmgr + \param[in] 任务优先级 SYSCFG_TASKPRIORITY - 2 + \param[in] 任务栈大小 SYSCFG_STACKSIZE_TASKMGR + \param[in] 安全运行时 0 + \param[in] 任务名称文本 遗产模式:"Taskmgr",标准/兼容模式:"任务管理器" + \return 无 + \note 定时查询任务 + */ +#define _taskname "\xC8\xCE\xCE\xF1\xB9\xDC\xC0\xED\xC6\xF7" /*!< "任务管理器" */ +uCreateTask_TimQry +( + OS_TMID_TASKMGR, s_taskmgr_sign, true, + Taskmgr, SYSCFG_TASKPRIORITY - 2, SYSCFG_STACKSIZE_TASKMGR, 0, _taskname +) +{ + static char _XDATA_MEM_ *p[2]; + mptr = s_taskmgr_sendbuff; + /* 标题1 */ + _strcpy_("\xC8\xCE\xCE\xF1\xB9\xDC\xC0\xED\xC6\xF7"); /*!< "任务管理器" */ + _spccpy_(OS_TASKMGR_LEN_LINE - OS_TASKMGR_LEN_CPU - OS_TASKMGR_LEN_RAM - 10); + p[0] = mptr; /*!< 缓存CPU总使用率开始指针 */ + _spccpy_(OS_TASKMGR_LEN_CPU + OS_TASKMGR_LEN_RAM - 8); + _strcpy_("CosyOS-3"); + _strcpy_("\r\n"); + /* 标题2 */ + _strcpy_("\xC3\xFB\xB3\xC6"); /*!< "名称" */ + _spccpy_(SYSCFG_TASKNAMELEN_MAX - 4); + _strcpy_("\xD3\xC5\xCF\xC8\xBC\xB6"); /*!< "优先级" */ + _spccpy_(OS_TASKMGR_LEN_STA - 4); + _strcpy_("\xD7\xB4\xCC\xAC"); /*!< "状态" */ + _spccpy_(OS_TASKMGR_LEN_CPU - 3); + _strcpy_("CPU"); /*!< "CPU" */ + _spccpy_(OS_TASKMGR_LEN_RAM - 4); + _strcpy_("\xC4\xDA\xB4\xE6"); /*!< "内存" */ + _strcpy_("\r\n"); + /* - */ + _chrncpy_('-', OS_TASKMGR_LEN_LINE); + _strcpy_("\r\n"); + /* 正文 */ + p[1] = mptr; /*!< 缓存正文开始指针 */ + while(true){ + #if (SYSCFG_TASKPC_MONITOR == __ENABLED__) + m_pc_t pc = s_pc; + #endif + s_u8_t i = (s_u8_t)(SYSCFG_TASKPRIORITY); + s_u16_t numerator1 = 10000; + s_u32_t upspeed; + s_tasknode_tsp node_curr; + static s_tasknode_ts node_temp; + + mptr = p[1]; + mSysIRQ_Disable(); + upspeed = s_taskmgr_upspeed; + s_taskmgr_upspeed = 0; + mSysIRQ_Enable(); + + __TASKQUE_NEXT: + do{ + node_curr = s_task_queue[--i]; + }while(node_curr == OS_NULL); + 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(); + /* 名称 */ + _strcpy_(node_temp.name); + if(SYSCFG_TASKNAMELEN_MAX > _strlen_(node_temp.name)){ + _spccpy_((s_u8_t)(SYSCFG_TASKNAMELEN_MAX - _strlen_(node_temp.name))); + } + /* 优先级 */ + _u8str_ (node_temp.pri); + _spccpy_((s_u8_t)(OS_TASKMGR_LEN_PRI - _strlen_(str))); + _strcpy_(str); + /* 状态 */ + if(node_temp.status == OS_STATUS_READY){ + _spccpy_(OS_TASKMGR_LEN_STA); + } + else if(node_temp.status == OS_STATUS_FLOATING || node_temp.status == OS_STATUS_BLOCKED){ + _spccpy_(OS_TASKMGR_LEN_STA - 4); + if(node_temp.status == OS_STATUS_FLOATING){ + _chrcpy_('~'); + } + else{ + _chrcpy_(' '); + } + 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_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; + case 1: _strcpy_("gro"); break; + case 2: _strcpy_("gro"); break; + case 4: _strcpy_("gro"); break; + } + } + else{ + _spccpy_(OS_TASKMGR_LEN_STA - 1); + if(node_temp.status == OS_STATUS_TIMEOUT){ + _chrcpy_('O'); + } + else if(node_temp.status & OS_STATUS_SUSPENDED){ + _chrcpy_('^'); + } + else if(node_temp.status == OS_STATUS_STOPPED){ + _chrcpy_('!'); + } + else{ + _chrcpy_('X'); + } + } + /* CPU */ + numerator2 = ( + ((node_temp.usedtime[0] * 10000UL) / upspeed) + + ((node_temp.usedtime[1] * 10000UL) / upspeed / MCUCFG_SYSTICK_COUNT1CYC) + ); + _used_ratio_(numerator2); + if(!node_temp.pri){ + numerator1 -= numerator2; + } + /* 内存 */ + _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 (SYSCFG_SAMEPRISCHEDULE) + if(node_curr == s_task_queue[i]->last){ + if(!i) break; + goto __TASKQUE_NEXT; + } + else{ + node_curr = node_temp.next; + } + #else + if(true){ + if(!i) break; + goto __TASKQUE_NEXT; + } + #endif + } + /* CPU总使用率 */ + if(true){ + char _XDATA_MEM_ *p0 = mptr; + mptr = p[0]; + _used_ratio_(numerator1); + mptr = p0; + } + + _strcpy_("\r\n"); /*!< null-line */ + /* 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_("| "); + /* 任务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_("| "); + /* 滴答时间 */ + _strcpy_("\xB5\xCE\xB4\xF0\xCA\xB1\xBC\xE4: "); + #if (SYSCFG_SYSTICKTIME_COUNT == __ENABLED__) + mSysIRQ_Disable(); + if(s_tick_count2){ + s_u32_t counter1 = s_tick_count1; + s_u32_t counter2 = s_tick_count2; + s_tick_count1 = 0; + s_tick_count2 = 0; + mSysIRQ_Enable(); + counter2 = (counter1 * 100) / counter2; + #if defined (MCUCFG_SYSCLK) && (MCUCFG_SYSCLK > 0) \ + && defined (MCUCFG_SYSTICK_CLKDIV) && (MCUCFG_SYSTICK_CLKDIV > 0) + counter2 = (counter2 * MCUCFG_SYSTICK_CLKDIV) / MCUCFG_SYSCLK; + #elif defined (MCUCFG_SYSTICK_CLK) && (MCUCFG_SYSTICK_CLK > 0) + counter2 = counter2 / MCUCFG_SYSTICK_CLK; + #else + #error SysTick CLK undefined! + #endif + _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"); + /* 系统警告 */ + _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.timeout_saferuntime){ + _strcpy_("srt, "); + } + if(s_alarm.outrange_taskpriority){ + _strcpy_("otp, "); + } + if(s_alarm.realloc_taskstack){ + _strcpy_("rts, "); + } + if(s_alarm.overflow_taskstack){ + _strcpy_("ots, "); + } + mptr -= 2; + } + else{ + _strcpy_("\xCE\xDE"); + } + _strcpy_("\r\n"); + /* 系统异常 */ + _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(); + if(true){ + #if (SYSCFG_SOFTRTC == __ENABLED__) + rtc = s_rtc; + #else + void rtc_hook(s_rtc_ts *t); + rtc_hook(&rtc); + #endif + } + 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 + + _strcpy_("\r\n"); /*!< null-line */ + _chrcpy_('\0'); /*!< string-tail */ + /* - */ + mSysIRQ_Disable(); + s_debug_sendtype |= OS_DEBUG_SEND_TASKMGR; + #if (SYSCFG_DEBUG_SENDLEN == __ENABLED__) + s_taskmgr_sendlen = (s_u16_t)(mptr - s_taskmgr_sendbuff - 1); + #endif + sa_suspend_task(s_task_current); + su_kernel_unlock0_psv(); + } +} +#undef _taskname + +#endif diff --git a/System/os_timing.c b/System/os_timing.c new file mode 100644 index 00000000..6a7290d1 --- /dev/null +++ b/System/os_timing.c @@ -0,0 +1,433 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_timing.c + * @brief 初始化定时中断、定时查询 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#include "os_var.h" + +#if (OS_TIMINTTOTAL > 0 || OS_TIMQRYTOTAL > 0) + +#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) +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#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) +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#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 os_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) + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #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) + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #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_DEBUGGER]->timer + = s_timqry_handle[OS_TMID_DEBUGGER]->reload + = 0; + #endif + s_timqry_handle[OS_TMID_TASKMGR]->timer + = s_timqry_handle[OS_TMID_TASKMGR]->reload + = (SYSCFG_TASKMGR_UPSPEED * 1000UL) / SYSCFG_SYSTICK_CYCLE; + #endif +} + +#endif diff --git a/System/os_var.c b/System/os_var.c new file mode 100644 index 00000000..eade9a95 --- /dev/null +++ b/System/os_var.c @@ -0,0 +1,135 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_var.c + * @brief 系统全局变量定义 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#include "os_redef.h" + +/* The Soft-RTC */ +#if (SYSCFG_SOFTRTC == __ENABLED__) +const s_u8_t _CONST_MEM_ s_month0day[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /*!< 每月各有几天?*/ + s_u8_t _RTC_MEM_ s_month2day = 28; /*!< 二月有几天?*/ + s_every_ts _SYS_MEM_ s_sign_every/**/sZeroInstall_Group; /*!< 每信号 */ + m_rtccount_t _SYS_MEM_ s_rtc_counter/**/sZeroInstall; /*!< RTC计数器 */ + s_rtc_ts _RTC_MEM_ s_rtc = {SYSCFG_MANUFACTUREDATE}; /*!< RTC */ +#endif +/* The Task */ +volatile m_bit_t /*_SYS_MEM_*/ s_sign_startup = true; +volatile s_schesign_tu _SYS_MEM_ s_sign_schedule = {{0, 1}}; /*!< 调度信号 */ +volatile m_bit_t /*_SYS_MEM_*/ s_sign_delay/**/sZeroInstall; /*!< 就绪延时信号 */ + s_u8_t _SYS_MEM_ s_schedulelock_counter/**/sZeroInstall;/*!< 调度锁嵌套计数器 */ + s_ecode_t _SYS_MEM_ s_startup_ecode = OS_ECODE_NOERROR; /*!< 启动任务时,用来异地缓存错误码 */ + s_u8_t _SYS_MEM_ s_task_status0 = OS_STATUS_DELETED; /*!< 被启动任务 -> 初始状态 */ + s_taskhand_tsp _SYS_MEM_ s_task_starter/**/sZeroInstall; /*!< 被启动任务 -> 装载块句柄 */ + s_tasknode_tsp _SYS_MEM_ s_task_current/**/sZeroInstall; /*!< 当前任务句柄 */ + s_tasknode_tsp s_timer_list[OS_TIMESLOTNUM]/**/sZeroInstall_Group; /*!< 定时器链表 */ + s_u8_t _SYS_MEM_ s_timer_pointer = OS_TIMESLOTNUM - 1UL; +#if (SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ && SYSCFG_TIMESHARINGMODE == 2) +const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY] = {SYSCFG_CUSTOMTIMESHARING}; /*!< 自定义时间片 -> 时间片数组 */ +#endif +#if (SYSCFG_KERNELLOCKNESTING == __ENABLED__) + s_u8_t _SYS_MEM_ s_kernellock_counter/**/sZeroInstall; /*!< 内核锁嵌套计数器 */ +#endif +/* The Safe runtime */ +#if (SYSCFG_SAFERUNTIME == __ENABLED__) + m_bit_t /*_SYS_MEM_*/ s_timeout_sign/**/sZeroInstall; /*!< 超时信号 */ + s_tasknode_tsp _SYS_MEM_ s_timeout_list = OS_VOID; /*!< 超时链表 */ +#endif +/* The Timing Interrupt */ +#if (OS_TIMINTTOTAL > 0) + s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL]; /*!< 定时中断句柄 */ +#endif +/* The Timing Query */ +#if (OS_TIMQRYTOTAL > 0) + s_timqryhand_tsp s_timqry_handle[OS_TIMQRYTOTAL]; /*!< 定时查询句柄 */ +#endif +/* The Task Message */ +#if (SYSCFG_TASKMSG == __ENABLED__) +volatile s_u8_t /*_SYS_MEM_*/ s_taskmsg_sign/**/sZeroInstall; /*!< 发送私信信号 */ +#endif +/* The Debug Interface */ +#if (SYSCFG_DEBUGGING == __ENABLED__) + m_bit_t /*_SYS_MEM_*/ s_debug_sendsign/**/sZeroInstall; + s_u8_t _SYS_MEM_ s_debug_sendtype/**/sZeroInstall; + s_u8_t _SYS_MEM_ s_debug_recvlen/**/sZeroInstall; + char * _XDATA_MEM_ s_debug_recvptr;/* + char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE]; +#if (SYSCFG_DEBUG_SENDLEN == __ENABLED__) + s_u16_t _XDATA_MEM_ s_cmdline_sendlen; +#endif*/ + m_bit_t /*_SYS_MEM_*/ s_taskmgr_sign = SYSCFG_TASKMGR_AUTOSTART; + char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE]; +#if (SYSCFG_DEBUG_SENDLEN == __ENABLED__) + s_u16_t _XDATA_MEM_ s_taskmgr_sendlen; +#endif + s_u32_t _DEBUG_MEM_ s_taskmgr_upspeed/**/sZeroInstall; + s_alarm_ts _DEBUG_MEM_ s_alarm/**/sZeroInstall_Group; + s_fault_ts _DEBUG_MEM_ s_fault/**/sZeroInstall_Group; +#if (SYSCFG_SYSTICKTIME_COUNT == __ENABLED__) + s_u32_t _DEBUG_MEM_ s_tick_count1/**/sZeroInstall; + s_u32_t _DEBUG_MEM_ s_tick_count2/**/sZeroInstall; +#endif +#if (SYSCFG_TASKPC_MONITOR == __ENABLED__) + m_pc_t _SYS_MEM_ s_pc/**/sZeroInstall; +#endif +#if (SYSCFG_RUNTIME_COUNT == __ENABLED__) + s_runtime_ts _DEBUG_MEM_ s_runtime/**/sZeroInstall_Group; +#endif +#endif +/* The Task */ +const s_u8_t _CONST_MEM_ s_task_pickmap[SYSCFG_TASKPICKBITMAP * 128] = +{ + #if (SYSCFG_TASKPICKBITMAP == 1) + /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F */ +/* 0 */ 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, +/* 1 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, +/* 2 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +/* 3 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +/* 4 */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* 5 */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* 6 */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* 7 */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 + #elif (SYSCFG_TASKPICKBITMAP == 2) + /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F */ +/* 0 */~0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, +/* 1 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +/* 2 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, +/* 3 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, +/* 4 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +/* 5 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +/* 6 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +/* 7 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +/* 8 */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* 9 */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* A */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* B */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* C */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* D */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* E */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* F */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 + #endif +}; /*!< Task pick bitmap */ +s_tasknode_tsp _QUE_MEM_ s_task_queue[SYSCFG_TASKPRIORITY]/**/sZeroInstall_Group; /*!< 任务队列 */ +m_tqcount_t _QUE_MEM_ s_task_queue_count/**/sZeroInstall; +#if (SYSCFG_TASKPRIORITY > 64) +s_u8_t _QUE_MEM_ s_task_table_index/**/sZeroInstall; /*!< 任务表索引 */ +s_u8_t _QUE_MEM_ s_task_bytes_index[SYSCFG_TASKPRIORITY / 64 + !!(SYSCFG_TASKPRIORITY % 64)]/**/sZeroInstall_Group; +s_u8_t _QUE_MEM_ s_task_ready_table[SYSCFG_TASKPRIORITY / 64 + !!(SYSCFG_TASKPRIORITY % 64)][8]/**/sZeroInstall_Group; +#elif (SYSCFG_TASKPRIORITY > 8) +s_u8_t _QUE_MEM_ s_task_bytes_index/**/sZeroInstall; /*!< 任务字节索引 */ +s_u8_t _QUE_MEM_ s_task_ready_table[SYSCFG_TASKPRIORITY / 8 + !!(SYSCFG_TASKPRIORITY % 8)]/**/sZeroInstall_Group; +#else +s_u8_t _QUE_MEM_ s_task_ready_table/**/sZeroInstall; /*!< 任务就绪表 */ +#endif +#if (SYSCFG_SAMEPRISCHEDULE) +s_u8_t _QUE_MEM_ s_task_ready_count[SYSCFG_TASKPRIORITY]/**/sZeroInstall_Group; +#elif (SYSCFG_MUTEX == __ENABLED__) +s_u8_t _SYS_MEM_ s_taskpri_ceiling = SYSCFG_BASEPRI_CEILING; /*!< 天花板优先级 */ +#endif +#if (MCUCFG_PENDSVFIFO_DEPTH > 0 && SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__) +s_ecode_t _SYS_MEM_ s_psvfifo_ecode; /*!< 中断挂起服务_FIFO-错误调用返回.错误码 */ +#endif diff --git a/System/os_var.h b/System/os_var.h new file mode 100644 index 00000000..7e44ae5d --- /dev/null +++ b/System/os_var.h @@ -0,0 +1,109 @@ +/**************************************************************************//** + * @item CosyOS-III Kernel + * @file os_var.h + * @brief 系统全局变量声明 + * @author 迟凯峰 + * @version V2.3.0 + * @date 2026.02.01 + ******************************************************************************/ + +#ifndef __OS_VAR_H +#define __OS_VAR_H +#include "os_redef.h" + +/* The Soft-RTC */ +#if (SYSCFG_SOFTRTC == __ENABLED__) +extern const s_u8_t _CONST_MEM_ s_month0day[13]; +extern s_u8_t _RTC_MEM_ s_month2day; +extern s_every_ts _SYS_MEM_ s_sign_every; +extern m_rtccount_t _SYS_MEM_ s_rtc_counter; +extern s_rtc_ts _RTC_MEM_ s_rtc; +#endif +/* The Task */ +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_startup; +extern volatile s_schesign_tu _SYS_MEM_ s_sign_schedule; +extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_delay; +extern s_u8_t _SYS_MEM_ s_schedulelock_counter; +extern s_ecode_t _SYS_MEM_ s_startup_ecode; +extern s_u8_t _SYS_MEM_ s_task_status0; +extern s_taskhand_tsp _SYS_MEM_ s_task_starter; +extern s_tasknode_tsp _SYS_MEM_ s_task_current; +extern s_tasknode_tsp s_timer_list[OS_TIMESLOTNUM]; +extern s_u8_t _SYS_MEM_ s_timer_pointer; +#if (SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__ && SYSCFG_TIMESHARINGMODE == 2) +extern const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY]; +#endif +#if (SYSCFG_KERNELLOCKNESTING == __ENABLED__) +extern s_u8_t _SYS_MEM_ s_kernellock_counter; +#endif +/* The Safe runtime */ +#if (SYSCFG_SAFERUNTIME == __ENABLED__) +extern m_bit_t /*_SYS_MEM_*/ s_timeout_sign; +extern s_tasknode_tsp _SYS_MEM_ s_timeout_list; +#endif +/* The Timing Interrupt */ +#if (OS_TIMINTTOTAL > 0) +extern s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL]; +#endif +/* The Timing Query */ +#if (OS_TIMQRYTOTAL > 0) +extern s_timqryhand_tsp s_timqry_handle[OS_TIMQRYTOTAL]; +#endif +/* The Task Message */ +#if (SYSCFG_TASKMSG == __ENABLED__) +extern volatile s_u8_t /*_SYS_MEM_*/ s_taskmsg_sign; +#endif +/* The Debug Interface */ +#if (SYSCFG_DEBUGGING == __ENABLED__) +extern m_bit_t /*_SYS_MEM_*/ s_debug_sendsign; +extern s_u8_t _SYS_MEM_ s_debug_sendtype; +extern s_u8_t _SYS_MEM_ s_debug_recvlen; +extern char * _XDATA_MEM_ s_debug_recvptr;/* +extern char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE]; +#if (SYSCFG_DEBUG_SENDLEN == __ENABLED__) +extern s_u16_t _XDATA_MEM_ s_cmdline_sendlen; +#endif*/ +extern m_bit_t /*_SYS_MEM_*/ s_taskmgr_sign; +extern char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE]; +#if (SYSCFG_DEBUG_SENDLEN == __ENABLED__) +extern s_u16_t _XDATA_MEM_ s_taskmgr_sendlen; +#endif +extern s_u32_t _DEBUG_MEM_ s_taskmgr_upspeed; +extern s_alarm_ts _DEBUG_MEM_ s_alarm; +extern s_fault_ts _DEBUG_MEM_ s_fault; +#if (SYSCFG_SYSTICKTIME_COUNT == __ENABLED__) +extern s_u32_t _DEBUG_MEM_ s_tick_count1; +extern s_u32_t _DEBUG_MEM_ s_tick_count2; +#endif +#if (SYSCFG_TASKPC_MONITOR == __ENABLED__) +extern m_pc_t _SYS_MEM_ s_pc; +#endif +#if (SYSCFG_RUNTIME_COUNT == __ENABLED__) +extern s_runtime_ts _DEBUG_MEM_ s_runtime; +#endif +#endif +/* The Task */ +extern const s_u8_t _CONST_MEM_ s_task_pickmap[SYSCFG_TASKPICKBITMAP * 128]; +extern s_tasknode_tsp _QUE_MEM_ s_task_queue[SYSCFG_TASKPRIORITY]; +extern m_tqcount_t _QUE_MEM_ s_task_queue_count; +#if (SYSCFG_TASKPRIORITY > 64) +extern s_u8_t _QUE_MEM_ s_task_table_index; +extern s_u8_t _QUE_MEM_ s_task_bytes_index[SYSCFG_TASKPRIORITY / 64 + !!(SYSCFG_TASKPRIORITY % 64)]; +extern s_u8_t _QUE_MEM_ s_task_ready_table[SYSCFG_TASKPRIORITY / 64 + !!(SYSCFG_TASKPRIORITY % 64)][8]; +#elif (SYSCFG_TASKPRIORITY > 8) +extern s_u8_t _QUE_MEM_ s_task_bytes_index; +extern s_u8_t _QUE_MEM_ s_task_ready_table[SYSCFG_TASKPRIORITY / 8 + !!(SYSCFG_TASKPRIORITY % 8)]; +#else +extern s_u8_t _QUE_MEM_ s_task_ready_table; +#endif +#if (SYSCFG_SAMEPRISCHEDULE) +extern s_u8_t _QUE_MEM_ s_task_ready_count[SYSCFG_TASKPRIORITY]; +#elif (SYSCFG_MUTEX == __ENABLED__) +extern s_u8_t _SYS_MEM_ s_taskpri_ceiling; +#endif +#if (MCUCFG_PENDSVFIFO_DEPTH > 0 && SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__) +extern s_ecode_t _SYS_MEM_ s_psvfifo_ecode; +#endif +extern void (_CODE_MEM_ * const _CONST_MEM_ sPendSV_FIFOHandler[OS_SVID_END])(void _STATIC_MEM_ *sv); + +#endif