OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 1425|回复: 4

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

[复制链接]

  离线 

2

主题

9

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-1-4
在线时间
7 小时
发表于 2018-1-4 20:37:46 | 显示全部楼层 |阅读模式
1金钱
  • 建立两个任务Task1和Task2分别进行打印任务。
[C] 纯文本查看 复制代码
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++)
	{
	}
    }
}


  • 当采用官方手册推荐加临界段打印,代码如下:
[C] 纯文本查看 复制代码
void vPrintString(const char *pcString)
{
    taskENTER_CRITICAL();
    {
        printf("%s", pcString);
        fflush(stdout);
    }
    taskEXIT_CRITICAL();
}


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


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

回复

使用道具 举报

  离线 

2

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
855
金钱
855
注册时间
2017-12-11
在线时间
170 小时
发表于 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

主题

37

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

15

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-21 00:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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