STM32
直播中

杨帆

7年用户 1397经验值
私信 关注
[问答]

用cube生成了freertos工程,想实现串口输出调试信息卡住了的原因?怎么解决?

用cube生成了freertos工程,想用串口输出调试信息,参考的安富莱和硬石的教程。

新建工程后,有些相关宏定义需要在freertosconfig.h文件里使能,安富莱教程里是这么说的:
-----------------------------------------------------------------------------
需要在FreeRTOSConfig.h文件中使能如下宏定义:
/* Ensure stdint is only used by the compiler, and not assembler. */
#if defined(__ICCARM__) || CC_ARM) GNUC__)
#include  
extern volatile uint32_t ulHighFrequencyTimerTicks;
#endif

/* Run time and task stats gathering r elated definitions. */
#define configUSE_TRACE_FACILITY 1
#define configGENERATE_RUN_TIME_STATS 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (ulHighFrequencyTim erTicks = 0ul)
#define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks
-------------------------------------------------------------------------------
以上部分中的变量ulHighFrequencyTimerTicks,生成工程时自带了。
5个宏定义里,configUSE_TRACE_FACILITY 也是自动生成的;
configGENERATE_RUN_TIME_STATS是配置cube选相时,有个选项勾选后会生成的;
configUSE_STATS_FORMATTING_FUNCTIONS是自己手动添加进去的;

后两个宏定义,cube生成时是这样的:
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue
而configureTimerForRunTimeStats()和getRunTimeCounterValue()对应两个weak函数,我修改成这样了:
__weak void configureTimerForRunTimeStats(void)
{
ulHighFrequencyTimerTicks = 0ul;
}
__weak unsigned long getRunTimeCounterValue(void)
{
return ulHighFrequencyTimerTicks;
// return 0;
}

教程里说还要定义个定时器,定时值要比freertos系统定时器要小。
我就用TIM4定义了个基本定时器,在其回调函数里,使ulHighFrequencyTimerTicks自加一。

任务共定义了三个,其中一个是让LED一秒反转一次。一个是一秒调用一次void vTaskList( char * pcWriteBuffer )函数并用串口1输出出来。第三个任务空。
结果LED灯不闪。屏蔽调void vTaskList( char * pcWriteBuffer )这个函数调用,就正常了。


求教:是不是有哪些地方遗漏了?望指出来。

回帖(1)

陈小鸥

2024-5-8 15:07:01
仔细检查下串口设置,可以试一下串口是否正常,在串口初始化完成后Freertos任务创建前发一条信息,看一看输出是否正常,假设正常那就是在任务中因为信号量的问题堵住了,可以跟踪一下,看看是哪条语句堵住的,然后再查原因(着重查看下堆栈的问题,Freescale设置不好有时在创建任务时可能溢出)。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分