硬汉嵌入式论坛

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

[FreeRTOS] freeRTOS如何消除裸机里的多重条件判断标志

[复制链接]

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2018-11-7 10:46:40 | 显示全部楼层 |阅读模式
本人之前是写裸机程序的。
我们经常会遇到这样的情况,比如:
if(FlagA==pdTRUE
&& gTimeCnt_X10ms==0
&& gTftState==_TFTInitEnd
)
{
    dosomething();
}
这种条件一旦出现的比较多的时候,我们的软件就成了蜘蛛网,各模块之间耦合很深,不好拆解。
那么freeRTOS如何解决此类问题?
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2018-11-7 10:55:54 | 显示全部楼层
本帖最后由 caicaptain2 于 2018-11-7 11:01 编辑

使用一个事件标志组啊,任务间事件标志组的实现是指各个任务之间使用事件标志组实现任务的通信或者同步机制。 很方便
Snipaste_2018-11-07_11-00-28.png
参见18章和26章


回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2018-11-7 10:56:13 | 显示全部楼层
如果这三个条件,分别属于不同任务。
是不是这样的设计思路:
FlagA在taskA里,理论上可以用二值信号量或事件标志传过来;
gTimeCnt_X10ms在TaskB里,采用消息队列传过来;
gTftState在TaskC里,也采用消息队列传过来。
如果是这样做的话,是不是很累?裸机里一个标志,一个变量搞定的,这里要写一堆函数,可读性不好。
我感觉这不是个好办法。
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2018-11-7 11:08:48 | 显示全部楼层
本帖最后由 Clare.Chen 于 2018-11-7 11:10 编辑

我们为了降低各任务之间的直接耦合(全局变量),而采用消息队列、二值信号量、事件标志等等通信,然后,在每个任务里新建同样的内部变量或标志组。这样做是好办法吗?
比如任务A
taskA的文件里
static portCHAR VarA;
然后程序中利用xQueueSend()发送出去

taskB的文件里
又重新定义
static portCHAR VarA;
然后用VarA=xQueueReceive()接收。
那么,一个项目下来,会有很多变量和标志的,那就要专门写一个函数来处理这些东西,而且接收的时候,还不能用时间阻塞。因为用了阻塞,会导致其他信息滞后接收。
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2018-11-7 11:30:41 | 显示全部楼层
caicaptain2 发表于 2018-11-7 10:55
使用一个事件标志组啊,任务间事件标志组的实现是指各个任务之间使用事件标志组实现任务的通信或者同步机制 ...

版主,请您帮忙解答一下我后面的回复。
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2018-11-7 14:30:01 | 显示全部楼层
本帖最后由 caicaptain2 于 2018-11-7 14:34 编辑
Clare.Chen 发表于 2018-11-7 11:08
我们为了降低各任务之间的直接耦合(全局变量),而采用消息队列、二值信号量、事件标志等等通信,然后,在 ...

你这个思路有点混乱。。。。没看懂。 应该不是你这么用的。
根据你的第一个帖子,可以把所有标志位设定在一个事件变量里面。 因为一个事件标志变量可以包含24个独立的事件标志。

一般事件标志,信号量之类的,与全局变量有以下区别:
1. 可以创建,也可以删除,使用的是FreeRTOS的heap。 而全局变量始终都存在。
2. 易读性,和移植性比较好。而全局变量需要避免命名冲突。
3. 对同一事件标志进行覆盖写的时候,可以有优先级的区别。而全局变量是,先后次序全靠流程。
5. 可以根据任务级别,读取的时候,对自由设定当前标志位清零,或者保持不变。
6. 可以阻塞,等待,比较灵活,且不浪费CPU资源。 而全局变量的判断等待需要自己实现,传统的for循环是很浪费的。。
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2018-11-7 15:20:51 | 显示全部楼层
本帖最后由 Clare.Chen 于 2018-11-7 15:25 编辑
caicaptain2 发表于 2018-11-7 14:30
你这个思路有点混乱。。。。没看懂。 应该不是你这么用的。
根据你的第一个帖子,可以把所有标志位设定 ...

