只会裸奔和RTOS下的嵌入式开发,有啥不同?差距在哪里?

2019-07-21 00:43发布

嵌入式设备网络化、u盘化、功能复杂化的趋势,使越来越多的、过去可以用裸奔实现的嵌入式产品,产生了应用操作系统的需求。点进来创客学院物联网大佬一节课带你入门FreeRTOS


而人力成本的持续上升、芯片成本的连续下降,以及cpu性能的迅速提高,又为大面积应用操作系统提供了物质基础。


本文和大家一起讨论一下,从裸奔到操作系统,我们将面对什么挑战。
1、速度
我们首先面对的,将是cpu运行速度的问题,毋庸置疑,操作系统调度需要cpu开销,需要cpu有更高的速度来弥补;再者,嵌入式系统经常用于实时控制,需要较高的定时精度,缩短tick时间间隔有利于提高控制精度,嵌入式系统中经常使用1mS甚至更短的tick间隔。然而,tick间隔越短,调度开销就越高,同样需要更高的cpu速度来弥补。当前日益提高的嵌入式cpu的性能,甚至单片机都32位了,很好地回答了这个问题。

2、内存容量
先讨论一个问题,一个原先需要50K内存的裸奔程序,如果移植到自身开销1K内存的RTOS下面,需要增加多少内存?是51K吗?


有许多嵌入式操作系统,都把运行操作系统的内存开销作为主要性能指标,有些甚至声称不到1K内存就可以运行。但我们千万不要被误导,以为用操作系统需要的内存与裸机差不多,只要比裸奔程序多那么1K、2K就行了。操作系统会使应用程序所需要的内存暴增,使用操作系统所增加的内存需求,主要来自以下方面:
1) 运行操作系统本身需要的内存。
2) 创建线程控制块、消息控制块等操作系统组件需要的内存。
3) 每个线程配置独立的栈所增加的内存需求。
其中第一项很好理解,几乎所有操作系统都会给出这个指标。第二项也容易理解,不用操作系统的情况下,我们常常定义标志位或全局变量来在不同模块之间传递信息,需要的内存就很少。而操作系统模式下,需要用到同步、互斥、线程间交换数据等,这就需要使用信号量、邮箱等操作系统组件,信号量需要分配信号量控制块,邮箱需要分配邮箱控制块……,这些,都需要消耗可观的内存。许多操作系统标明的,仅仅是OS本身运行需要的内存,并不包括信号量控制块拉、邮箱控制块拉等等这些操作系统组件需要的内存。我们知道,一个仅运行OS的系统,是毫无意义的,真正实现产品功能的,是应用程序。而djyos的si版本,大约需要的10K内存,则包含了一定数量的事件控制块、信号量控制块等操作系统组件所需内存的条件下的,完全满足一个小型系统所需。


说了半天,其实也只讲了操作系统对内存需求的冰山一角,OS下编程,对内存需求的影响最大的,当属OS的多线程并发特性,这使得我们要为每一个线程分配独立的栈。下面我们定性分析一下栈独立化带来的内存需求变化。栈是用来保存函数参数和局部变量的,可以说,有函数调用,就有局部变量。在单线程环境下,应用程序需要的栈,几乎就是main函数需要的栈,而在多线程环境下,每个线程的栈是独立的,分别等于该线程的线程执行函数所需要的栈,而系统总的栈需求,就是所有线程的栈需求之和。


假设有一不使用OS的应用程序,main函数如下:
void main(void)
{
while(1)
{
func1(); //本函数需要10K栈
func2(); //本函数需要5K栈
func3(); //本函数需要9K栈
func4(); //本函数需要8K栈
func5(); //本函数需要9K栈
}
}
在超级循环中,分别调用了func1~func5这5个函数,他们的栈需求分别是10K、5K、9K、8K、9K。调用func1时,系统分配10K的ram作为栈,func1函数返回,这10K空间将被释放,并且再次分配给func2使用,所以,整个程序的栈需求,就是这5个函数中需要栈最多的那个函数需要的栈空间:10K。


如果要把这个程序移植到OS下,最简单的方法就是创建5个线程来调用func1~5这5个函数,这5个线程需要的栈分别是10K、5K、9K、8K、9K,而这5个栈是独立的,不能共用,程序总共需要的栈空间是(10+5+9+8+9)=41K,线程栈一般是从堆中动态分配的,考虑到动态分配本身的开销,硬件须准备50K以上的内存用于程序的运行栈。一下子增长到5倍,没想到吧。


可见,上操作系统,虽然操作系统本身不需要很大内存,但会极度增加应用程序的内存需求。做项目时,一是不要盲目上OS,要根据需求综合考虑,二是设计硬件系统时,应该充分考虑到内存方面的需求,配置充足的内存。
3、人
任何产品都是由人开发的,所以,讨论嵌入式产品开发的任何话题,都不能离开人的因素,科技以人为本嘛!从裸奔到操作系统,那么程序员,也将由编写裸奔程序转为在操作系统下编程。这些迅速、大量增加的程序员,他们可能习惯了在裸奔环境下编程,他们可能是化工、建筑、地质等不同行业的专家,他们也许已经上了年纪,没有太多的精力学习多线程编程等知识。然而,涉及到专业的程序,仍然离不开他们,如何从技术上降低他们的入门门槛,是一个亟需考虑的问题。但是,普通的操作系统下,你不掌握线程控制技术,就无法编写正确的程序。djyos允许你按事件编程,没有任何跟线程相关的api函数,无需程序员掌握线程技术,客观上降低了裸奔到OS编程的转换技术门槛。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
edmund1234
1楼-- · 2019-07-21 02:27
 精彩回答 2  元偷偷看……
Angle145
2楼-- · 2019-07-21 02:46
 精彩回答 2  元偷偷看……
yxwsbobo
3楼-- · 2019-07-21 08:20
没有操作系统是自虐行为,程序员不要对自己那么吝啬,人比机器贵
huyounong
4楼-- · 2019-07-21 10:58
 精彩回答 2  元偷偷看……

一周热门 更多>