特别说明:
- n, M8 r* J5 w% P+ [1 w$ ~1. 本教程是安富莱电子原创。
: K# P. k0 x5 U2. 安富莱STM32F407开发板资料已经全部开源,开源地址:地址链接 I+ a% l9 Q4 p- q) x
3. 当前共配套300多个实例,4套用户手册。+ R+ z1 j, D! N8 ^4 Z( a3 e
第11章 μCOS-III内核函数分析 5 f& X8 l/ P. `) B; M6 R7 g
本期教程开始分析μCOS-III的内核函数,源码的分析采用先对源码进行注释,然后讲解函数实现的功能和相关的原理分析,最后是举一个例子(如果这个函数是供外部函数调用的)。内核函数很重要,是学习任务管理,任务间通信机制的基础。希望初学的同学认真学习,这部分应该算是μCOS-III的核心代码。 11.1 系统配置文件 11.2 源码文件 11.3 μCOS-III初始化 11.4 μCOS-III启动 11.5 获取系统版本 11.6 空闲任务 11.7 临界段 11.8 安全关键IEC61508 11.9 任务切换 11.10 调度锁 11.11 Round-Robin调度 11.12 总结
6 u& V8 d) `' Q/ N9 R11.1 系统配置文件 下面先简单说明下μCOS-III中几个配置文件的作用,方便分析源码的时候查看,配置文件主要有以下几个: ' {" A# n5 G) h; s: d
11.1.1 lib_cfg.h配置文件 lib_cfg.h文件内容如下: - /*$ a" n. I) o5 _
- *********************************************************************************************************4 Z3 c9 q) Y5 S* d8 q" F1 F
- * MODULE
2 G1 B' b2 T3 X5 [2 X, f - *********************************************************************************************************# V8 n( g0 g" a7 [
- */
) M4 q5 V- e, H' Q0 c7 A1 x2 B0 s$ y - 8 g% L: U/ `9 m/ T
- #ifndef LIB_CFG_MODULE_PRESENT
5 H$ x* e* h0 I - #define LIB_CFG_MODULE_PRESENT
1 f _) g2 W+ R3 h( i -
. ]% i$ ^! a4 y. y: k - /*1 J( @, z( J5 T* \# y
- *********************************************************************************************************
% r4 J) x3 Y0 f4 L; M - * uC/LIB CONFIGURATION( g/ q9 N7 p' i4 f
- *********************************************************************************************************+ f* P: L! H! c: ^7 N3 m
- */0 ^, ]4 p$ }- ]
-
/ `% Z& y3 \0 g- y/ g - #define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_ENABLED: b; h' N Q( E8 J$ h
- /* DEF_DISABLED Argument check DISABLED */. x$ g: l1 h8 |8 C0 V
- /* DEF_ENABLED Argument check ENABLED */4 F, T: X' N) T- F( j. N/ C) {) \
-
: c" T, [2 y# B: B# a( O - #define LIB_MEM_CFG_OPTIMIZE_ASM_EN DEF_ENABLED
) _* o0 B) S* U/ i/ I8 v3 U/ a - /* DEF_DISABLED Assembly-optimized function(s) DISABLED */8 I$ c1 R& d0 |9 ^. Q$ O V
- /* DEF_ENABLED Assembly-optimized function(s) ENABLED *// x3 S! P- K$ N% Z0 r
- - p. p2 Y; Q) Y( s
- #define LIB_MEM_CFG_ALLOC_EN DEF_ENABLED: V$ i; i; m `# X( b- B2 \
- /* DEF_DISABLED Memory allocation DISABLED */
3 g0 t$ E' ]" K" ?6 g' \7 Z - /* DEF_ENABLED Memory allocation ENABLED */- H' N% L. G1 {5 k& H; P) O4 A e
- 0 C4 T# m; Q/ Y" w/ s# ]
- #define LIB_MEM_CFG_HEAP_SIZE 23u * 1024u /* Configure Heap Memory Size */# Y1 _' ~; o9 f1 u" {& P* {8 V
- % u+ ~/ c% p, {9 K3 g! @+ M0 d
- /*
t2 _. X9 Q% O: m - *********************************************************************************************************- L0 A% E, j4 Z [1 O+ _$ C
- * MODULE END
& G. b/ P' w! M. Z7 T; O0 ^ - *********************************************************************************************************
+ O4 _+ f8 j: k$ M. E - */1 f& w+ R' R& [% j8 q) h% |& L: D
- X7 Q! I4 P8 X; ]
- #endif<span lang="EN-US" style="text-indent: 21.2pt; line-height: 12pt; font-size: 9pt; font-family: 新宋体; background-color: rgb(255, 255, 255);"> </span><span lang="EN-US" style="text-indent: 21.2pt; line-height: 12pt; font-family: 微软雅黑, sans-serif; background-color: rgb(255, 255, 255);"> </span>
复制代码 lib_cfg.h是用于给uC/LIB做配置的头文件。如果程序中使用uC/LIB的话,需要调用函数Mem_Init()进行初始化。 11.1.2 os_cfg.h配置文件 os_cfg.h文件中的内容如下: - #ifndef OS_CFG_H/ t9 G7 m- k6 p
- #define OS_CFG_H$ I% k# g; Z# Z8 @
- 5 D' h- Z# k: ~/ k
- 9 k- y2 g7 i' t; v. o/ t; w
- /* ---------------------------- MISCELLANEOUS -------------------------- */
/ X, a; G+ C' n$ X2 ^ - #define OS_CFG_APP_HOOKS_EN 1u /* Enable (1) or Disable (0) application specific hooks */2 D# ~2 l' X; U* o# y
- #define OS_CFG_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking */
) j7 s* Y( L# Y2 R8 X' |! g - #define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u /* Enable (1) or Disable (0) check for called from ISR */0 a- L: m# g+ i: p; V, V8 @+ ]
- #define OS_CFG_DBG_EN 1u /* Enable (1) debug code/variables */
6 o) E/ j& H6 [6 { - #define OS_CFG_ISR_POST_DEFERRED_EN 0u /* Enable (1) or Disable (0) Deferred ISR posts */7 Z0 }3 F0 N& `9 y
- #define OS_CFG_OBJ_TYPE_CHK_EN 1u /* Enable (1) or Disable (0) object type checking */; A) Y$ x' x! t: y& L; {! a
- #define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping */4 W: c" `- Z! }$ I9 o* J
-
0 |' k- D# N8 L( d2 [ - #define OS_CFG_PEND_MULTI_EN 1u /* Enable (1) or Disable (0) code generation for multi-pend feature */# C- }* W r; m- |- d9 s' l* q: Z0 Y
- 1 M1 ]1 j7 }0 u" o
- #define OS_CFG_PRIO_MAX 64u /* Defines the maximum number of task priorities (see OS_PRIO data type) */; g6 x. m& Q- i$ s; m' [/ N' m
-
A4 H, b. e4 @- Z7 J - #define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 0u /* Include code to measure scheduler lock time */
: _) O8 o6 {# @ - #define OS_CFG_SCHED_ROUND_ROBIN_EN 0u /* Include code for Round-Robin scheduling */8 O" ^7 }) }" W
- #define OS_CFG_STK_SIZE_MIN 64u /* Minimum allowable task stack size */ I, r7 l* x0 B( V
- , u. s3 c2 X8 U! z7 e9 }
-
* R0 d% @- ^) k9 Y- v$ u; _% Q - /* ----------------------------- EVENT FLAGS --------------------------- */
0 f# O; j6 W2 ?8 x5 @, ~1 X+ C# p - #define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */
& A6 g$ d v0 ?8 V0 Q. i - #define OS_CFG_FLAG_DEL_EN 1u /* Include code for OSFlagDel() */
# U+ E1 z. l( q* G# `2 o - #define OS_CFG_FLAG_MODE_CLR_EN 1u /* Include code for Wait on Clear EVENT FLAGS */
1 G- f5 l/ H; b$ l% J4 I - #define OS_CFG_FLAG_PEND_ABORT_EN 1u /* Include code for OSFlagPendAbort() */
& h3 I5 C4 Y' e- |, Q - 5 y6 i [: W% J. H k! A; m
-
4 b' ~! w$ r/ S - /* -------------------------- MEMORY MANAGEMENT ------------------------ */
, ?3 ^9 |* R6 [; O, c - #define OS_CFG_MEM_EN 1u /* Enable (1) or Disable (0) code generation for MEMORY MANAGER */
- B( ~$ K5 V+ @- s# C# k -
, i3 r J! r+ b9 |8 P s - 1 i5 D( c3 q# h# e9 G5 T! E
- /* --------------------- MUTUAL EXCLUSION SEMAPHORES ------------------- */. B; C' @5 t R" z1 U9 G' V7 V
- #define OS_CFG_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX */" a0 K6 j* L/ @7 V' T# Q
- #define OS_CFG_MUTEX_DEL_EN 1u /* Include code for OSMutexDel() */ n' r. b- l, U. a" A. q
- #define OS_CFG_MUTEX_PEND_ABORT_EN 1u /* Include code for OSMutexPendAbort() */
1 E/ h; D1 c4 X* Y) i - 3 E+ h* W" O* V( }
-
4 }; |& q$ r" y9 Q5 d - /* --------------------------- MESSAGE QUEUES -------------------------- *// k$ X: S8 I& @2 c2 X
- #define OS_CFG_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES */: R; c/ ~9 a6 V+ u
- #define OS_CFG_Q_DEL_EN 1u /* Include code for OSQDel() */
# y! |: s5 G; R( j4 V+ R- E - #define OS_CFG_Q_FLUSH_EN 1u /* Include code for OSQFlush() */
' L/ n2 a/ |1 e$ G: T - #define OS_CFG_Q_PEND_ABORT_EN 1u /* Include code for OSQPendAbort() */$ y8 O |2 }9 p5 b) f1 P8 q$ R
-
# ^) T* i$ n% K9 c8 j' m, }) m1 I e -
7 L: B2 D9 {4 l; u- n( b2 ? - /* ----------------------------- SEMAPHORES ---------------------------- */
3 ~. L* o$ k# }- { - #define OS_CFG_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES */$ L" H M1 E$ i& x- ?
- #define OS_CFG_SEM_DEL_EN 1u /* Include code for OSSemDel() */
. t. T8 Q$ X+ _ - #define OS_CFG_SEM_PEND_ABORT_EN 1u /* Include code for OSSemPendAbort() */3 Z0 H4 H* a5 u0 W% }
- #define OS_CFG_SEM_SET_EN 1u /* Include code for OSSemSet() */: v- @& z0 @# M3 x0 w
- ' v" D* a( a% {% C9 ]* S
- + Z; _' K" n( }/ ^
- /* -------------------------- TASK MANAGEMENT -------------------------- */7 {% y) z- J% D' b- a
- #define OS_CFG_STAT_TASK_EN 1u /* Enable (1) or Disable(0) the statistics task */
. f: c; F- ^; x$ @4 c% [ - #define OS_CFG_STAT_TASK_STK_CHK_EN 1u /* Check task stacks from statistic task */0 `# b7 C# w9 h7 z0 O4 O) @) N
- " {! c6 C1 p# S$ s4 |
- #define OS_CFG_TASK_CHANGE_PRIO_EN 1u /* Include code for OSTaskChangePrio() */
$ @8 q: T) f0 X$ { - #define OS_CFG_TASK_DEL_EN 1u /* Include code for OSTaskDel() */4 ?- w3 K$ D- E7 P" R
- #define OS_CFG_TASK_Q_EN 1u /* Include code for OSTaskQXXXX() */
: ~$ T3 e0 t+ Y. O - #define OS_CFG_TASK_Q_PEND_ABORT_EN 1u /* Include code for OSTaskQPendAbort() */
* o8 I- m7 u$ w# k) [ - #define OS_CFG_TASK_PROFILE_EN 1u /* Include variables in OS_TCB for profiling */9 H. i. D' y' G7 Y
- #define OS_CFG_TASK_REG_TBL_SIZE 1u /* Number of task specific registers */* i& d8 Q# Y6 }0 @7 @
- #define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u /* Include code for OSTaskSemPendAbort() */
$ Y. A4 R1 h+ v( l: \ - #define OS_CFG_TASK_SUSPEND_EN 1u /* Include code for OSTaskSuspend() and OSTaskResume() */0 E6 t5 W, X: b1 O2 v( s, p8 t5 D
- 2 Z( ]2 A, Y( U( O( F
- ) Z5 }- o6 z- w$ E+ J
- /* -------------------------- TIME MANAGEMENT -------------------------- */
0 R, N! T+ L( u8 p! b2 H - #define OS_CFG_TIME_DLY_HMSM_EN 1u /* Include code for OSTimeDlyHMSM() */- m+ U) w6 t4 q& T9 a
- #define OS_CFG_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume() */+ s* e- P7 x; l6 o! D8 F
- ) q2 m* B- b1 w6 O" G7 l
-
4 z- J- A' S% j# p8 T5 t - /* ------------------------- TIMER MANAGEMENT -------------------------- */
/ D* z' o" `/ T" J8 B* N% @ - #define OS_CFG_TMR_EN 1u /* Enable (1) or Disable (0) code generation for TIMERS */2 W. M( Y9 u9 h% r+ m2 S) k+ y
- #define OS_CFG_TMR_DEL_EN 1u /* Enable (1) or Disable (0) code generation for OSTmrDel() */
! v; r) @. d+ q6 c - + O @& v- Q6 g6 T) S2 @$ q x
- #endif
复制代码 这个配置文件比较的重要,主要用于μCOS-III源码中相关函数的配置。
! H S; _6 A" S" e |
4 V: u( n0 S; I& u
11.7 临界段7 o3 M- v o d- g0 i
4 |2 m7 J( k1 _7 C
11.7.1 临界段基本概念
8 n+ t& E* K$ ?# j" g
* O, p& S9 F4 W- |
: V4 C, U3 T& G! D0 c$ I
- L5 G" E# Z" s c T
\ n1 z4 k- |
& m C: p+ @/ H* V. f
11.3.2 初始化函数OSInit()
11.9.2 中断级任务切换OSIntExit()
11.9.3 函数使用举例
11.1.3 os_cfg_app.h配置文件
11.1.5 cpu_cfg.h配置文件
11.4.1 启动
5. 可接受凤险 (ACCeptable risk)
- }& y( Y2 E" {6 \9 P+ m
11.10.2 调度器解锁OSSchedUnlock
11.10.3 调度器被锁时间测量OS_SchedLockTimeMeas
11.10.4 函数使用举例