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

用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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版