从单片机编程到操作系统产生

nicekwell 2013-12-07 12:25:38
以前对单片机编程做过一些零散的总结,近两个月又学习了一下操作系统,对操作系统原理和实现有了初步了解。所以就想到写一篇长文总结,系统总结一下单片机编程和操作系统原理,作为一个从单片机编程到操作系统的过渡文章。
本文介绍了各种单片机编程结构,可以算是本人单片机编程的一点小小的经验。从这些单片机编程结构的不断变化中逐渐过渡到操作系统,并在s3c6410上一步一步实现一个小操作系统。
一开始想要作为一个帖子分享的,但是内容太多,所以做成了一个PDF文件,看上去比较正规,调理也清晰一点,但是内容也就停留在帖子的水平。希望能给从单片机往操作系统过渡的童鞋带来一点帮助,正如我学操作系统时也看了别人的文章一样。
文章的PDF文件可以从 http://download.csdn.net/detail/nicekwell/6671759 或者 http://pan.baidu.com/s/1elUFv 下载到。
以下是文章的前言和目录。


前言
在2011年年初,笔者开始了单片机的学习,那时还是学生的我已经深深地被单片机吸引。之后几乎放弃了学校课程,把所有精力都放在单片机上,参加了一些比赛,并取得不错的成绩。
在开始工作之后,笔者从事单片机开发。在工作期间的高强度编程下,尝试了多种单片机编程结构,对单片机各种结构的构建做了分析和总结,并深刻感受到操作系统产生的必要性,对操作系统的探索有着越来越强的欲望。
在工作一段时间之后,笔者决定辞职。我不想凭仅有的那么一点单片机知识做一个嵌入式码农,我渴望学习新的知识,掌握更高级的理论……好吧~至少做一个高级一点的码农。而下一步的目标就是——linux。
但是笔者并没有直接进行linux的学习,因为操作系统对我来说还是个新事物,我甚至不知道操作系统和单片机编程的最本质区别是什么,于是我想先搞清楚操作系统的本质原理之后再进行linux的学习。笔者是物理学专业的,并没有系统学习过操作系统的概念。事实上很多介绍操作系统的书籍也没有提到操作系统的底层实现,更没有介绍它与单片机编程之间的关系。正如我在辞职的这段时间学完uCOS之后,对操作系统内核构建有了了解,但是却仍然不知底层的任务切换是如何实现的。
However,经过两个月的学习,笔者终于清楚了操作系统的基本原理,也深刻体会到操作系统和单片机各种编程结构的区别和联系。于是我想到把之前的单片机编程经验和近期对操作系统的学习结合到一起,写一个从单片机到操作系统过渡的文章。一方面对单片机编程结构做一个系统总结,另一方面对操作系统原理也进行一次整理。把操作系统和单片机编程整合到一个知识体系中去,以便日后接受更多的操作系统内核知识。

本文分为两部分——“单片机编程篇”和“操作系统篇”。
单片机编程篇主要介绍单片机的各种编程结构,及其实现方法。是在假设已经可以驱动单片机和各个模块的前提下,讨论如何整合和使用这些资源,以实现功能。在这一篇中,将会看到程序主体逐渐从主函数转移到定时器,并且明确这些变化的目的。最后还会接触到面向对象的程序设计方式,并体会这种方式带来的好处。
操作系统篇将会介绍操作系统的最基本的任务切换原理,以及操作系统是如何实现在单片机编程中难以实现的功能的。并在arm平台上实现任务切换和简单的操作系统。至于更复杂的操作系统内核构建本文没有多说,各种常用的操作系统内核都有很多资料可以查阅,不过我会向大家推荐一本在网上公开但没有出版的书——《底层工作者手册之嵌入式操作系统内核》,这本书详细阐述了操作系统内核的构建方法。


