本帖最后由 小恩GG 于 2020-4-20 15:36 编辑
【经验分享】RT freertos MCUXpresso工程添加runtime
一, 文档说明
在调试RT freertos MCUXpresso SDK工程的时候,很多网友需要添加查看每个task的runtime的功能。可以知道该功能可以在MCUXpressoIDE的TASK List(FreeRTOS)中调出来:Windows->show view->other->MCUXpressoIDE FreeRTOS->Task List(FreeRTOS),如下图:
但是在运行的RTSDK的工程的时候,会发现Runtime栏目是一个问号,如下:
那么如何配置出具体的Runtime呢?
实际上,我们有个国外的IDE专家写过一篇基于Kinetis K64的freertos runtime添加案例:
RT的SDK freertos runtime添加和kinetis类似,同样需要添加一个硬件timer去做runtime的记录。K64使用的是FTM, RT没有FTM的模块,可以换其他的timer,本文使用PIT硬件定时器去添加到RT freetos代码中,实现MCUXpresso SDK工程的runtime功能。
软硬件准备如下:
MIMXRT1064-EVK SDK_2.7.0_EVK-MIMXRT1064 MCUXpressIDE
二,具体步骤
2.1 导入SDK工程
本文以SDKfreertos hello工程为基础:
SDK_2.7.0_EVK-MIMXRT1064\boards\evkmimxrt1064\rtos_examples\freertos_hello
2.2 添加PIT硬件配置
配置的硬件定时器时间需要至少是RTOS tick时间10倍,从FreeRTOSConfig.h中可以看到RTOS tick时间:
#define configTICK_RATE_HZ ((TickType_t)200)
所以,需要配置PIT的定时时间为200*10=2Khz
配置好之后,点击update code,更新PIT外设驱动到工程的相关代码中。
拷贝SDK中的pit.c, pit.h到导入MCUXpresso 工程的driver folder中
SDK pit驱动路径:
SDK_2.7.0_EVK-MIMXRT1064\devices\MIMXRT1064\drivers
2.3 修改代码
2.3.1 freertos_hello.c
添加头文件
- #include "peripherals.h"
- #include "fsl_pit.h"
复制代码
添加PIT 中断服务函数
- static uint32_t RTOS_RunTimeCounter;/*runtime counter, used for configGENERATE_RUNTIME_STATS */
- /* PIT_IRQn interrupt handler */
- void PIT_IRQHANDLER(void) {
- /* Clear interrupt flag.*/
- PIT_ClearStatusFlags(PIT,kPIT_Chnl_0,PIT_TFLG_TIF_MASK);
- RTOS_RunTimeCounter++; /* increment runtimecounter */
- }
复制代码
添加runtime相关代码
- void RTOS_AppConfigureTimerForRuntimeStats(void) {
- RTOS_RunTimeCounter = 0;
- EnableIRQ(PIT_IRQn);
- }
- uint32_t RTOS_AppGetRuntimeCounterValueFromISR(void) {
- return RTOS_RunTimeCounter;
- }
复制代码
Main函数添加外设调用
- BOARD_InitBootPeripherals();
复制代码
Hello_task任务函数把挂起改为vTaskDelay.
- static void hello_task(void *pvParameters)
- {
- for (;;)
- {
- PRINTF("Hello world.\r\n");
- // vTaskSuspend(NULL);
- vTaskDelay(pdMS_TO_TICKS(100));//kerry
- }
- }
复制代码
2.3.2 FreeRTOSConfig.h
Run time宏定义打开
- #defineconfigGENERATE_RUN_TIME_STATS 1
- #defineconfigUSE_TRACE_FACILITY 1
复制代码
添加runtime的宏定义相关代码
- extern void RTOS_AppConfigureTimerForRuntimeStats(void);
- #defineportCONFIGURE_TIMER_FOR_RUN_TIME_STATS() RTOS_AppConfigureTimerForRuntimeStats()
- extern uint32_t RTOS_AppGetRuntimeCounterValueFromISR(void);
- #define portGET_RUN_TIME_COUNTER_VALUE() RTOS_AppGetRuntimeCounterValueFromISR()
复制代码
到目前为止,所有代码以及修改完毕。
三,测试结果
下面进行烧录到MIMXRT1064-EVK测试:
上图中Task List中runtime,可以看到hello_task, IDLE的runtime 百分比情况,以已经实现runtime观察功能。 |