请选择 进入手机版 | 继续访问电脑版

安富莱电子论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 259|回复: 6
收起左侧

[FreeRTOS] freeRTOS任务里如何防止阻塞跳出本任务

[复制链接]

2

主题

12

帖子

16

积分

新手上路

积分
16
发表于 2018-11-7 10:39:55 | 显示全部楼层 |阅读模式
比如我有一个任务函数
void vTaskCharge(void *pvParameters)
{
    while(1)
    {
        GetBatVolage();
        ChargeProc();
        HotProtect();
        vTaskDelay(10);
    }
}

这个任务里,有三个函数,GetBatVolage()检测电池电压;ChargeProc()负责充电;HotProtect()过热保护。
比如,在GetBatVolage();需要等待一个事件,我采用xEventGroupWaitBits();这个时候,它会产生一个时间等待阻塞,自动跳出任务。这样,程序就无法实时跟踪ChargeProc();和HotProtect();,需要等到xEventGroupWaitBits()超时或等到事件标志满足,才能下去。
而如果我采用3个任务的话,那么整个程序里,会有非常多的任务,五花八门,很不好管理。
请问这这么解决?
回复

使用道具 举报

24

主题

1264

帖子

1312

积分

至尊会员

积分
1312
发表于 2018-11-7 11:22:43 | 显示全部楼层
你这个问题看着挺简单的啊。
你的ChargeProc()负责充电;HotProtect()过热保护是10ms执行一次吗,是的话,xEventGroupWaitBits();配置个10ms的延迟不就行了。

如果都是事件触发方式的,设置三个等待标志就好了,这种的是最佳方案。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

2

主题

12

帖子

16

积分

新手上路

积分
16
 楼主| 发表于 2018-11-7 11:27:40 | 显示全部楼层
byccc 发表于 2018-11-7 11:22
你这个问题看着挺简单的啊。
你的ChargeProc()负责充电;HotProtect()过热保护是10ms执行一次吗,是的话, ...

您的意思是不是这样?
GetBatVolage()
{
//   dosomething;
      vTaskDelay(10);
}

ChargeProc()
{
//   dosomething;
      vTaskDelay(10);
}

HotProtect()
{
//   dosomething;
      vTaskDelay(10);
}
那么,当我处理GetBatVolage()时,它执行到vTaskDelay(10);会退出任务,并没有执行ChargeProc()
回复

使用道具 举报

24

主题

1264

帖子

1312

积分

至尊会员

积分
1312
发表于 2018-11-7 11:30:38 | 显示全部楼层
Clare.Chen 发表于 2018-11-7 11:27
您的意思是不是这样?
GetBatVolage()
{

不是,是函数xEventGroupWaitBits()配置个10ms的延迟。

不是有个延迟参数么,而且可以设置等待多个事件标志的。想执行那个标志,等待那个标志就行。

你得把这几个函数的要领好好熟悉下。感觉你还没入门啊。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

2

主题

12

帖子

16

积分

新手上路

积分
16
 楼主| 发表于 2018-11-7 11:35:03 | 显示全部楼层
byccc 发表于 2018-11-7 11:30
不是,是函数xEventGroupWaitBits()配置个10ms的延迟。

不是有个延迟参数么,而且可以设置等待多个事 ...

您说的是都是等待10ms,如果是一个等待10ms,一个等100ms,一个等1s,这种情况呢?
回复

使用道具 举报

24

主题

1264

帖子

1312

积分

至尊会员

积分
1312
发表于 2018-11-7 13:13:00 | 显示全部楼层
Clare.Chen 发表于 2018-11-7 11:35
您说的是都是等待10ms,如果是一个等待10ms,一个等100ms,一个等1s,这种情况呢?

看这个帖子,这位老铁经过指导已经上手

http://forum.armfly.com/forum.ph ... ;tid=90083#lastpost
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

2

主题

12

帖子

16

积分

新手上路

积分
16
 楼主| 发表于 2018-11-7 14:01:43 | 显示全部楼层
byccc 发表于 2018-11-7 13:13
看这个帖子,这位老铁经过指导已经上手

http://forum.armfly.com/forum.php?mod=viewthread&tid=90083 ...

谢谢你的意见。我觉得您说的是比较单一的命令,可以这么做。
请看这个的说法,这种情况才是项目里经常遇到的。
http://forum.armfly.com/forum.ph ... ypeid%26typeid%3D30
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|安富莱电子论坛 ( 鄂ICP备09023347号,公安机关备案号42010602000201 )

GMT+8, 2019-4-23 22:16 , Processed in 0.178996 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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