我的项目大致是这样:系统有按键、与串口的输入,有12864点阵液晶屏、蜂鸣器及串口输出。围绕点阵液晶屏的显示,我想根据“界面“划分多个任务。比如初始化任务、首页、通信出错任务、系统设置(其实根据设置子菜单分为n个)、机器行程选择、行程执行等来分为若干任务。 又因为这些任务不会同时被执行,所以我想上面这些”界面“有关任务只让一个存在于调度表中,其他的都被挂起。当需要切换到另一个任务以后,就将当前任务挂起并唤醒下一个任务。比如在首页,接受到设置按键以后,就将当前任务——首页任务挂起,resume设置首页任务。 请问这样划分行吗? 同时,我在用st工程师封装好的cmsis_os里的函数osThreadResume(..)和osThreadSuspend(..)并不灵验。 请有经验的朋友赐教! |
提起来,其他朋友也指教下~
首先,实时内核提供了很多同步机制,比如队列,信号量,这俩也是我用的最多的。任务之间的同步和通信应该尽可能的使用这些现有的工具来完成。队列和信号量等都能够使任务处于阻塞状态,只要条件满足,任务就会被唤醒。
其次,虽然内核提供了这些工具,但是在设计的时候,各功能模块应该提供结构函数以供其他模块调用,而模块内的具体实现就比较灵活了,同时,信号量和队列也建议封装到对应的功能模块中,只好给出功能结构就好。举个例子,向串口打印信息可以封装成一个功能模块,只要提供打印接口函数UartPrint即可,只要其他任务想要向串口打印信息,调用UartPrint即可,至于串口打印功能模块的具体实现可以用一个任务和队列来实现,串口任务查询这个队列,只要队列非空,就取出数据并输出到串口,否则这个任务就会一直处于阻塞状态。UartPrint的功能就是把数据发送到这个串口队列中。这样使的各个模块之间的具体实现就更加灵活。
谢谢两位!
有点明白了~