guangmangdz 发表于 2011-12-23 03:25

手把手教你写单片机RTOS 第一章&&第二章

<SPAN style="FONT-FAMILY: 宋体">
<P style="TEXT-ALIGN: center; LINE-HEIGHT: 240%; MARGIN: 17pt 0cm; mso-outline-level: 1" class=MsoNormal align=center><A name=_Toc24122></A><A name=_Toc18901></A><A name=_Toc4328><SPAN style="mso-bookmark: _Toc18901"><SPAN style="mso-bookmark: _Toc24122"><B><SPAN style="LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; FONT-SIZE: 22pt; mso-bidi-font-size: 10.0pt">第一章 开发缘由</SPAN></B></SPAN></SPAN></A><SPAN style="mso-bookmark: _Toc24122"></SPAN><SPAN style="mso-bookmark: _Toc18901"></SPAN><SPAN style="mso-bookmark: _Toc4328"></SPAN><B><SPAN style="LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; FONT-SIZE: 24pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P></SPAN>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">一直以来想亲手写出一个小型实时操作系统来,起初编程功力不够,且对操作系统原理了解甚少,所以迟迟没能实现。此后笔者抽出大量时间来研究邵贝贝那本<SPAN lang=EN-US>uCOSII</SPAN>,多次试验代码,逐渐从中屡出一条可行的自行设计<SPAN lang=EN-US>RTOS</SPAN>路线,于是整理下来,读者感兴趣的话可以跟着本书实验一步一步练下去,这样您在不知不觉中已经学会编写<SPAN lang=EN-US>RTOS</SPAN>原理并最终写出属于你的<SPAN lang=EN-US>RTOS</SPAN>来,这样才能真正体现出本文的价值。<SPAN lang=EN-US></SPAN></SPAN></P><SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">此文将围绕大家最熟悉的<SPAN lang=EN-US>51</SPAN>单片机平台展开整个<SPAN lang=EN-US>RTOS</SPAN>内核的开发工作,意在让读者彻底学会如何写<SPAN lang=EN-US>RTOS</SPAN>,降低<SPAN lang=EN-US>RTOS</SPAN>在读者心中的难度。另外,该书所有代码均在<SPAN lang=EN-US>Cool 51</SPAN>单片机开发板上调试通过,目前该<SPAN lang=EN-US>RTOS</SPAN>支持<SPAN lang=EN-US>51</SPAN>、<SPAN lang=EN-US>AVR</SPAN>、<SPAN lang=EN-US>STM8S</SPAN>三种平台,并最终更名为<SPAN lang=EN-US>RaySRTOS</SPAN>(光芒操作系统)。代码可以在<U><SPAN lang=EN-US><A href="http://im.blog.chinaunix.net/" target=_blank><SPAN style="COLOR: purple">http://im.blog.chinaunix.net</SPAN></A></SPAN></U>上获取。若有问题可联系作者(光芒电子),或者加入<SPAN lang=EN-US>QQ</SPAN>群<SPAN lang=EN-US>139218853</SPAN>详细讨论。</SPAN>
<DIV>
<P style="TEXT-ALIGN: center; LINE-HEIGHT: 240%; MARGIN: 17pt 0cm; mso-outline-level: 1" class=MsoNormal align=center><A name=_Toc26026><B><SPAN style="LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; FONT-SIZE: 24pt; mso-bidi-font-size: 10.0pt">第二章<SPAN lang=EN-US> RTOS</SPAN>基础知识</SPAN></B></A><B><SPAN style="LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; FONT-SIZE: 24pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-ALIGN: left; LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 2" class=MsoNormal align=left><A name=_Toc23659><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.1</SPAN></B></A><SPAN style="mso-bookmark: _Toc23659"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt">什么是<SPAN lang=EN-US>RTOS</SPAN>?</SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">打个比方,若是单片机不跑<SPAN lang=EN-US>RTOS</SPAN>,用主循环<SPAN lang=EN-US>+</SPAN>中断处理程序完成功能(前后台系统),就好比老板一人开了一家公司,老板一人负责“研发”、“销售”、“售后”三种工作(任务)。比如老板正在搞研发,突然来客户了,老板就要暂停研发转而去搞“销售”,销售完后再回来继续研发(把销售看成一种中断)。那比如客户买的产品出了问题,那老板得暂停研发去做售后(售后是另一种中断)。问题就出来了,老板一个人始终无法同时顾及研发、销售、售后三个工作,导致公司运营不佳。这里读者们想到了,可以多顾几名员工啊?说对了,单片机跑<SPAN lang=EN-US>RTOS</SPAN>就是相当于开公司多了很多员工。<SPAN lang=EN-US>RTOS</SPAN>就是一个可以将单片机扩展成多个“相对独立小任务”的平台,老板可以顾<SPAN lang=EN-US>3</SPAN>名员工,让<SPAN lang=EN-US>3</SPAN>个员工分别负责“研发”、“销售”、“售后”三个工作,老板的工作就是负责将<SPAN lang=EN-US>3</SPAN>名员工各自的任务分配好即可。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">各个“相对独立小任务”宏观上来看是同时执行的,这是<SPAN lang=EN-US>RTOS</SPAN>一个显著特点,可能有人要问“只有一个<SPAN lang=EN-US>CPU</SPAN>,怎么能做到同时执行多个代码呢?”巧妙之处就在这里,<SPAN lang=EN-US>RTOS</SPAN>在微观上是在各个“相对独立小任务”之间快速切换的,切换速度快到宏观上感觉小任务是同时运行的。这个“切换速度”,就是<SPAN lang=EN-US>RTOS</SPAN>里边所说的系统节拍。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">怎么理解“相对独立小任务”中“独立”二字呢?独立的意思就是各个小任务之间的执行过程是相对独立的,互不干扰。<SPAN lang=EN-US>3</SPAN>名员工的工作是各不相同的,各执其责的。但为何要“相对独立”呢?比方搞研发的员工没有开发出产品,那么销售就没东西可卖,售后也相应没事儿做了,要想整体运行正确,则各个任务必须协调好,互相汇报进度。这就是<SPAN lang=EN-US>RTOS</SPAN>中的任务间通信概念。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">这三名员工的工作其实是有轻重缓急之分的。前期搞研发的优先级最高,搞出产品后销售就是主角了,销售完后呢?售后就要做的更好。要想经营好整个公司,老板就要决定哪个员工何时该抓点紧,哪个员工工作可以放慢些,总也有个任务分配策略。这个分配策略,就是<SPAN lang=EN-US>RTOS</SPAN>中的调度算法。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">相信读者对<SPAN lang=EN-US>RTOS</SPAN>有个简单的概念了吧。<SPAN lang=EN-US>RTOS</SPAN>从功能上是将单片机单一的执行结构扩展成了多个“相对独立小任务”。从开发角度上由原来的“主循环<SPAN lang=EN-US>+</SPAN>中断处理程序”思想扩展成了“编写<SPAN lang=EN-US>N</SPAN>个执行任务”思想。为我们开发复杂多任务程序提供了便利。<SPAN lang=EN-US></SPAN></SPAN></P><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-size: 10.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang=EN-US><BR style="PAGE-BREAK-BEFORE: always" clear=all></SPAN>
<P style="TEXT-ALIGN: left; LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 2" class=MsoNormal align=left><A name=_Toc15720></A><A name=_Toc15833><SPAN style="mso-bookmark: _Toc15720"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 18pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.2 RTOS</SPAN></B></SPAN></A><SPAN style="mso-bookmark: _Toc15833"><SPAN style="mso-bookmark: _Toc15720"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 18pt; mso-bidi-font-size: 10.0pt">的优点与缺点</SPAN></B></SPAN></SPAN><SPAN style="mso-bookmark: _Toc15720"></SPAN><SPAN style="mso-bookmark: _Toc15833"></SPAN><SPAN style="FONT-FAMILY: 宋体" lang=EN-US></SPAN></P>
<P style="LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 3" class=MsoNormal><A name=_Toc17764></A><A name=_Toc19156><SPAN style="mso-bookmark: _Toc17764"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.2.1 RTOS</SPAN></B></SPAN></A><SPAN style="mso-bookmark: _Toc19156"><SPAN style="mso-bookmark: _Toc17764"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt">优点</SPAN></B></SPAN></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 7.8pt 0cm; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体" lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN><SPAN style="FONT-FAMILY: 宋体">提高开发效率<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体" lang=EN-US>RTOS</SPAN><SPAN style="FONT-FAMILY: 宋体">使单片机开发多任务程序变得简单直观,用户只关心任务分配即可,比如我们要做一个电子时钟的程序,完全可以把“数码管刷新”、“秒计时”、“按键检测“、”调节时间程序”分为<SPAN lang=EN-US>4</SPAN>个任务,这样程序会编写容易而且维护方便。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 7.8pt 0cm; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体" lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN><SPAN style="FONT-FAMILY: 宋体">运行效率高<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">我们平时编程用到延时是很常见的,在<SPAN lang=EN-US>RTOS</SPAN>里面延时<SPAN lang=EN-US>OS_Delay</SPAN>()和普通程序的<SPAN lang=EN-US>Delay</SPAN>()是完全不一样的。普通的程序延时仅仅是<SPAN lang=EN-US>CPU</SPAN>执行循环代码,是不是感觉做了很多无用功?在<SPAN lang=EN-US>RTOS</SPAN>里边,延时其实是主动将<SPAN lang=EN-US>CPU</SPAN>让给其他任务代码,等到延时时间一到,再将<SPAN lang=EN-US>CPU</SPAN>“拽”回来。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 7.8pt 0cm; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体" lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN><SPAN style="FONT-FAMILY: 宋体">移植方便<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">各种平台之间程序大体风格是不变的,得益于<SPAN lang=EN-US>RTOS</SPAN>的标准框架,使得程序整体代码风格趋于一致化,这将使程序移植变得简单可靠。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 3" class=MsoNormal><A name=_Toc31880><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.2.2 RTOS</SPAN></B></A><SPAN style="mso-bookmark: _Toc31880"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt">缺点</SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 7.8pt 0cm; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体" lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN><SPAN style="FONT-FAMILY: 宋体">需要占用额外的资源<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">单片机使用<SPAN lang=EN-US>RTOS</SPAN>,由于要在各个任务代码之间进行快速切换,以达到“同时”运行的目的,执行调度函数最增加<SPAN lang=EN-US>CPU</SPAN>负荷。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 7.8pt 0cm; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体" lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN><SPAN style="FONT-FAMILY: 宋体">使单片机中断响应变差<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">一般微型<SPAN lang=EN-US>RTOS</SPAN>在切换任务时候需要关闭系统总中断,否则会错误的操作堆栈,这段时间是不响应任何中断的。从而使单片机在中断响应上要慢一些。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="LINE-HEIGHT: 20pt; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-layout-grid-align: none; mso-line-height-rule: exactly" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN>&nbsp;</P>
<P style="TEXT-ALIGN: left; LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; LAYOUT-GRID-MODE: char; mso-outline-level: 2; mso-layout-grid-align: none" class=MsoNormal align=left><A name=_Toc14856><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 18pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.3</SPAN></B></A><SPAN style="mso-bookmark: _Toc14856"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 18pt; mso-bidi-font-size: 10.0pt">单片机跑<SPAN lang=EN-US>RTOS</SPAN>有必要吗</SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 18pt; mso-bidi-font-size: 10.0pt" lang=EN-US>?</SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">这估计是爱好者们争论最多的了,既然看到了<SPAN lang=EN-US>RTOS</SPAN>的利与弊,我们应当正确对待<SPAN lang=EN-US>RTOS</SPAN>在单片机开发中的位置。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">因为<SPAN lang=EN-US>RTOS</SPAN>需要单片机提供额外的<SPAN lang=EN-US>RAM ROM</SPAN>运行,并且会增加一些<SPAN lang=EN-US>CPU</SPAN>负荷,如果一个单片机在项目上有很大余量,那么可以选择使用<SPAN lang=EN-US>RTOS</SPAN>来做。如果单片机本身资源就很紧张,那就得不偿失了,不仅<SPAN lang=EN-US>RTOS</SPAN>跑不起来,连基本功能代码都放不下了。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">本文要在<SPAN lang=EN-US>51</SPAN>上写一个小型<SPAN lang=EN-US>RTOS</SPAN>,主要为了学习<SPAN lang=EN-US>RTOS</SPAN>原理用,以后读者从<SPAN lang=EN-US>51</SPAN>编程转<SPAN lang=EN-US>ARM</SPAN>学习会容易很多。笔者曾将该<SPAN lang=EN-US>RTOS</SPAN>移植在<SPAN lang=EN-US>AVR</SPAN>和<SPAN lang=EN-US>STM8</SPAN>上,占用<SPAN lang=EN-US>200B ram 1KB rom</SPAN>,运行良好。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="TEXT-ALIGN: left; LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; LAYOUT-GRID-MODE: char; mso-outline-level: 2; mso-layout-grid-align: none" class=MsoNormal align=left><A name=_Toc10288><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 18pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.4 RTOS</SPAN></B></A><SPAN style="mso-bookmark: _Toc10288"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 18pt; mso-bidi-font-size: 10.0pt">的一些基本概念</SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 黑体; FONT-SIZE: 18pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 3" class=MsoNormal><A name=_Toc15215><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.4.1 </SPAN></B></A><SPAN style="mso-bookmark: _Toc15215"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt">任务<SPAN lang=EN-US>(TASK)</SPAN></SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">任务(<SPAN lang=EN-US>Task</SPAN>)是<SPAN lang=EN-US>RTOS</SPAN>中最重要的操作对象,每个任务在<SPAN lang=EN-US>RTOS</SPAN>调用下由<SPAN lang=EN-US>CPU</SPAN>分时运行。</SPAN><SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></P>
<P style="LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 3" class=MsoNormal><A name=_Toc13184><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.4.2 </SPAN></B></A><SPAN style="mso-bookmark: _Toc13184"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt">调度<SPAN lang=EN-US>(Sched)</SPAN></SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">调度是<SPAN lang=EN-US>RTOS</SPAN>的核心,调度就是<SPAN lang=EN-US>RTOS</SPAN>使<SPAN lang=EN-US>CPU</SPAN>在各个任务之间进行切换,达到宏观上同时执行的效果,调度也称为“上下文切换”。</SPAN><SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></P>
<P style="LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 3" class=MsoNormal><A name=_Toc5396><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.4.3 </SPAN></B></A><SPAN style="mso-bookmark: _Toc5396"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt">抢占和协作</SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">在<SPAN lang=EN-US>21ic</SPAN>上有一个经典例子比喻,“你<SPAN lang=EN-US>(</SPAN>小工<SPAN lang=EN-US>)</SPAN>在用厕所,经理在外面排第一,老板在外面排第二。如果是前后台,不管是谁,都必须按排队的次序使用厕所;如果是协作式,那么可以等你用完厕所,老板就要比经理先进入;如果是占先式,只要有更高级的人在外面等,那么厕所里无论是谁,都要第一时间让出来,让最高级别的人先用。”</SPAN><SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-size: 10.0pt" lang=EN-US> </SPAN></P>
<P style="LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 3" class=MsoNormal><A name=_Toc13686><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.4.4 </SPAN></B></A><SPAN style="mso-bookmark: _Toc13686"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt">系统节拍</SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体" lang=EN-US>RTOS</SPAN><SPAN style="FONT-FAMILY: 宋体">调度时候是一直在各个<SPAN lang=EN-US>TASK</SPAN>之间切换的,切换的快慢就是系统节拍,如果系统节拍是<SPAN lang=EN-US>100Hz</SPAN>,那么每秒<SPAN lang=EN-US>TASK</SPAN>会被<SPAN lang=EN-US>RTOS</SPAN>切换<SPAN lang=EN-US>100</SPAN>次(不算主动切换次数)。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 3" class=MsoNormal><A name=_Toc23971><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.4.5 </SPAN></B></A><SPAN style="mso-bookmark: _Toc23971"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt">中断级调度和任务级调度</SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-char-indent-count: 2.0; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">中断级调度就是由系统节拍引起的被动的调度,在当前执行任务即使还未释放<SPAN lang=EN-US>CPU</SPAN>时也会发生的。任务级调度是任务主动去释放<SPAN lang=EN-US>CPU</SPAN>而发生的调度。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="LINE-HEIGHT: 170%; MARGIN: 13pt 0cm; mso-outline-level: 3" class=MsoNormal><A name=_Toc32525><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US>2.4.6 </SPAN></B></A><SPAN style="mso-bookmark: _Toc32525"><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt">任务堆栈</SPAN></B></SPAN><B><SPAN style="LINE-HEIGHT: 170%; FONT-FAMILY: 宋体; FONT-SIZE: 15pt; mso-bidi-font-size: 10.0pt" lang=EN-US></SPAN></B></P>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">每个任务(<SPAN lang=EN-US>TASK</SPAN>)执行都有自己的一个任务堆栈,存放着自己的入口,各个寄存器值、中间执行结果等。各个任务的任务环境都是独立私有的,互不干扰。比如<SPAN lang=EN-US>TASK1</SPAN>有自己的堆栈<SPAN lang=EN-US>Task1Stack</SPAN>,<SPAN lang=EN-US>TASK2</SPAN>有自己的堆栈<SPAN lang=EN-US>Task2Stack</SPAN>,两个堆栈内容是不一样的。<SPAN lang=EN-US></SPAN></SPAN></P><SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang=EN-US>RTOS</SPAN><SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">基本术语还有很多,就不一一罗列了,笔者尽量用简练的语言来让读者学会单片机<SPAN lang=EN-US>RTOS</SPAN>的概念,争取也写出自己的<SPAN lang=EN-US>RTOS</SPAN>。</SPAN></DIV>

wequal 发表于 2018-06-28 14:27

nkjjkgkljhl
页: [1]
查看完整版本: 手把手教你写单片机RTOS 第一章&amp;&amp;第二章