本帖最后由 baiyongbin2009 于 2014-12-22 16:54 编辑 + A' ^4 c' W7 ?0 R# S9 T
4 [: V/ v, n7 r
特别说明:
) l6 E) x9 r& t1 K6 Q1. 本教程是安富莱电子原创。
0 |6 Y: y' ~- T# M; X: x9 ~3 d x2. 安富莱STM32F407开发板资料已经全部开源,开源地址:地址链接
; T0 E( J; m* [; W- |- R7 [. {3. 当前共配套300多个实例,4套用户手册。( q0 h! a' ~! c' W1 v6 k3 V0 b
第9章 μCOS-III系统移植文件详解
! z3 f/ Y `% m 本期教程主要主要跟大家讲解μCOS-III系统的官方移植文件,理解这几个移植文件很重要,如果这几个文件理解的比较深入的话,对于后面学习源码大有裨益。这几个文件主要就是实现任务切换的功能,关于任务切换咱们在前面几期已经详细讲解了工作原理(没有看的同学一定要看第4章和第5章,要不理解学习本章教程依然吃力),本期教程就是结合前面讲解,进一步讲解μCOS-III中任务切换实现的原理。 9.1 移植文件 9.2 os_cpu.h文件讲解 9.3 os_cpu_c.c文件讲解 9.4 os_cpu_a.asm文件讲解 9.5 总结 9.1 移植文件 官方提供的uCOS-III,uC-LIB,uC-CPU文件中都有Ports文件夹,咱们主要关心的是uCOS-III中的Ports文件夹。Ports文件夹中含有如下三个版本的移植文档: 4 v% N4 M0 L" F/ @9 H
RealView就是用MDK编译器的移植文件,其余两个文件夹中的移植文件是用IAR和GUN的。咱们就以RealView中的移植文件为例跟大家详细的讲解下。RealView中的文件如下:
e0 M) y4 E% M- i: A os_cpu.h,os_cpu_c.c,os_cpu_a.asm这三个文件在移植过程中最重要,下面主要的就是把这三个文件中的内容详细讲解一下。 9.1 os_cpu.h文件讲解 此头文件的内容比较少,下面就将里面的内容说明一下 9.2.1 宏定义- #ifdef OS_CPU_GLOBALS
8 b: ]$ d7 T X& N - #define OS_CPU_EXT
0 P2 d( Z9 X, F' R1 z% s! l0 j - #else
( ^! p8 w1 H* a5 s$ R- |( Y - #define OS_CPU_EXT extern % z% N6 o- G2 i6 F+ R" |' v" x
- #endif
$ I' v+ r. ~- n& D7 c; G: H$ n -
) Z# K( @, y. f1 w( \. W - /** x7 O/ Y# N- G( ~+ _$ }( R- n
- *********************************************************************************************************1 R* i) t4 K7 z- S. m0 D) |
- * MACROS
0 @6 Z% T$ n; T& A - *********************************************************************************************************
7 U9 e Y! ^5 \( ? - */
; r, K0 `( o/ }6 n! p5 | -
. L* U+ q6 \* T& N5 q. n - #define OS_TASK_SW() OSCtxSw()
复制代码 : b$ R a5 \3 i: I) Y6 j
l 由于工程中没有声明OS_CPU_GLOBALS,所以使用的都是#define OS_CPU_EXT extern源码的头文件中使用OS_CPU_EXT的地方很多,大家要记住这个的含义。 l #define OS_TASK_SW() OSCtxSw() 这个是任务级的任务切换函数,后面还有个中断级的任务切换。函数实体在os_cpu_a.asm文件中。此函数的主要功能就是实现任务的切换。 - /*
8 Q( b: k4 I, E; R9 H8 M( d& R - ********************************************************************************************************** B: e0 L" ~3 P9 c1 M
- * OS TICK INTERRUPT PRIORITY CONFIGURATION Q! u( ?% P7 x7 G- {0 f
- *" H6 y) i4 h( t; u& H
- * Note(s) : (1) For systems that don't need any high, real-time priority interrupts; the tick interrupt) R, D+ Q- S% Y, B, c" r
- * should be configured as the highest priority interrupt but won't adversely affect system$ B1 o. z3 t0 F, c9 g
- * operations.
" f: c/ y1 Q- R. I/ j - *9 a! O# a9 F' ^1 ^1 E$ ~
- * (2) For systems that need one or more high, real-time interrupts; these should be configured: x5 L- J. _" v! h, w% b! c
- * higher than the tick interrupt which MAY delay execution of the tick interrupt.
3 l' |: d/ I+ E# k9 l, e - *
+ i2 f) X8 Z) t+ j" i: P - * (a) If the higher priority interrupts do NOT continually consume CPU cycles but only* ?, B; O& r$ t" I
- * occasionally delay tick interrupts, then the real-time interrupts can successfully
; i) Q. I) @$ j3 T - * handle their intermittent/periodic events with the system not losing tick interrupts
" Y3 @6 Y, k6 B# `: q - * but only increasing the jitter.7 X! s& o( k* l& g1 e" E% `
- *
1 y: ]5 O$ T* X, I - * (b) If the higher priority interrupts consume enough CPU cycles to continually delay the
0 T* R4 s3 A y6 K2 G - * tick interrupt, then the CPU/system is most likely over-burdened & can't be expected
$ g4 y5 k3 O# h - * to handle all its interrupts/tasks. The system time reference gets compromised as a" a% L1 z( Z. U" A8 r
- * result of losing tick interrupts." h, O+ q5 ~( q5 ~! O6 I
- *********************************************************************************************************
+ \( @ r( X7 S, ~) x) L( i2 ^. ?6 l/ u - */2 ^" N6 r) v: R8 e. H3 z
- " @6 ^: W8 M) e8 T2 R$ z# N
- #define OS_CPU_CFG_SYSTICK_PRIO 0u
复制代码l OS_CPU_CFG_SYSTICK_PRIO 用于配制嘀嗒定时器的优先级。关于嘀嗒定时器优先级的配置还是很讲究的,也就是上面注释所写的。 Ø 对于那些不需要高优先级中断的系统,嘀嗒定时器中断要配置成最高优先级的中断,但是不能影响系统操作。 Ø 如果系统中多个高优先级的中断,而且优先级比嘀嗒定时器的优先级高,那么就可能会延迟嘀嗒定时器中断。 u 如果高优先级的中断不会持续的占有CPU,只是偶尔的延迟嘀嗒定时器中断,那么实时中断可以间歇性或者周期性的处理系统事件而不丢失嘀嗒定时器中断,只是增加抖动(因为高优先级中断的执行会抢占嘀嗒定时器中断的执行或者高优先级中断执行的时候嘀嗒定时器中断会一直得不到执行从而造成嘀嗒定时器中断在执行时间上的抖动)。 u 如果高优先级的任务长时间的占有CPU时间会造成系统超负荷运行,而不能执行嘀嗒定时器中断,任务也不能得到及时的执行。这种情况可以认为系统丢失了几次嘀嗒定时器的执行。 : f) a2 Q0 A Z5 G
|
(续)9.2 os_cpu.h文件讲解9 u" k9 `$ ]' l" E4 T( z
9.2.2 时间戳配置
. q- b; F# y6 O: ~% S$ x
1 }; ]& Z5 @4 J \! V
% `- ^. B0 J' K6 Z' q: E# z6 ? i