硬汉嵌入式论坛

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

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

[复制链接]

1

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2018-1-4 21:03:32 | 显示全部楼层 |阅读模式
  • 建立两个任务Task1和Task2分别进行打印任务。
  1. void vTask1(void *pvParameters)
  2. {
  3.     const char *pcTaskName = "Task 1 is running\r\n";
  4.     volatile uint32_t ul = 0;
  5.     for ( ;; )
  6.     {
  7.         vPrintString(pcTaskName);
  8.         for (ul=0; ul<mainDELAY_LOOP_COUNT; ul++)
  9.         {
  10.         }
  11.     }
  12. }

  13. void vTask2(void *pvParameters)
  14. {
  15.     const char *pcTaskName = "Task 2 is running\r\n";
  16.     volatile uint32_t ul = 0;
  17.     for ( ;; )
  18.     {
  19.         vPrintString(pcTaskName);
  20.         for (ul=0; ul<mainDELAY_LOOP_COUNT; ul++)
  21.         {
  22.         }
  23.     }
  24. }
复制代码
  • 当采用官方手册推荐加临界段打印,代码如下:
  1. void vPrintString(const char *pcString)
  2. {
  3.     taskENTER_CRITICAL();
  4.     {
  5.         printf("%s", pcString);
  6.         fflush(stdout);
  7.     }
  8.     taskEXIT_CRITICAL();
  9. }
复制代码
此时,“Task 1 is running”和“Task 2 is running”同时显示。

加临界段.PNG
  • 当注释掉临界段后,代码如下:
  1. void vPrintString(const char *pcString)
  2. {
  3. //taskENTER_CRITICAL();
  4. {
  5. printf("%s", pcString);
  6. fflush(stdout);
  7. }
  8. //taskEXIT_CRITICAL();
  9. }
复制代码
此时,“Task 1 is running”和“Task 2 is running”正常交替显示。


临界段注释掉.PNG

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-1-5 01:15:47 | 显示全部楼层
用了FreeRTOS的话,就不需要用这种延迟了,for (ul=0; ul<mainDELAY_LOOP_COUNT; ul++)

改成使用FreeRTOS自带的延迟函数vTaskDelay,测试下看看是否正常了。
回复

使用道具 举报

1

主题

2

回帖

60

积分

初级会员

积分
60
发表于 2018-1-5 11:53:47 | 显示全部楼层
eric2013 发表于 2018-1-5 01:15
用了FreeRTOS的话,就不需要用这种延迟了,for (ul=0; ul

谢谢,但是为了测试官方的例子,延时就是用for循环来做的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-1-5 11:56:22 | 显示全部楼层
bigvan_tech 发表于 2018-1-5 11:53
谢谢,但是为了测试官方的例子,延时就是用for循环来做的。

学习我们的教程吧,认识会更全面些:http://www.armbbs.cn/forum.php?m ... &extra=page%3D1

ps:你楼主位的账号是不是登陆不上了,通过邮箱可以找回密码的。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2018-3-7 14:49:35 | 显示全部楼层
bigvan_tech 发表于 2018-1-5 11:53
谢谢,但是为了测试官方的例子,延时就是用for循环来做的。

延时用for循环来做的目的是什么?freertos的延时另外具有阻塞等功能,抛开不用不出问题才怪。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 02:47 , Processed in 0.188899 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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