目录
第一篇 单片机编程
第1章 主函数顺序调用 2
1.1 主函数顺序调用的一般结构 2
1.2 主函数顺序调用结构的特点 2
第2章 界面函数结构 4
2.1 界面函数一般结构 4
2.2 更高的角度分析这种结构 5
第3章 定时器分配任务 8
3.1 用界面函数构成的基础框架 8
3.2 结合定时器编程分析 9
3.3 任务分割 11
3.4 定时器分配任务程序结构总结 12
第4章 占用式与非占用式程序结构分析 14
4.1 什么是占用式程序 14
4.2 占用式程序的缺点 14
4.3 对占用式程序的改造 15
4.4 改造的本质 16
4.5 非占用式程序结构的优势 17
4.6 非占用式程序的一般结构 17
4.7 吐槽 18
第5章 定时器执行任务 19
5.1 定时器执行任务的程序结构 19
5.2 定时器里面任务函数的特点 20
5.3 过程任务的定时器化 21
5.4 定时器执行任务程序结构总结 25
5.5 我们追求的是什么 25
第6章 面向对象思想+事件驱动结构 27
6.1 对象和事件 27
6.2 C语言对一个对象的封装 28
6.3 事件分配机制 31
6.4 系统层构建 33
6.5 库函数 33
第二篇 操作系统
第7章 为什么要有操作系统 35
第8章 任务切换的具体工作 36
8.1 CPU工作原理 36
8.2 任务切换做的事 38
第9章 在s3c6410上实现任务切换 39
9.1 了解s3c6410的寄存器 39
9.2 要用到的几条汇编指令 41
9.3 在s3c6410上实现任务切换 45
9.4 在s3c6410上实现简单操作系统 46
...全文
2221 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lalaliuyong 2016-05-13
  • 打赏
  • 举报
回复
标记一下,支持一下,赞楼主
qq_25797063 2016-04-05
  • 打赏
  • 举报
回复
楼主很牛,看了你的书写的真不错
Longer-Jing 2013-12-19
  • 打赏
  • 举报
回复
谢谢楼主,收藏了
BeHunted 2013-12-11
  • 打赏
  • 举报
回复
引用 12 楼 whysoft 的回复:
我也是上班加上加班实在无聊在这聊聊。没别的意思。只是想预测你将如同另外的1亿个同样对OS感兴趣的人一样,最终把这个OS研究消失于无形罢了。 简单地进行文本处理解决比较容易 我是先做成了这样的程序,才在此说这比较容易的,我为51做了一个C的等价转换程序,把占用式等价转换成中断式,大约C++语句300行以内。编写程序时,采用最自然的占用式的想法来做。经转化后的等价C程序再编译,烧写到51中。这样的好处是人是自然的,51也是愉快的。代价也是有的,就是转换后的等价程序很难懂。如果客户想要源程序,把此转化后的版本送给客户,可以达到不但送出的源程序而且又能保护知识产权的目的。如果用人工法,很多的if-then或switch,它的时间复杂度是1阶。我做的方法时间复杂度降到0阶(常数复杂度)
自以为是
island0209 2013-12-10
  • 打赏
  • 举报
回复
谢谢分享,对于单片机编程来讲,带不带操作系统还是要看具体的需求。
nicekwell 2013-12-10
  • 打赏
  • 举报
回复
引用 11 楼 xqhrs232 的回复:
难道LZ要给我们国家出个OS?
当然不是,国内写操作系统的人也不少。而且已经有那么几个成熟好用的OS了,写OS还是主要以学习为目的
lb610122 2013-12-10
  • 打赏
  • 举报
回复
多谢,收藏 了
nicekwell 2013-12-10
  • 打赏
  • 举报
回复
引用 15 楼 island0209 的回复:
谢谢分享,对于单片机编程来讲,带不带操作系统还是要看具体的需求。
aye
whysoft 2013-12-09
  • 打赏
  • 举报
回复
我也是上班加上加班实在无聊在这聊聊。没别的意思。只是想预测你将如同另外的1亿个同样对OS感兴趣的人一样,最终把这个OS研究消失于无形罢了。 简单地进行文本处理解决比较容易 我是先做成了这样的程序,才在此说这比较容易的,我为51做了一个C的等价转换程序,把占用式等价转换成中断式,大约C++语句300行以内。编写程序时,采用最自然的占用式的想法来做。经转化后的等价C程序再编译,烧写到51中。这样的好处是人是自然的,51也是愉快的。代价也是有的,就是转换后的等价程序很难懂。如果客户想要源程序,把此转化后的版本送给客户,可以达到不但送出的源程序而且又能保护知识产权的目的。如果用人工法,很多的if-then或switch,它的时间复杂度是1阶。我做的方法时间复杂度降到0阶(常数复杂度)
whysoft 2013-12-09
  • 打赏
  • 举报
