硬汉嵌入式论坛

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

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

[复制链接]

2

主题

10

回帖

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个任务的话,那么整个程序里,会有非常多的任务,五花八门,很不好管理。
请问这这么解决?
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

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

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

使用道具 举报

2

主题

10

回帖

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()
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 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

主题

10

回帖

16

积分

新手上路

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

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

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

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

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

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

http://www.armbbs.cn/forum.php?m ... ;tid=90083#lastpost
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

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

http://www.armbbs.cn/forum.php?mod=viewthread&tid=90083 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 01:47 , Processed in 0.186189 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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