你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用cube生成了freertos工程,想实现串口输出调试信息,卡住了

[复制链接]
any012 提问时间:2017-1-16 12:49 /
悬赏10ST金币已解决
本帖最后由 any012 于 2017-1-16 12:50 编辑

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

新建工程后,有些相关宏定义需要在freertosconfig.h文件里使能,安富莱教程里是这么说的:
-----------------------------------------------------------------------------
需要在FreeRTOSConfig.h文件中使能如下宏定义:
/* Ensure stdint is only used by the compiler, and not assembler. */
#if defined(__ICCARM__) || CC_ARM) GNUC__)
#include <stdint.h>
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 )这个函数调用,就正常了。


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

FREERTOS_TEST_V1_1_0.zip (3.83 MB, 下载次数: 54)

最佳答案

查看完整内容

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

举报

8个回答
中山无雪 回答时间:2017-1-16 12:49:08
仔细检查下串口设置,可以试一下串口是否正常,在串口初始化完成后Freertos任务创建前发一条信息,看一看输出是否正常,假设正常那就是在任务中因为信号量的问题堵住了,可以跟踪一下,看看是哪条语句堵住的,然后再查原因(着重查看下堆栈的问题,Freescale设置不好有时在创建任务时可能溢出)。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

any012 回答时间:2017-1-16 13:49:07
本帖最后由 any012 于 2017-1-16 13:50 编辑

在串口初始化完成后加了句:硬件初始化完成
在任务创建完,任务调度开始前,加了句:FreeRTOS初始化完成
然后串口输出如下:

硬件初始化完成
FreeRTOS初始化完成
=================================================
任务名      任务状态 优先级   剩余栈 任务序号


以上为串口输出的数据,硬件是没问题的。
就是执行到
vTaskList((char *)&pcWriteBuffer);
这一句,就不走了。

虽然声明了信号量,但我建的这两个任务里没用到信号量吧?
any012 回答时间:2017-1-16 13:53:34
用stlink调试,发现可以进入TIM2中断,ulHighFrequencyTimerTicks也是在不断自加,只不过加到一定值胡就不变了。
TIM2中断优先级设为5.
any012 回答时间:2017-1-16 16:08:18
找到问题了,输出调试信息这个任务的栈,给的太小了。
我参考的例程,给的是2K的栈,我由于用的单片机RAM较小,就给了512字节的栈。结果这个任务里定义了个500字节的数组,不够用了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

any012 回答时间:2017-1-16 16:20:35
想就着这个帖子,再问写freertos相关的问题。

学会了创建简单的任务。但还是不知道在实际中如何应用。
我现在想把串口部分做进去。打算用DMA+空闲中断,那么是不是必须要定义个一个全局变量来存放接收到的数据?
我看例程里都是各任务里再建各自的变量。
那么串口处理部分函数,是不是和任务函数是同级别的关系?都能调用任务API?
中山无雪 回答时间:2017-1-18 21:17:33
在所有的涉及到中断的开发中,在中断处理函数中都要尽量减少中断函数的处理时间,这是原则。

在基于RTOS的开发中,各种数据的处理、存取等都应该在任务里面处理,中断和任务之间通过信号进行同步,任务之间也通过信号、Mutex等进行同步,任务之间通过消息队列、Mail等进行数据交换。

可以直接使用串口函数
中山无雪 回答时间:2017-1-18 21:18:30
any012 发表于 2017-1-16 16:08
找到问题了,输出调试信息这个任务的栈,给的太小了。
我参考的例程,给的是2K的栈,我由于用的单片机RAM较 ...

做RTOS开发时这是最经常出现的问题
海迹天涯 回答时间:2017-1-20 16:12:16
我之前也在这里纠结了很久,不过后来我弄成功了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版