OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6873|回复: 4

FreeRTOS加临界段后串口打印错误

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-1-4
在线时间
7 小时
发表于 2018-1-4 20:37:46 | 显示全部楼层 |阅读模式
1金钱
  • 建立两个任务Task1和Task2分别进行打印任务。
[mw_shl_code=c,true]void vTask1(void *pvParameters)
{
    const char *pcTaskName = "Task 1 is running\r\n";
    volatile uint32_t ul = 0;
    for ( ;; )
    {
        vPrintString(pcTaskName);
        for (ul=0; ul<mainDELAY_LOOP_COUNT; ul++)
        {
        }
    }
}

void vTask2(void *pvParameters)
{
    const char *pcTaskName = "Task 2 is running\r\n";
    volatile uint32_t ul = 0;
    for ( ;; )
    {
        vPrintString(pcTaskName);
        for (ul=0; ul<mainDELAY_LOOP_COUNT; ul++)
        {
        }
    }
}[/mw_shl_code]

  • 当采用官方手册推荐加临界段打印,代码如下:
[mw_shl_code=c,true]void vPrintString(const char *pcString)
{
    taskENTER_CRITICAL();
    {
        printf("%s", pcString);
        fflush(stdout);
    }
    taskEXIT_CRITICAL();
}[/mw_shl_code]

此时,“Task 1 is running”和“Task 2 is running”同时显示。
加临界段.PNG
  • 当注释掉临界段后,代码如下:
[mw_shl_code=c,true]void vPrintString(const char *pcString)
{
//taskENTER_CRITICAL();
{
printf("%s", pcString);
fflush(stdout);
}
//taskEXIT_CRITICAL();
}[/mw_shl_code]

此时,“Task 1 is running”和“Task 2 is running”正常交替显示。
临界段注释掉.PNG

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2027
金钱
2027
注册时间
2017-12-11
在线时间
452 小时
发表于 2018-1-4 21:15:02 | 显示全部楼层
由于本人没有实际测试,仅仅是猜测,如果错误,还请包涵并指教。

情况1:加临界段,两个任务同时显示在串口上。
情况2:不加临界段,两个任务分时显示在串口上。
请问,这个有什么问题吗?为什么说是错误?

首先,printf是很耗时的,一般以ms为单位。
其次,考虑加临界段情况,也就是在printf的时候关闭中断,在这段时间内,task1和task2陆续都进入就绪态,于是在退出临界段后(此时打开中断),2个任务都讯速进入运行态(时间上有先后,但是这个时间很短)看上去就像同时打印。

回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-1-4
在线时间
7 小时
 楼主| 发表于 2018-1-4 21:24:18 | 显示全部楼层
bootblack 发表于 2018-1-4 21:15
由于本人没有实际测试,仅仅是猜测,如果错误,还请包涵并指教。

情况1:加临界段,两个任务同时显示在 ...

谢谢解答,为了测试,Task1和Task2采用for循环进行演示,for循环大约会延时7s左右,远远大于临界关中断和开中断的时间。
回复

使用道具 举报

14

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2016-3-11
在线时间
51 小时
发表于 2018-1-30 15:37:35 | 显示全部楼层
同样是freertos和两个任务同时串口发送队列数据,两个任务优先级相同,为什么串口回来的数据是乱的,比如正常应该串口应该打印是send1,或send2,串口回来的数据是sesend1nd2,是某个任务打断了另一个任务吗?两个相同优先级的任务会发生这种情况吗?
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2018-2-6 14:03:18 | 显示全部楼层
不管什么操作系统,用for循环实现的延时都是要独占cpu的,这个时间是不可能省掉的。
所以你这个结果挺奇怪的,本来是7秒发一条信息;加了临界区保护以后反而7秒能发2条信息,明显超出了物理极限。
你看看是不是晶振没焊好,或者换个串口助手试试
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-31 21:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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