modu8888 发表于 2017-4-13 09:06:28

关于FreeRTOS的任务划分及comsis_os的函数使用的请教!

      我的项目大致是这样:系统有按键、与串口的输入,有12864点阵液晶屏、蜂鸣器及串口输出。围绕点阵液晶屏的显示,我想根据“界面“划分多个任务。比如初始化任务、首页、通信出错任务、系统设置(其实根据设置子菜单分为n个)、机器行程选择、行程执行等来分为若干任务。
      又因为这些任务不会同时被执行,所以我想上面这些”界面“有关任务只让一个存在于调度表中,其他的都被挂起。当需要切换到另一个任务以后,就将当前任务挂起并唤醒下一个任务。比如在首页,接受到设置按键以后,就将当前任务——首页任务挂起,resume设置首页任务。
       请问这样划分行吗?
       同时,我在用st工程师封装好的cmsis_os里的函数osThreadResume(..)和osThreadSuspend(..)并不灵验。
      请有经验的朋友赐教!

斜阳__ 发表于 2017-4-13 09:15:10

使用rtos的目的就是让任务同时执行。这样设计没发挥出rtos的作用

modu8888 发表于 2017-4-13 15:25:37

谢谢。
提起来,其他朋友也指教下~:$

黑皮男 发表于 2017-4-13 21:18:44

说一说我的一些拙见。一楼说的没错,直接控制任务的挂起和唤醒体现不了实时内核的特性,而且不利于控制代码的结构。
首先,实时内核提供了很多同步机制,比如队列,信号量,这俩也是我用的最多的。任务之间的同步和通信应该尽可能的使用这些现有的工具来完成。队列和信号量等都能够使任务处于阻塞状态,只要条件满足,任务就会被唤醒。
其次,虽然内核提供了这些工具,但是在设计的时候,各功能模块应该提供结构函数以供其他模块调用,而模块内的具体实现就比较灵活了,同时,信号量和队列也建议封装到对应的功能模块中,只好给出功能结构就好。举个例子,向串口打印信息可以封装成一个功能模块,只要提供打印接口函数UartPrint即可,只要其他任务想要向串口打印信息,调用UartPrint即可,至于串口打印功能模块的具体实现可以用一个任务和队列来实现,串口任务查询这个队列,只要队列非空,就取出数据并输出到串口,否则这个任务就会一直处于阻塞状态。UartPrint的功能就是把数据发送到这个串口队列中。这样使的各个模块之间的具体实现就更加灵活。

modu8888 发表于 2017-4-14 08:09:36

黑皮男 发表于 2017-4-13 21:18
说一说我的一些拙见。一楼说的没错,直接控制任务的挂起和唤醒体现不了实时内核的特性,而且不利于控制代码 ...

谢谢两位!:handshake
有点明白了~
页: [1]
查看完整版本: 关于FreeRTOS的任务划分及comsis_os的函数使用的请教!