EvanXU 发表于 2023-3-10 16:42:33

请教RTOS中各模块编程思想

使用了RTOS(R.T.Thread)后,发现编程思想与裸机大有不同,通常在裸机中时间片轮询,中断冒出时基,各个任务在一个大循环中扫描,尽量做到每个周期任务的执行不阻塞,基本上就解决了99%常见的应用了,按键按下,显示刷新,控制执行;串口过来一包,显示刷新,控制执行;基本上都是由各个事件触发执行的,程序思路简单很多。
在OS中有几点区别,各个线程(任务)必须周期性的让出CPU,线程的同步,有点繁琐,互斥访问共同内存等等,想请教高手,如下场景该如何设计线程优先级,以及如何设计各个事件之间的通信
1.PID控制温度
2.液晶显示曲线
3.网络获取时间,并显示
4.按键扫描
5.485命令控制解析
6.网络控制命令解析(功能同485控制)
7.温度采集

有几个点有点不太清晰,比如:按键按下,控制命令,获取时间这些都要面对同一个显示线程,用事件集?队列?队列只能一对一,我以前的裸机思路,按键按下事件触发,直接在当前函数刷新液晶数据;时间解析成功事件触发,直接在当前函数刷新液晶显示,因为是顺序执行的,不会出现液晶RAM互斥的问题,用上了OS可就不行了,不能在多个任务里去刷新显示了,

优先级设计:按键1,温度采集2,PID控制3,网络命令4,485命令5,获取时间6,
请问OS这方面线程通信,事件同步,该怎么能有一个清晰的思路呢

lhj200304 发表于 2023-3-10 16:48:25

去看看周航慈的书吧

EvanXU 发表于 2023-3-10 16:53:00

lhj200304 发表于 2023-3-10 16:48
去看看周航慈的书吧
(引用自2楼)

基于嵌入式实时操作系统的程序设计技术 -周慈航是这个吗?我去看看,多谢了

lhj200304 发表于 2023-3-10 18:08:04

EvanXU 发表于 2023-3-10 16:53
基于嵌入式实时操作系统的程序设计技术 -周慈航是这个吗?我去看看,多谢了 ...
(引用自3楼)

是的,为数不多的几本好书

yuyu87 发表于 2023-3-10 20:06:31

我的一个项目和你这几乎一样,除了没有网络以外。PID和温度采集(4个通道)一个线程,MODBUS一个线程,3个逻辑线程,rt--thread os ,1ms tick,这个项目是长期维护的,从开始现在共4年了。一直增加新功能。

yuyu87 发表于 2023-3-10 20:08:09

普通按键不用中断,在线程里每隔0.1秒检测一次即可,用几个信号量,modbus用串口的超时中断,gd32f303串口有超时中断,

留声而过 发表于 2023-3-11 06:47:44

yuyu87 发表于 2023-3-10 20:08
普通按键不用中断,在线程里每隔0.1秒检测一次即可,用几个信号量,modbus用串口的超时中断,gd32f303串口 ...
(引用自6楼)

按键为什么不单独开一个线程,你放在0.1ms的中断里执行?

Qhjh 发表于 2023-3-11 09:26:43

上OS系统相当于建设一个城市管理,里面的各种任务 就相当于公安局, 街道办, 汽车站, 5A风景区... 等等 各种级别不同但又相互独立的政府机构组合. 你就是市委书记.为按键开个线程,给它对应的配套待遇都是小事一件,就是要看效率值不值得这么干.   精简机构的目的并不为省钱 ,而是为了提高效率.

chenchaoting 发表于 2023-3-11 12:43:13

按键跟读取时间,送入到同一个线程,里面状态机解析,再刷新

yuyu87 发表于 2023-3-11 15:25:30

留声而过 发表于 2023-3-11 06:47
按键为什么不单独开一个线程,你放在0.1ms的中断里执行?
(引用自7楼)

0.1S,不是0.1mS,0.1秒也不用做消抖处理,对应的逻辑里检测即可。

