裸机程序移植到OS上,一堆全局变量该怎么处理???
本帖最后由 飛饵 于 2020-6-7 02:38 编辑之前裸机上的一个小工程,大概框架是有3个软件模块:
1、一个负责OLED屏显示的UI模块
2、一个负责按键扫描和键值处理模块
3、一个负责控制外部设备的模块
4、还有一些小的模块比如RTC时间获取,led灯之类的。
在裸机上的流程大概是定时器中断内运行模块2和RTC时间获取,其他的都在main中循环。所有模块都靠全局变量通信,特别是模块1和2之间几乎所有变量都飞来飞去。
现在移植过来只是把模块单独丢进各个线程里让他们并行处理,什么信号量邮箱都没用到,感觉好不规范。
而且那些小模块不太懂怎么安排,比如RTC时间获取,是给一个线程单独运行还是和UI或者按键扫描一起好??
简单
那个信号量,对全局变量的访问先申请信号量,访问完后释放信号量 看了你的项目介绍,非常适合用os,有oled有键盘,都是慢速,需要的是人的速度。
如果项目需要的是单片机机器的速度用os就浪费资源。 在操作系统里讲进程间通讯,一种是消息机制,一种是共享内存。
有的人用全局变量,目的就是个标志位。
有的全局变量是当共享内存用的,如果进行解耦,会降低程序效率。
最后建议,成熟的东西别去折腾
把全局变量按排列组合分成如下形式。
1、单写单读
2、单写多读
3、多写单读
4、多写多读
那么当你写成OS形式的时候。
第一种:
随便折腾,不涉及互斥的问题。
第二种:
由于也是单个写,可能涉及到多个读的子程序同步的问题,如果不同步,也是随便折腾。
第三种:多写单读
这个就有问题了
第四种:多写多读,类似火车票订票系统
同第三种,多了个读方的同步的问题。
总结:
第一种,第二种,移植到操作系统问题不大。
第三种,第四种,移植到操作系统,就需要学习操作系统理论,了解一些信号量,互斥,等基本概念。至于资源的分配,是华为的轮值ceo(时间分配),还是腾讯qq的vip优先(优先级),跟人类社会很像的。
当然第三种和第四种,出现的情况很少。也是可以用状态机手动分配资源。
最后,你移植了操作系统,如果没有抽象出得到足够多的模块和库,我认为收益不大。
全局变量猛如虎,但是全局变量特别适合单写多读的情况。
页:
[1]