/**************************************************************************//** * @item CosyOS-III Kernel * @file os_debug.c * @brief DEBUG接口 * @details DEBUG接口,串口发送和接收解析。 * @author 迟凯峰 * @version v3.0.0 * @date 2026.07.21 ******************************************************************************/ #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_(char const *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"
标准/兼容模式:[中文:"系统调试器",英文:"Debugger"] \return 无 \note 定时查询任务 */ #if (SYSCFG_DEBUG_LANGUAGE == 0) #define _taskname "Debugger" #else #define _taskname "\xCF\xB5\xCD\xB3\xB5\xF7\xCA\xD4\xC6\xF7" /*!< "系统调试器" */ #endif 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