0%

OS的选择

OS是什么

OS就是operating system,就是操作系统。系统就是为了资源的充分利用,这个定义是非常含糊的,因为fat32文件系统,系统内核,电源管理系统,tcp\ip协议栈等,都可以算是资源的利用和管理,所以,嵌入式系统是需要裁剪和定制的。系统没有高低贵贱之分,只是是否合适,是否满足。当然,驾驭更高级的系统,肯定是要求比驾驭低级的系统需要更多知识点和技术的,需要知道更多原理和技术。
但是两者的本质和使命都是一样,能完成需求的系统就是好系统。虽然系统本身也会消耗资源,但是这是为了更好的分配和高效使用

OS的属性

OS有可抢占和非可抢占两种,可抢占就是,可以直接打断当前的任务,把状态保持到寄存器中去执行优先级高的任务。这就是抢占式的OS系统,实际上,大部分的RTOS都是抢占式系统,设置都没有响应优先级,全都是抢占优先级为主。因为实时真的太重要了。

比如freertos,我们一般都是设为全抢占为主的,但是其实是可以设为响应的,这也有好处,有些任务确实优先级同级,但是不好中断。

还有FCFS 先来先服务的OS,就是谁先到就绪列表,下一个就运行谁,这是有点前后台的味道了。这个就是开触发顺序来进行的任务排序,作为一些特殊的输入设备来说,可能有用吧。

短任务有限算法,这个就是提前制定好所有任务的时间消耗,在当前任务运行完毕之后,在就绪列表中,找到耗时最短的任务有限调用。

时间片调度,这个是作用于同优先级之间的,但是要注意切换中间也是会消耗大量资源的,所有想要权衡调度和时间之间的关系,看都运行都公平,真的值得消耗资源吗?

OS的种类

OS一般有分时系统,实时系统,批处理系统。

分时系统就是多个用户,比如linux,windows。
实时系统就是rt-thread,ucos,freertos
批处理就是集群,大批量的服务器的OS。

一般使用分时和实时系统,如下所示:

以下是我个人觉得的难易程度进行分类
1.裸机
一般有MCU SOC 那些的裸机的开发,这些只适合简单,单一线程的工作

2.RTOS
就连cube都支持直接使用freertos一键生成,还有ucos thread-x那些,本质还是调用API,是rtos接管了很多寄存器和上下文切换的那些中断操作等

3.rt-thread
这个就有点难度了,它可以像freertos那样简单的就调用api实现线程,钩子,空间申请等。但是它有它们没有的,第一个就是BSP,第二个ENV第三个类linux系统,第四个串口操作这个BSP还是有点含金量的,很规范,对于移植来说,就是锦上添花的好东西啊。ENV,这个一下子就让整个编译BSP变得高大上了,还有menucofing呢类linux驱动开发,因为还有一堆宏操作,就是使用宏来把函数添加到列表中的操作等,对于没有接触过驱动开发的人来说,甚至没看懂这些宏定义为什么可以把函数添加进入模块。还有那些文件操作集那些。不得了,不得了,你使用rtt还能使用命令行操作,就是把上述模块添加之后,可以在打开特定连接的打印串口,实现串口输入指令来调用模块函数,这真的有操作的

4.linux 主板OS(电脑主板,识别设备,调度起来) 树莓派
这个难度就非常吓人了,在rtt的基础上面还得学习设备树,字符设备,平台设备,混杂设备,主设备号,次设备号。而且你会发现一件事,rtt是没人写驱动因为驱动cube已经生成了,写好kconfig文件就可以了。但是linux不一样了,驱动得人来写才行得。rt-thread一般都是写好了国内大部分芯片的驱动的,照猫画虎就好了,设备树那些就只有smart版本才有了。

5.IOS 安卓 鸿蒙 CUDE(GPU的那个系统)
可没说让你去搞应用开发,是去理解和写驱动那些,不同机型,底层得io,设备啥的都是不一样的,这个一般都是芯片厂商写的,如果以后进了芯片厂,这些就得要掌握了

6.windows Mac Ubuntu等
这个别想了,多年高强度迭代、一个人不可能掌握,能熟练使用就非常了不起了,而且还有好多没开源,开源学习成本太高了,回报基本为0.

OS的选择

一定要明白一点,OS没有高低贵贱之分,在嵌入式里面没有优越,只有适合,只有满足即可,一切为了需求,一切够用即可。
MCU不是一定要上系统,难道只有几个功能,还要几个任务相互抢?浪费空间,这个适合都可以上51了。

就算是SOC,去看厂商给的代码,大概率都是有一个rtos的demo,为什么?因为不见得一定要上类linux1或者linux那些系统啊,rtos就够用了啊!有的时候,想要的就是快速的无条件的实时响应!所以适合简单而好用的小设备,大设备因为太多硬件的,光用rtos很难
进行完美的资源控制和调度了,开发也困难。

至于那些复杂,多应用的,这个时候就要利用mmu,来给空间进行更多操作,底层全部丢给系统,这样上层才可以随心所欲实现应用切换,应用下载的功能。虽然mcu也是可以实现动态加载模组(就是写一个可以控制sram的程序,把app下载到flash,使用的时候
,把代码拷贝到空余的sram空间,这就想手机一样,可以使用空间,可以释放空间,而且平时不占据sram,sram只有一个sram控制系统),但是,太复杂了,而且引脚躲起来了,完全就不是开发了,这点厂商也想到了。

再高级一点的设备就上安卓,鸿蒙了,澎湃OS等了。再高级一点就是主机和pc端了啊,上linux,上windows等

然后就是服务器了,这个不用考虑了,只能是linux系统了,可以Ubuntu,kail等

note:优先级也是有动静态之分的,一般我们使用的rtos最好都是固定好优先级,不想那种linux高级os可以动态修改优先级,动态释放和调用资源,因为rtos本身就是为了高效、实时和稳定。功能越复杂,可能的问题就越多,这是无法避免的

结语

千万不要神话系统和技术,觉得越高级系统就越神圣,其实不是的,我们一切都是为了需求,没有任何一个系统是完美的,都是在自己所在领域非常好用,作为嵌入式开发人员,也不要为此而产生过度的优越感,这样可能会让自己止步不前,从而顾此失彼,看不起其他技术。这一点就要牢牢铭记,沿用一段文章内容。如下

-------------下次的来访是什么时候呢[doge]-------------