从前后台编程向操作系统编程思维转变
2014-01-14 11:11
330 查看
题记:适用于那些仅有一种编程经验的人员
不得不说一点,经常做前后台编程的人,很不容易向操作系统编程转变,觉得操作系统很玄乎,自己无从下手,少了控制感;而经常做操作系统编程的人,觉得为什么要前后台编程那么麻烦,什么事情都得自己做,就不能把一些任务交给操作系统去完成,而专心于任务的实现。
其实,我觉得这里面主要是思路以及思维方式的不同而引起的。首先,古老的前后台编程很直观简单,所有的事情都有程序员一力完成,所有的情况都被控制在手里。这个时候,程序员会有安全的感觉,如果让他立马转换成操作系统编程,立马傻眼了,我的这些工作怎么变成了任务了,这任务之间怎么会有切换,谁干的?这玩意为什么不直接操作IO口,还得交给某个我也不懂的任务去完成等等。相信大家肯定有类似的经历,至少是心理的。在前后台编程模式里面,所有的事情都是串行发生的,出了ISR程序偶尔插入执行完毕然后回到原来的主循环。对于没有操作系统概念和开发经验的程序员来说,这种自然的程序开发方式多么的无为而治。
但是前后台编程模式有其天然的缺陷:1、CPU利用效率低下,2、编程效率低,3、移植性差。对于第一点,相应大家都知道,如主程序里面要delay几个ms一下,我们就让CPU在那里空计数玩,其实这么宝贵的CPU时间完全没必要浪费的。第二点,效率低,体现在很多方面:每个不同的项目,你都需要不同的程序组织方式,从定义到实现需要花费更多的时间;对于底层的操作,需要自己编写(尤其是移植到新的CPU上)。第三点就不用说了,一个用于STM32的程序移植到MSP430上面,它们的寄存器架构都不一样,包括固件方式都不一样,需要重写的东西太多,代价大。
从上面这段论述,我们也可以大概解释一下只做前后台编程和操作系统编程的人员的差异和思维模式。总而言之就是,前后台编程人员对于硬件底层细节理解比较深(相对的,否则他也没法编程),而操作系统编程人员对于软件理解较深(操作系统就是要向你屏蔽硬件细节,提供API接口以及系统服务,让你摆脱datasheet和reference manual不断的烦恼)。
因此,要想学习操作系统编程的程序员,首先要建立操作系统的基本概念,这么多年的软件工程实践已经总结出很多操作系统的基本框架和共识。然后要意识到,使用操作系统意味着什么——意味着方便快捷以及放权,方便快捷来源于操作系统编程的实现,放权意味着操作系统接管硬件并且帮你协调工作(专业点将就是调度,通俗点将就是请了一个管家)。第三,就是要敢于实践和使用,学习一项新的事物,最好的方式不是先去搞懂它是怎么工作的,而是搞清楚它能干什么,以建立直观印象。最后,如果不想止于此,去看操作系统内核实现吧,小型操作系统的内核都比较简短,一定要深入挖掘里面的东西。目前我也是在学习FreeRTOS,之前有学习uCOS-II的经验,两相交互对比,更加深了我对操作系统的理解,但是路依然很长。
个人愚见,两种编程方式锻炼的是人的不同能力,目前嵌入式编程,操作系统的使用是很普遍的,因此有了解底层硬件的基础,对于学习和工作是有好处的。能让你了解软件如何控制硬件的工作,基础扎实,贯通上下。
鉴于本人水平有限,文章中有错误处请读者不吝斧正。
不得不说一点,经常做前后台编程的人,很不容易向操作系统编程转变,觉得操作系统很玄乎,自己无从下手,少了控制感;而经常做操作系统编程的人,觉得为什么要前后台编程那么麻烦,什么事情都得自己做,就不能把一些任务交给操作系统去完成,而专心于任务的实现。
其实,我觉得这里面主要是思路以及思维方式的不同而引起的。首先,古老的前后台编程很直观简单,所有的事情都有程序员一力完成,所有的情况都被控制在手里。这个时候,程序员会有安全的感觉,如果让他立马转换成操作系统编程,立马傻眼了,我的这些工作怎么变成了任务了,这任务之间怎么会有切换,谁干的?这玩意为什么不直接操作IO口,还得交给某个我也不懂的任务去完成等等。相信大家肯定有类似的经历,至少是心理的。在前后台编程模式里面,所有的事情都是串行发生的,出了ISR程序偶尔插入执行完毕然后回到原来的主循环。对于没有操作系统概念和开发经验的程序员来说,这种自然的程序开发方式多么的无为而治。
但是前后台编程模式有其天然的缺陷:1、CPU利用效率低下,2、编程效率低,3、移植性差。对于第一点,相应大家都知道,如主程序里面要delay几个ms一下,我们就让CPU在那里空计数玩,其实这么宝贵的CPU时间完全没必要浪费的。第二点,效率低,体现在很多方面:每个不同的项目,你都需要不同的程序组织方式,从定义到实现需要花费更多的时间;对于底层的操作,需要自己编写(尤其是移植到新的CPU上)。第三点就不用说了,一个用于STM32的程序移植到MSP430上面,它们的寄存器架构都不一样,包括固件方式都不一样,需要重写的东西太多,代价大。
从上面这段论述,我们也可以大概解释一下只做前后台编程和操作系统编程的人员的差异和思维模式。总而言之就是,前后台编程人员对于硬件底层细节理解比较深(相对的,否则他也没法编程),而操作系统编程人员对于软件理解较深(操作系统就是要向你屏蔽硬件细节,提供API接口以及系统服务,让你摆脱datasheet和reference manual不断的烦恼)。
因此,要想学习操作系统编程的程序员,首先要建立操作系统的基本概念,这么多年的软件工程实践已经总结出很多操作系统的基本框架和共识。然后要意识到,使用操作系统意味着什么——意味着方便快捷以及放权,方便快捷来源于操作系统编程的实现,放权意味着操作系统接管硬件并且帮你协调工作(专业点将就是调度,通俗点将就是请了一个管家)。第三,就是要敢于实践和使用,学习一项新的事物,最好的方式不是先去搞懂它是怎么工作的,而是搞清楚它能干什么,以建立直观印象。最后,如果不想止于此,去看操作系统内核实现吧,小型操作系统的内核都比较简短,一定要深入挖掘里面的东西。目前我也是在学习FreeRTOS,之前有学习uCOS-II的经验,两相交互对比,更加深了我对操作系统的理解,但是路依然很长。
个人愚见,两种编程方式锻炼的是人的不同能力,目前嵌入式编程,操作系统的使用是很普遍的,因此有了解底层硬件的基础,对于学习和工作是有好处的。能让你了解软件如何控制硬件的工作,基础扎实,贯通上下。
鉴于本人水平有限,文章中有错误处请读者不吝斧正。
相关文章推荐
- python Lxml库的安装
- 驱动编程调优相关辅助工具-图形图像类
- struts 2.2.1做例子时报异常:java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 解决
- 传智播客-JAVA学科-14年1月份Java基础之开启征服源码之旅!
- 【eclipse】快捷键使用
- sms AT指令返回错误代码: CMS errors & CME errors 的区别!
- Java设计模式遵循的七大原则
- C#热图生成(三)——with Silverlight改进热图显示
- Spring声明式事务管理与配置详解
- C#扫雷游戏详细介绍
- 提高PHP编程效率的技巧
- java基本教程之join方法详解 java多线程教程
- 基于WSP/WTP的MMS传输(3)——MMS PDU结构
- 基于WSP/WTP的MMS传输(2)——MMS的传输模型
- Struts2 学习笔记 —— 06 —— ActionWildCard 通配符
- 03_java编码格式
- c++ 金山库绘制文本区域的获取。
- C++模板类的使用和继承
- java基本教程之线程休眠 java多线程教程
- java平常学习积累