OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 153|回复: 2

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

[复制链接]

  离线 

2

主题

9

帖子

0

精华

新手上路

Rank: 1

积分
37
金钱
37
注册时间
2018-1-4
在线时间
6 小时
发表于 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

回复

使用道具 举报

  离线 

0

主题

15

帖子

0

精华

初级会员

Rank: 2

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

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

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

回复

使用道具 举报

  离线 

2

主题

9

帖子

0

精华

新手上路

Rank: 1

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

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

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

使用道具 举报

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

本版积分规则




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

GMT+8, 2018-1-22 12:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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