Hanker

uCOS 学习随笔 StepbyStep-2—— 理解中断(基于STM32控制的第四代圆梦小车)

0
阅读(10042)

[提要] 本文为 uCOS 学习随笔的第二篇,重点探讨 uCOS 中如何处理中断?如何实现定时?以及任务切换如何实现?为编写基于 uCOS 的应用程序打下基础。

一、缘由

   这一步本来计划结合需求搭建任务框架,完成概要设计的,之后再根据任务框架将任务逐一实施。

   可在第一步时就对系统的时基的形成存在疑惑,对 uCOSII 是如何实现定时的没有吃透,丝毫没有发现系统去使用 STM32 的定时器,也没有看到相应的中断处理,倒是发现:如果使用系统的延时函数,精度很难达到要求。

   因为小车需要产生 PWM 信号,虽说周期不算短,有 8ms 呢(125Hz),可如果将系统的 Tick 设置为 10ms,指望直接使用系统地定时不太可能了,必须另谋出路。

   而且,必须和 PWM 同步的电流、电压采样似乎也必须有较高的实时性。

   检测车轮转动的码盘信号最快约为 200 Hz, 周期约5ms, 也必须靠中断采集。

   因此,要能恰当的搭建任务框架,必须很好的了解 uCOSII的中断实现机制,以及中断后任务是如何切换的。这样才能合理分配资源,以保证小车的控制遂心如愿。

   所以,将第二步改为“理解中断”,主要探讨系统中是如何实现定时的?是如何实现中断的?自己如何编写一个中断服务程序?中断处理中的信息如何与任务交互?如何通过中断激活相应的任务?

   基本掌握了这些,分配任务才能做到心中有底。

二、理解系统定时


   通过仔细阅读源码,基本理解了系统定时是如何实现的了。

   uCOSII 只使用了 STM32 的 SysTick,这部分没有使用ST的库,而且硬件上似乎系统只使用了 SysTick。 SysTick 的初始化及中断部分由 uCOSII 系统部分完成,准确地说是 STM32 移植部分。

   详细工作过程如下:   

   …… (因有大量截图,HTML中排版费时,故省略,有兴趣请下载PDF格式文件,下同)

三、如何构建自己的中断服务程序

   通过上述分析,可以知道,对于一个“控制性”的应用,靠系统的定时是无法实现实时的!

   “控制”不同于编写“人机交互”程序,人的响应相对于机器是很慢的,10ms对于人来说是一瞬间(据测量,人最快的反应时间是300ms),而对于控制中的随机事件,已很漫长。所以,要想掌握这类“实时多任务”操作系统,必须编写控制类的应用程序,才能得到锻炼,同时也才能理会为何要命名为“实时”“多任务”操作系统。

   在 uCOSII 中,如果需要构建一个受系统管理的中断服务程序,必须按照系统的规则,ST 公司所提供的中断响应程序框架不能使用了,但其相应的初始化程序还是可以使用的。

   ……

   如何构建一个硬件中断呢?

   ……

   中断又是如何工作的呢?

   ……

   在 uCOSII 中,是如何实现需要及时处理的事情优先处理的呢?

   ……

   如何将等待信号的任务激活呢?

   ……

四、牛刀小试


   理解了系统下如何构建中断、中断如何工作,为巩固之,应该尝试一下。

   此处“牛刀”是指 uCOSII ,我还没有“强大”到可以用“牛刀”自喻,对于我所要实现的功能,将 uCOS 比作“牛刀”一点也不为过。

   还是以 LED 闪烁为需求,一是可以与 Step-1 对比,二是减少硬件变化带来的“干扰”,三是和我原来为二代小车所做的 StepbyStep 相对应。

   此处需要用 STM32 的 Timer 作为定时器,利用中断方式控制 LED 闪烁。

   具体构思如下:

   ……

4.1 实现过程

   ……

4.2 感受

   编写 uCOS 下的 STM32 程序要同时考虑 2 个部分,系统部分参考 uCOS 的资料,而硬件部分,特别是初始化,要参考 STM32 固件库的资料和例程。

   就处理部分而言,和原来编程差别不大,主要在于程序的流程上。

   中断的编写有些区别,响应部分交给系统,而中断服务内容和以往一样。

   总的感觉,即便是在操作系统下编程,对硬件的了解还是很重要的,否则很难编写出可靠的程序,甚至根本编写不了。

   这个尝试中所遇到的问题就是硬件上的,开始运行时似乎总是在 Timer2 的中断中,后来仔细对照 STM32 的例程,才发现忘了清除中断标志,因为开始没有看例程的中断部分,认为不需要,结果产生此低级错误(主要是对 STM32 也不是很熟悉)。

   操作系统只是为你提供了一个可靠的框架,特别是调度部分,简化了编程的难度,但是最好要了解它是如何完成的,这样可以充分的利用其优势。


五、结语

   通过这一步,基本掌握了系统的中断机制和运行方式,特别是简单尝试后,基本对小车需要完成的控制有了初步的规划,下一步开始步入主题:构建小车的控制任务

uCOS 学习随笔 StepbyStep-2—— 理解中断(基于STM32控制的第四代圆梦小车)PDF版本,含代码.pdf

(20110107)