STM32-uCOS移植STM32-uCOS移植.pdf
文本预览下载声明
uCOS 学习随笔 StepbyStep-2 Project: fira-mirosot-robot
uCOS 学习随笔 StepbyStep-2
—— 理解中断(基于 STM32 控制的第四代圆梦小车)
一、缘由
这一步本来计划结合需求搭建任务框架,完成概要设计的,之后再根据任务框架将任务
逐一实施。
可在第一步时就对系统的时基的形成存在疑惑,对 uCOSII 是如何实现定时的没有吃透,
丝毫没有发现系统去使用 STM32 的定时器,也没有看到相应的中断处理,倒是发现:如果
使用系统的延时函数,精度很难达到要求。
因为小车需要产生PWM 信号,虽说周期不算短,有 8ms 呢(125Hz) ,可如果将系统的
Tick 设置为 10ms,指望直接使用系统地定时不太可能了,必须另谋出路。
而且,必须和 PWM 同步的电流、电压采样似乎也必须有较高的实时性。
检测车轮转动的码盘信号最快约为 200 Hz, 周期约5ms, 也必须靠中断采集。
因此,要能恰当的搭建任务框架,必须很好的了解 uCOSII 的中断实现机制,以及中断
后任务是如何切换的。这样才能合理分配资源,以保证小车的控制遂心如愿。
所以,将第二步改为“理解中断” ,主要探讨系统中是如何实现定时的?是如何实现中断
的?自己如何编写一个中断服务程序?中断处理中的信息如何与任务交互?如何通过中断激
活相应的任务?
基本掌握了这些,分配任务才能做到心中有底。
二、理解系统定时
通过仔细阅读源码,基本理解了系统定时是如何实现的了。
uCOSII 只使用了STM32 的 SysTick ,这部分没有使用ST 的库,而且硬件上似乎系统只
第 1 页 共 13 页
uCOS 学习随笔 StepbyStep-2 Project: fira-mirosot-robot
使用了 SysTick 。 SysTick 的初始化及中断部分由 uCOSII 系统部分完成,准确地说是
STM32 移植部分。
详细工作过程如下:
1) 在app.c 的App_TaskStart 中调用:
OS_CPU_SysTickInit()
此函数在 COMMON\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView\os_cpu_c.c 中定
义,主要完成 SysTick 的中断初始化。(从目录上看就知道属于移植部分)
2)在中断向量定义 Vectors.s 中定义了:
IMPORT OS_CPU_SysTickHandler 以及:
DCD OS_CPU_SysTickHandler ; 15, uC/OS-II Tick ISR Handler
将中断向量 15 定位于 SysTick 的中断服务程序。
3)在 COMMON\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView\os_cpu_c.c 中定义:
这就是SysTick 的中断处理程序。其中调用了 OSTimeTick ,处理系统的时基。
4)OSTimeTick 在 COMMON\uCOS-II\Source\os_core.c 中定义:
第 2 页 共 13 页
uCOS 学习随笔 StepbyStep-2 Project: fira-mirosot-robot
在这个函数中主要处理了处于等待状态任务(Waiting)的等待计时,也就是调用了以下
两个延时函数之一的任务:
void OSTimeDly (INT16U ticks) (在 OS_Time.c 中定义)
INT8U O
显示全部