NXP Rapid IoT源代码中很丰富,虽然知道使用FreeRTOS的但是代码的嵌套异常的复杂,对分析起来带来了困难。所以想通过FreeRTOS自身的vTaskList与 vTaskGetRunTimeStats 输出自身运行任务的情况 效果如下:
上面截图中打印出来的任务状态字母 B, R, D, S 对应如下含义:
#define tskBLOCKED_CHAR ( 'B' ) 任务阻塞
#define tskREADY_CHAR ( 'R' ) 任务就绪
#define tskDELETED_CHAR ( 'D' ) 任务删除
#define tskSUSPENDED_CHAR ( 'S' ) 任务挂起
另外要注意剩余栈的单位是 word,即 4 字节。
一、修改宏
.\RapidIot_Base\middleware\wireless\framework\Common\rtos\FreeRTOS\config\FreeRTOSConfig.h 修改以下宏
- /* Run time and task stats gathering related definitions. */
- #define configUSE_TRACE_FACILITY 1
- #define configGENERATE_RUN_TIME_STATS 1
- #define configUSE_STATS_FORMATTING_FUNCTIONS 1
- /* Ensure stdint is only used by the compiler, and not the assembler. */
- #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
- #include <stdint.h>
- extern volatile uint32_t ulHighFrequencyTimerTicks;
- #endif
- #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (ulHighFrequencyTimerTicks = 0ul)
- #define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks
二、添加以下代码
- /*
- *********************************************************************************************************
- *
- * 模块名称 : FreeRTOS任务信息
- * 文件名称 :
- * 版 本 : V1.0
- * 说 明 : 为了获取FreeRTOS的任务信息,需要创建一个定时器,这个定时器的时间基准精度要高于
- * 系统时钟节拍。这样得到的任务信息才准确。
- * 本文件提供的函数仅用于测试目的,切不可将其用于实际项目,原因有两点:
- * 1. FreeRTOS的系统内核没有对总的计数时间做溢出保护。
- * 2. 定时器中断是50us进入一次,比较影响系统性能。
- * --------------------------------------------------------------------------------------
- * 本文件使用的是32位变量来保存50us一次的计数值,最大支持计数时间:
- * 2^32 * 50us / 3600s = 59.6分钟。使用中测试的任务运行计数和任务占用率超过了59.6分钟将不准确。
- *
- *
- *********************************************************************************************************
- */
- #include <string.h>
- #include "fsl_pit.h"
- #include "clock_config.h"
- #include "fsl_os_abstraction.h"
- #include "fsl_os_abstraction_free_rtos.h"
- //#include "cmsis_os.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "timers.h"
- #include "queue.h"
- #include "semphr.h"
- #include "event_groups.h"
- #include "shell.h"
- #include "atmosphere_platform.h"
- /* 定时器频率,50us一次中断 */
- #define timerINTERRUPT_FREQUENCY 20000
- /* 中断优先级 */
- #define timerHIGHEST_PRIORITY 2
- /* 被系统调用 */
- volatile uint32_t ulHighFrequencyTimerTicks = 0UL;
- static int8_t shell_cmdTaskInfo(uint8_t argc, char * argv[]);
- const cmd_tbl_t CommandTask_Ver =
- { .name = "taskinfo",
- .maxargs = 2,
- .repeatable = 1,
- .cmd = shell_cmdTaskInfo,
- .usage = "print FreeRTOS Info ",
- #if SHELL_USE_AUTO_COMPLETE
- .complete = NULL,
- #endif
- .help = NULL };
- static int8_t shell_cmdTaskInfo(uint8_t argc, char * argv[])
- {
- char* pcWriteBuffer=NULL;
- pcWriteBuffer = (char*) ATMO_Malloc(512);
- if (pcWriteBuffer)
- {
- shell_write("=================================================\r\n");
- shell_write("Task State Prio ReStack Num\r\n");
- vTaskList((char *) pcWriteBuffer);
- shell_writeN(pcWriteBuffer,strlen(pcWriteBuffer));
- shell_write("\r\nTask Count Usage\r\n");
- vTaskGetRunTimeStats((char *) pcWriteBuffer);
- shell_writeN(pcWriteBuffer,strlen(pcWriteBuffer));
- ATMO_Free(pcWriteBuffer);
- } else {
- shell_write("FreeRtos TaskInfo Error\r\n");
- }
- return CMD_RET_SUCCESS;
- }
- /*
- *********************************************************************************************************
- * 函 数 名: vSetupTimerTest
- * 功能说明: 创建定时器
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void vAFreeRtosTaskInfoInit(void)
- {
- /* Structure of initialize PIT */
- pit_config_t pitConfig;
- /*
- * pitConfig.enableRunInDebug = false;
- */
- PIT_GetDefaultConfig(&pitConfig);
- /* Init pit module */
- PIT_Init(PIT, &pitConfig);
- /* Set timer period for channel 0 */
- PIT_SetTimerPeriod(PIT, kPIT_Chnl_0,
- USEC_TO_COUNT(50U, CLOCK_GetFreq(kCLOCK_BusClk)));
- /* Enable timer interrupts for channel 0 */
- PIT_EnableInterrupts(PIT, kPIT_Chnl_0, kPIT_TimerInterruptEnable);
- /* Enable at the NVIC */
- EnableIRQ(PIT0_IRQn);
- shell_register_function((cmd_tbl_t *)&CommandTask_Ver);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: PIT0_IRQHandler
- * 功能说明: PIT0中断服务程序。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void PIT0_IRQHandler(void)
- {
- /* Clear interrupt flag.*/
- PIT_ClearStatusFlags(PIT, kPIT_Chnl_0, kPIT_TimerFlag);
- ulHighFrequencyTimerTicks++;
- }
- /********************************************* (END OF FILE) *********************************/
调用初始化函数void vAFreeRtosTaskInfoInit(void),然后通过串口输出 taskinfo,就能输出相应的任务情况
通过上述的调试,获取相应的创建任务的情况 以及相关的任务函数 分别如下:
1、
.\RapidIot_Base\middleware\wireless\framework\OSAbstraction\Source\fsl_os_abstraction_free_rtos.c
int main (void) 创建 startup_task 任务
2、
.\RapidIot_Base\rtos\freertos\Source\tasks.c
void vTaskStartScheduler( void )创建 IDLE 任务
3、
.\RapidIot_Base\rtos\freertos\Source\timers.c
BaseType_t xTimerCreateTimerTask( void ) 创建 prvTimerTask任务
4、
.\app_src\app_emwin.c
void emWinTaskInit(void)创建 emWinTask 任务
5、
.\RapidIot_Base\middleware\wireless\framework\SerialManager\Source\SerialManager.c
void SerialManager_Init( void ) 创建 SerialManagerTask 任务
6、
.\RapidIot_Base\middleware\wireless\framework\TimersManager\Source\TimersManager.c
void TMR_Init(void) 创建 TMR_Task任务
7、
.\RapidIot_Base\middleware\wireless\framework\SerialManager\Source\USB_VirtualCom\virtual_com.c
void* VirtualCom_Init(uint8_t param)创建 USB_DeviceTask任务
8、
.\gpio\gpio_mk64f.c
ATMO_GPIO_Status_t ATMO_MK64F_GPIO_Init(ATMO_DriverInstanceData_t *instance)
创建 ATMO_MK64F_GPIO_RXQueueChecker ATMO_MK64F_GPIO_ButtonResetChecker任务
9、
.\interval\interval_mk64f.c
ATMO_INTERVAL_Status_t ATMO_MK64F_INTERVAL_Init(ATMO_DriverInstanceData_t *instance)
ATMO_INTERVAL_Status_t ATMO_MK64F_INTERVAL_AddCallbackInterval(ATMO_DriverInstanceData_t *instance, ATMO_Callback_t cb, unsigned int interval, ATMO_INTERVAL_Handle_t *intervalHandle)
创建 intervalTask 任务
此内容由EEWORLD论坛网友dvd1478原创,如需转载或用于商业用途需征得作者同意并注明出处