谢谢您,我的意思是这样的:
比如,我有一个项目里,有4个任务:taskA, taskB, taskC, taskD,它们分别在不同的文件里。
即在taskA所在文件里,定义static uint8_t taskA_Flag_Bit;
   在taskB所在文件里,定义static uint8_t taskB_Char_Var;
   在taskC所在文件里,定义static uint16_t taskC_Word_Var;
然后,我在执行任务taskD时,需要用到taskA_Flag_Bit,taskB_Char_Var, taskC_Word_Var;
那么,我在taskD的文件里,是不是要定义一个结构体
typedef struct _MsgBuf
{  
   uint8_t taskA_Flag_Bit;
   uint8_t taskB_Char_Var;
   uint16_t taskC_Word_Var;
}MsgBuf ;  
static MsgBuf  s_GetMsg;
然后,s_GetMsg.taskA_Flag_Bit采用事件标志,从taskA传过来24位各种标志taskA_Flag_Bit;
         s_GetMsg.taskB_Char_Var采用消息队列,从taskB传过来数据taskB_Char_Var;
         s_GetMsg.taskC_Word_Var采用消息队列,从taskC传过来数据taskC_Word_Var;

最后,才能在taskD中,根据以上不同情况,执行不同动作。

我这么做的目的,就是不用全局变量。问题是,一个项目,裸机程序里可能有上百个标志位和全局变量,按我说的这种方法做,好像很麻烦。这个操作系统,是不是要这样做?
回复

使用道具 举报

2

主题

180

回帖

186

积分

初级会员

积分
186
发表于 2018-11-7 15:25:44 | 显示全部楼层
xTaskNotify。。。。
回复

使用道具 举报

2

主题

180

回帖

186

积分

初级会员

积分
186
发表于 2018-11-7 15:34:03 | 显示全部楼层
Clare.Chen 发表于 2018-11-7 15:20
谢谢您,我的意思是这样的:
比如,我有一个项目里,有4个任务:taskA, taskB, taskC, taskD,它们分别 ...

你也可以模块里面static作为标志位啊,然后全部用宏命令或者函数操作,这样可能会好点,任务与任务之间使用tasknotify也不错
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2018-11-7 15:41:34 | 显示全部楼层
qq57379550 发表于 2018-11-7 15:34
你也可以模块里面static作为标志位啊,然后全部用宏命令或者函数操作,这样可能会好点,任务与任务之间使 ...

不太明白,请您稍微详细解释一下怎么做?
回复

使用道具 举报

2

主题

180

回帖

186

积分

初级会员

积分
186
发表于 2018-11-7 15:48:47 | 显示全部楼层
Clare.Chen 发表于 2018-11-7 15:41
不太明白,请您稍微详细解释一下怎么做?

如果你是任务之间的标志位xTaskNotify来设置任务标志位给对应的任务,然后任务接收端使用xTaskNotifyWait  tick使用为zero  没收到也可以立刻跳出堵塞状态运行后面的语句。
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2018-11-7 15:56:05 | 显示全部楼层
qq57379550 发表于 2018-11-7 15:48
如果你是任务之间的标志位xTaskNotify来设置任务标志位给对应的任务,然后任务接收端使用xTaskNotifyWait ...

这个我知道,我的意思是变量和标志太多了,都要这么整,篇幅好大,可读性也不怎么样。
回复

使用道具 举报

2

主题

180

回帖

186

积分

初级会员

积分
186
发表于 2018-11-7 16:20:29 | 显示全部楼层
Clare.Chen 发表于 2018-11-7 15:56
这个我知道,我的意思是变量和标志太多了,都要这么整,篇幅好大,可读性也不怎么样。

用8-9个标志位,一点也不觉得存在篇幅大,和可读性差的问题啊,这个怎么也比全局变量更好理解啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 21:46 , Processed in 0.305338 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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