硬汉嵌入式论坛

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

[FreeRTOS教程] 阻塞函数含有哪些?

[复制链接]

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2018-6-13 11:08:22 | 显示全部楼层 |阅读模式
在常规的周期性任务中,阻塞函数常用vTaskDelay(100ms)来释放cpu的使用权。

如果,周期性任务中还需要检测一个事件标志组,那么可以用这个来代替vTaskDelay吗?
xEventGroupWaitBits( xEventGroup, /* 事件标志组 句柄 */
uxBitsToWaitFor, /* 等待 被设置的事件标志位 */
xClearOnExit, /* 选择 是否 清零 被置位 的事件标志位 */
xWaitForAllBits, /* 选择是否 等待所有标志位都被设置 */
100ms ); /* 设置 等待时间 */


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2018-6-13 11:11:22 | 显示全部楼层
没问题,可以的。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-6-13 11:14:08 | 显示全部楼层
eric2013 发表于 2018-6-13 11:11
没问题,可以的。

有个疑问,如果标志位突然来了,那么这个函数的100ms周期就被破坏了,这么怎么搞?

这个任务中有两个函数runA和runB,runA是需要100ms的周期执行一次,runB需要根据标志位来执行或者跳过。应该怎么设计?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2018-6-13 11:23:21 | 显示全部楼层
caicaptain2 发表于 2018-6-13 11:14
有个疑问,如果标志位突然来了,那么这个函数的100ms周期就被破坏了,这么怎么搞?

这个任务中有两个 ...

这种的还是两个任务更方便,不适合组合到一起。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-6-13 11:39:10 | 显示全部楼层
eric2013 发表于 2018-6-13 11:23
这种的还是两个任务更方便,不适合组合到一起。

这个也是迫不得已啊。 runA和runB要操作同一个芯片,且操作过程中不能打断。
所以不得不放到一个任务中。。。。。还有啥解决方法?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2018-6-13 13:41:58 | 显示全部楼层
caicaptain2 发表于 2018-6-13 11:39
这个也是迫不得已啊。 runA和runB要操作同一个芯片,且操作过程中不能打断。
所以不得不放到一个任务中 ...

你可以弄个1ms的等待延迟。统计够100次了执行一次,这样即使在1ms内处理了A功能也不怎么影响B的执行。100ms的抖动很小。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-6-13 13:59:45 | 显示全部楼层
eric2013 发表于 2018-6-13 13:41
你可以弄个1ms的等待延迟。统计够100次了执行一次,这样即使在1ms内处理了A功能也不怎么影响B的执行。100 ...

可以可以一个任务中同时使用2个阻塞函数? 比如这样:
runA();
xEventGroupWaitBits(x,B标志,x,x,1ms); 阻塞延时1ms
if(标志符合), runB();
vTaskDelay(99ms);



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2018-6-13 15:32:22 | 显示全部楼层
caicaptain2 发表于 2018-6-13 13:59
可以可以一个任务中同时使用2个阻塞函数? 比如这样:
runA();
xEventGroupWaitBits(x,B标志,x,x,1ms); ...

这种方式有个缺点,就是函数vTaskDelay(99ms);执行期间,你的事件标志是无法得到及时执行的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 04:16 , Processed in 0.196601 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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