回复
在你的PDF的前半部分,你在讨论关于单片机,主要的思想是关于过程任务的定时器化 这个思想真的是很高明的。 我最近也在思考这个问题。 看来单片机做多了自然就会想到这条路上。 后半部分,你把思想提高到OS的角度,个人认为有点跑偏了,有点过度了。 古人云过尤不及。 过程任务的定时器化其实是可以考虑用形式化的方法直接表达到程序结构中去的,不必显式地引入OS。 而引用OS对整个系统的负担太重了,大多数项目中是不能承受之重。 我在考虑的是程序编写仍然按占用式,这是一种最自然的思考方式,由于占用式与最终的定时器化式本质上是等价的,所以必然有一种形式化方法直接转化之为后者, 也就是说,编程时,我们用最接近人脑的办法,后面的工作全推给计算机去做。最终得到形式上最恰当的一个等价程序。 个人认为,OS不是必需存在的,但OS的任务是必然需要解决的。我们应集中精力在这必须解决之任务本质上,而不要拘泥于OS这个外在形式
xqhrs232 2013-12-09
  • 打赏
  • 举报
回复
难道LZ要给我们国家出个OS?
nicekwell 2013-12-09
  • 打赏
  • 举报
回复
引用 9 楼 whysoft 的回复:
这种形式化地转换程序为其等价形式的办法很简单,只是一个普通的文本文件处理程序罢了。另外, 我猜,"定时器化的编程方式"这个名词是你想出来的,并不是一个专用名词. 这个方式在OS界称为"时间节拍",在实时OS(RTOS)中的基本概念. 你在单片机编程中发现了问题,为了解决之,引入OS这个概念,这个初衷是好,但引入OS概念后虽然貌似解决了一个问题 ,却又带来了(可能是999个)新问题,最终的综合结果是什么也没解决。可能更糟。 这个现象在业界称为“技术的报复”,已经学者专门研究并有书出版。 这种用引入问题来解决问题的思路很常见。当前,乐观的学者倾向于认为,引入的问题的数量从概率上要小于解决的问题,所以人类正在向好的方向发展。当然悲观学者持相反态度。 嵌入式方面非常讲究嵌入思想。比如sqlite,比如vx,都是本着把自身融合到应用本身当中去的思路来做。个人认为,这个思路比较恰当,而不是把OS提纯出来显式地实现之。
我想这个问题并不是简单地进行文本处理解决的,因为每种功能的实现方法差别是很大的。虽然它们本质上完成的功能相同,但要编译为这种离散运行的形式确实不容易。 “定时器化”的确是我想的名字,因为我没见过其他地方系统地介绍过这种程序结构,所以把过程式任务改为在定时器里运行的任务自然就想到“任务的定时器化”这个词。但同时我当然也是知道“时钟节拍”概念的,不过在那里并不需要引出时钟节拍的概念,因为这完全是在单片机编程中自然发展出来的结构,也正因为这种结构和OS有很大的共同点,所以后来才引入OS的。 关于OS的介绍确实不多,用你的话说就是引入了OS的概念,但是却没有解决一大堆这个概念带来的新问题。 一方面,在开始学习OS之前,我对OS充满了好奇。然而在看了很多资料之后发现它们介绍了OS的工作原理,介绍了很多管理机制(优先级、时间管理、信号量等),但是它们都没介绍操作系统的底层是如何实现的,我还是不知道操作系统最底层的工作原理是什么。当然这些问题后来我是清楚了,操作系统最基本的功能是任务切换,而更复杂的内核的构建属于任务切换基础上的上层控制系统。对于初学操作系统的人,至少对于初学OS的我,我更关心的是前者。我只介绍了任务切换功能的实现,而几乎没有介绍内核应该如何构建,这可能就是你说的那999个问题。 但另一方面,如果要全面介绍操作系统的话那可能要写好几百页了,而且我也没那个能力。另外介绍内核的书很多,有介绍操作系统原理的,也就介绍具体的某个操作系统的。我在文中也推荐了一本《底层工作者手册之嵌入式操作系统内核》,这本书是从任务切换开始,教你如何一步一步构建复杂操作系统。 我的初衷是分享我对操作系统的理解,从最底层开始介绍OS执行程序的方式和不用OS的区别。相信很多还没入学操作系统的人对此也是充满好奇的;但对于想要系统学习操作系统的人,本文内容确实远远不足。 总之希望你能从中找到对你有用的,如果感觉有什么不足的地方欢迎吐槽(但是我不打算改了
whysoft 2013-12-09
  • 打赏
  • 举报
回复
这种形式化地转换程序为其等价形式的办法很简单,只是一个普通的文本文件处理程序罢了。另外, 我猜,"定时器化的编程方式"这个名词是你想出来的,并不是一个专用名词. 这个方式在OS界称为"时间节拍",在实时OS(RTOS)中的基本概念. 你在单片机编程中发现了问题,为了解决之,引入OS这个概念,这个初衷是好,但引入OS概念后虽然貌似解决了一个问题 ,却又带来了(可能是999个)新问题,最终的综合结果是什么也没解决。可能更糟。 这个现象在业界称为“技术的报复”,已经学者专门研究并有书出版。 这种用引入问题来解决问题的思路很常见。当前,乐观的学者倾向于认为,引入的问题的数量从概率上要小于解决的问题,所以人类正在向好的方向发展。当然悲观学者持相反态度。 嵌入式方面非常讲究嵌入思想。比如sqlite,比如vx,都是本着把自身融合到应用本身当中去的思路来做。个人认为,这个思路比较恰当,而不是把OS提纯出来显式地实现之。
nicekwell 2013-12-09
  • 打赏
  • 举报
回复
引用 7 楼 whysoft 的回复:
在你的PDF的前半部分,你在讨论关于单片机,主要的思想是关于过程任务的定时器化 这个思想真的是很高明的。 我最近也在思考这个问题。 看来单片机做多了自然就会想到这条路上。 后半部分,你把思想提高到OS的角度,个人认为有点跑偏了,有点过度了。 古人云过尤不及。 过程任务的定时器化其实是可以考虑用形式化的方法直接表达到程序结构中去的,不必显式地引入OS。 而引用OS对整个系统的负担太重了,大多数项目中是不能承受之重。 我在考虑的是程序编写仍然按占用式,这是一种最自然的思考方式,由于占用式与最终的定时器化式本质上是等价的,所以必然有一种形式化方法直接转化之为后者, 也就是说,编程时,我们用最接近人脑的办法,后面的工作全推给计算机去做。最终得到形式上最恰当的一个等价程序。 个人认为,OS不是必需存在的,但OS的任务是必然需要解决的。我们应集中精力在这必须解决之任务本质上,而不要拘泥于OS这个外在形式
看得很仔细嘛! 引入OS是因为定时器化的编程方式很多思想也OS很像,我不知道单片机编程结构如果继续往后发展又会产生什么新的结构,但最终应该必然会走向OS吧。并不是说引入OS一定会更好,如果用简单的结构可以实现,完全没必要搞复杂的结构,更没有必要用OS,一切以使用需求为准。 关于你说的定时器化任务的编写,你的意思是说先写成普通过程式任务,然后按照固定的套路修改。 如果能找到固定的方法当然是最好了,那样就能像你说的交给计算机去做。但是目前我没有找到通用的方法,所以才在文中举了好多例子。 当然,如果你找到了方法也非常欢迎交流。
nicekwell 2013-12-08
  • 打赏
  • 举报
回复
不用客气!
palleexu 2013-12-08
  • 打赏
  • 举报
回复
多谢楼主的热心分享!
91program 2013-12-07
  • 打赏
  • 举报
回复
多谢分享,下载收藏
nicekwell 2013-12-07
  • 打赏
  • 举报
回复
引用 1 楼 ifreecoding 的回复:
编程后总结,这是个好习惯,编程后思考,这样才能提高
没错!还要多谢你写的《底层工作者手册》,解决了我很多疑惑
zodiac1111 2013-12-07
  • 打赏
  • 举报
回复
感謝分享1024
ifreecoding 2013-12-07
  • 打赏
  • 举报
回复
编程后总结,这是个好习惯,编程后思考,这样才能提高

27,512

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