完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本人之前是写裸机程序的。
我们经常会遇到这样的情况,比如: if(FlagA==pdTRUE && gtimeCnt_X10ms==0 && gTftState==_TFTInitEnd ) { dosomething(); } 这种条件一旦出现的比较多的时候,我们的软件就成了蜘蛛网,各模块之间耦合很深,不好拆解。 如果这三个条件,分别属于不同任务。 是不是这样的设计思路: 我们为了降低各任务之间的直接耦合(全局变量),而采用消息队列、二值信号量、事件标志等等通信,然后,在每个任务里新建同样的内部变量或标志组。这样做是好办法吗? 比如任务A taskA的文件里 static portCHAR VarA; 然后程序中利用xQueueSend()发送出去 taskB的文件里 又重新定义 static portCHAR VarA; 然后用VarA=xQueueReceive()接收。 那么,一个项目下来,会有很多变量和标志的,那就要专门写一个函数来处理这些东西,而且接收的时候,还不能用时间阻塞。因为用了阻塞,会导致其他信息滞后接收。 |
|
相关推荐
2个回答
|
|
比如,我有一个项目里,有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中,根据以上不同情况,执行不同动作。 我这么做的目的,就是不用全局变量。问题是,一个项目,裸机程序里可能有上百个标志位和全局变量,按我说的这种方法做,好像很麻烦。这个操作系统,是不是要这样做? |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
698 浏览 0 评论
1109 浏览 1 评论
2476 浏览 5 评论
2810 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2653 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
656浏览 9评论
651浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
785浏览 6评论
632浏览 5评论
672浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 05:24 , Processed in 0.847648 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号