OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1872|回复: 4

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

[复制链接]

54

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
363
金钱
363
注册时间
2019-3-14
在线时间
44 小时
发表于 2019-5-29 17:33:39 | 显示全部楼层 |阅读模式
嵌入式设备网络化、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编程的转换技术门槛。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-5-29 17:37:45 | 显示全部楼层
裸机编程,不等于没有操作系统, 而是给当前的项目量身订制了一操作系统。
回复 支持 反对

使用道具 举报

18

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2018-3-9
在线时间
44 小时
发表于 2019-5-29 18:30:34 | 显示全部楼层
观点中肯,上不上OS看实际项目需要和结构吧。如果上GUI,还是OS来得方便些,用一个任务刷GUI,其他任务做其他事,互不影响,挺方便的。说到OS,有兴趣的可以看看鄙人爱好写的一个适合新人入门的OS,http://www.openedv.com/forum.php ... d=293820&extra=
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-5-29
在线时间
0 小时
发表于 2019-5-29 23:26:48 | 显示全部楼层
没有操作系统是自虐行为,程序员不要对自己那么吝啬,人比机器贵
回复 支持 反对

使用道具 举报

16

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1909
金钱
1909
注册时间
2015-7-5
在线时间
485 小时
发表于 2019-5-30 07:04:55 | 显示全部楼层
edmund1234 发表于 2019-5-29 17:37
裸机编程,不等于没有操作系统, 而是给当前的项目量身订制了一操作系统。

支持,的确如此
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 10:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表