硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3935|回复: 2
收起左侧

[FreeRTOS] 学习安富莱的例子测试出了问题,引发关于printf重入等问题的思考。

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2017-3-23 21:59:47 | 显示全部楼层 |阅读模式
我在学习安富莱测试栈溢出时候,使用栈溢出钩子函数vApplicationStackOverflowHook打印错误,却发现卡在了这里
QQ图片20170323212802.png

而此时查看查看窗口,发现串口字符打印不完整。隐约感觉是串口函数打印有关的问题,
由于这份程序是改过的,又解压了一份原版没改过的,仔细对比,这里有差别
QQ图片20170323213116.png

于是按照原版的,把#if 1改成 #if 0 ,使用下面的阻塞方式发数据。重新实验就正常了。

问题一:想问下安富莱的例子中断发串口数据跟阻塞方式发有规定什么场合下适用吗

问题二:现在这份程序里面的中断发数据方式注明说有一定bug,后面有完善了吗
QQ图片20170323213721.png


问题三:一个关于printf重入的问题。假如在不同task都调用了printf, 如果这个task中的printf没打印完,再另外一个printf中又开始打印,这样是重入函数了吗,会不会有问题,应该怎么操作保护一下呢。


问题四:  例子是通过串口将任务的执行状态,任务栈的使用情况以及各个任务的 CPU 使用率将其打印出来,但教程一再强调不可将其用于实际项目,原因有两点:
 FreeRTOS 的系统内核没有对总的计数时间做溢出保护。

      (1) 那我在应用中可以做溢出保护吗?是不是规定计数超过某个值回到0就可以?
 定时器中断是 50us 进入一次,比较影响系统性能。

      (2)是不是指每50us执行下面一段中断服务程序影响系统性能?
      void TIM6_IRQHandler( void )      {
    if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
    {
        ulHighFrequencyTimerTicks++;
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
    }
      }


     (3)如果我不需要知道 CPU 使用率,是不是这个定时器可以不用开了,那么以上两个问题就不存在?
      

问题五:实际项目中,调试手段是打印这种串口信息调试多,还是通过keil仿真直接调试多?如果是打印串口信息的手段,是怎样一种操作呢,是不是每隔一段时间把任务栈的使用情况以及各个任务的 CPU 使用率打印出来。还是有问题了才在具体的某个task中的某个地方放printf打印信息?



希望能在你们百忙中得到解答,感激不尽!
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2017-3-23 22:01:16 | 显示全部楼层
[s:150]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2017-3-24 00:08:22 | 显示全部楼层
1. 没有。
2. 没有。
3. 互斥就可以了。
4. 仅测试阶段使用。
5. 那个串口打印信息是查看任务堆栈使用情况用的,跟是否使用KEIL调试没有关系。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 20:57 , Processed in 0.161606 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表