hcambridge 发表于 2023-3-11 16:09:57

半瓶子水没怎么用过os的人给你解释下吧,抛转引玉,错了欢迎大家指正:
1、逻辑是大循环+中断,自己安排执行时间。 操作系统相当于帮你把这部分做了,你只管每个线程都是一个CPU while(1)独占就好了,优先级在建立task的时候就可以安排好。
2、你不用担心什么周期性出让CPU,尽管写你的程序就好了,调用系统sleep的时候,系统自己会切换任务。
3、即使你不切换任务,如果优先级低的话, 操作系统也会到时间就让你停下来,运行更高优先级的任务,但是别再最高优先级里一直运行,没有sleep,那么其他线程就可能抢不到执行时间了。
4、都调用显示问题,有很多解决方法,比如用互斥锁,就是个标记,这个任务用的时候,那个任务不用,这个都是操作系统已经考虑过的事情,学一下就会了。
5、还有个解决办法就是,显示放在一个单独任务里,接收其他任务的消息,你可以有很多进程需要更新显示,但是都给那个显示进程发消息就好了,那个进程里收到消息就处理显示,多个消息排毒的问题操作系统会帮你处理好,不用管。

总之用操作系统可以省很多事情,尤其是并行任务特别多的时候,逻辑跑经常需要考虑哪个循环来不及响应问题,操作系统就不用担心了,裸机中断处理操作系统里也有,逻辑切换任务的方法其实有点类似操作系统的思路。
如果你程序很简单就不用考虑操作系统了,但是如果你学会了操作系统之后,你会觉得即使简单的也套个操作系统吧,反正也很简单,万一哪天改复杂了呢。

modu8888 发表于 2023-3-11 19:34:01

不错,先学习。空了说说我的看法{:titter:}

EMC菜鸟 发表于 2023-3-11 19:34:20

一直有跟楼主一样的需求,,,

mypear 发表于 2023-3-12 05:19:16

同样关注,最近裸跑该去threadx,之前任务很多,都不知道怎分。

EvanXU 发表于 2023-3-13 16:43:55

lhj200304 发表于 2023-3-10 18:08
是的,为数不多的几本好书
(引用自4楼)

他的那本嵌入式常用算法,也不错啊,有应用有代码,讲解的很清晰

EvanXU 发表于 2023-3-13 16:45:28

yuyu87 发表于 2023-3-10 20:08
普通按键不用中断,在线程里每隔0.1秒检测一次即可,用几个信号量,modbus用串口的超时中断,gd32f303串口 ...
(引用自6楼)

0.1s扫描按键,有点延迟吧?

EvanXU 发表于 2023-3-13 16:47:09

Qhjh 发表于 2023-3-11 09:26
上OS系统相当于建设一个城市管理,里面的各种任务 就相当于公安局, 街道办, 汽车站, 5A风景区... 等等 各 ...
(引用自8楼)

论坛里咱还是不建议使用这种举例方式,坚定不移跟党走

EvanXU 发表于 2023-3-13 16:48:12

modu8888 发表于 2023-3-11 19:34
不错,先学习。空了说说我的看法
(引用自12楼)

快来讲一讲啊

初音之恋 发表于 2023-3-13 17:36:11

简单点每个功能各开一个线程,更新UI使用消息队列通知UI线程,夸线程同步的标准做法

yuyu87 发表于 2023-3-13 18:43:51

EvanXU 发表于 2023-3-13 16:45
0.1s扫描按键,有点延迟吧?
(引用自16楼)

人按 按键,基本都在0.3秒左右,0.1秒检测一次没问题。我的设备一直这样操作。简单。

EvanXU 发表于 2023-3-13 22:05:10

yuyu87 发表于 2023-3-13 18:43
人按 按键,基本都在0.3秒左右,0.1秒检测一次没问题。我的设备一直这样操作。简单。 ...
(引用自20楼)

好吧,学习了,后边我也尝试这样搞一搞
页: [1]
查看完整版本: 请教RTOS中各模块编程思想