OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4676|回复: 3

freeRTOS如何消除裸机里的多重条件判断

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-11-7
在线时间
7 小时
发表于 2018-11-7 12:16:32 | 显示全部楼层 |阅读模式
1金钱
本人之前是写裸机程序的。
我们经常会遇到这样的情况,比如:
if(FlagA==pdTRUE
&& gTimeCnt_X10ms==0
&& gTftState==_TFTInitEnd
)
{
    dosomething();
}
这种条件一旦出现的比较多的时候,我们的软件就成了蜘蛛网,各模块之间耦合很深,不好拆解。

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

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


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-11-7
在线时间
7 小时
 楼主| 发表于 2018-11-7 15:45:45 | 显示全部楼层
比如,我有一个项目里,有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中,根据以上不同情况,执行不同动作。

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

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1694
金钱
1694
注册时间
2012-5-10
在线时间
437 小时
发表于 2018-11-7 16:23:27 | 显示全部楼层
这应该也没什么好办法吧,
楼主请教下,你用事件标志位,有从中断里面往外发么,这个好像在中断里面用的不方便
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-1-9
在线时间
4 小时
发表于 2019-1-9 16:19:10 | 显示全部楼层
这个简单啊,用事件驱动(或者消息驱动)代替OS系统的任务切换,其它附带功能可有可无(可移植),比如软定时器在OS系统上能用,裸奔一样也能用(需自己实现);用回调函数实现调用与被调用的关系,这样就能分层处理了。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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