特别说明:5 V; D M" u7 e% O) A3 B! m! b
1. 本教程是安富莱电子原创。! a4 a% J; H" c0 u6 u) b" s
2. 安富莱STM32F407开发板资料已经全部开源,开源地址:地址链接 _' p6 x& z8 F K% u% x$ Z/ ^
3. 当前共配套300多个实例,4套用户手册。
3 h4 [% u/ ~ |; @# c5 Q第11章 μCOS-III内核函数分析
& a1 d( I y; a3 } 本期教程开始分析μ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 总结 . b1 R; Z6 g/ g& V* ] |
11.1 系统配置文件 下面先简单说明下μCOS-III中几个配置文件的作用,方便分析源码的时候查看,配置文件主要有以下几个: 8 q+ ^8 D2 ?8 o" U/ W+ I
11.1.1 lib_cfg.h配置文件 lib_cfg.h文件内容如下: - /*$ q1 U& \* I! J9 h0 {; A
- *********************************************************************************************************
, W. Q( p7 o9 @6 U% X1 M; ^ - * MODULE- e! z2 s& M6 ^( E; g* t
- *********************************************************************************************************$ v5 t3 z: U/ I: u, l: B# _
- */: A# c# T+ G8 Q; {
- 0 u9 l6 y% X; J. I% T8 s5 Z
- #ifndef LIB_CFG_MODULE_PRESENT5 m% K5 N' H2 j$ i
- #define LIB_CFG_MODULE_PRESENT
. a5 R8 p$ ?4 i1 Y* H - 6 z7 |, U; i# Z3 D9 s
- /*& E D: y5 R Q3 j p9 B& z k/ a
- *********************************************************************************************************& k7 S- \# A4 J! u
- * uC/LIB CONFIGURATION
+ H% g; {5 b5 P9 N$ w- z - *********************************************************************************************************5 U0 ]0 y8 ]% D* }0 Q9 P
- */
. w) L1 q P$ ]* H, ?0 s -
; x& S9 j7 Q, _, g* h - #define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_ENABLED
7 k/ M9 o* X8 }4 G4 ~/ W - /* DEF_DISABLED Argument check DISABLED */
9 q' t2 y( D. J( {9 X1 V& d - /* DEF_ENABLED Argument check ENABLED */6 Y2 ?9 g1 H1 `% X
- / ~ b* Z* Q$ R9 M
- #define LIB_MEM_CFG_OPTIMIZE_ASM_EN DEF_ENABLED( K0 n5 d) n8 a4 e! W
- /* DEF_DISABLED Assembly-optimized function(s) DISABLED */ O$ t8 T1 H7 ~9 b
- /* DEF_ENABLED Assembly-optimized function(s) ENABLED */6 l$ N7 @ t( h$ a3 J, q8 t1 r; c
-
5 J4 M; A! w( o, V - #define LIB_MEM_CFG_ALLOC_EN DEF_ENABLED0 J- m1 m7 e7 G; W
- /* DEF_DISABLED Memory allocation DISABLED */
$ y9 c; H/ @) e8 ?. d" S+ x - /* DEF_ENABLED Memory allocation ENABLED */: v1 e. K* G4 b4 G/ n( T8 ]# I& K; K
- 5 ]# A* A& f' ]9 O8 i. Q. x. I
- #define LIB_MEM_CFG_HEAP_SIZE 23u * 1024u /* Configure Heap Memory Size */
0 I0 C8 W- t0 ^ G$ i - . V3 ~. B* f) M. j" v
- /*
$ W/ n- {+ ]1 o$ D o3 s - *********************************************************************************************************" d m. s. r# J! }1 b
- * MODULE END
( b9 D6 d; U+ s& S- F% W3 c - *********************************************************************************************************
( C2 P% g% ?& i2 w% R - */
* {) B3 n9 S6 E$ {% a! b5 u8 K - . q5 ?) P9 z/ N8 W2 V2 `% G6 G1 f
- #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
; n& A( W+ W) P. P) l0 C, P- m5 z4 l& ~ - #define OS_CFG_H7 z2 F8 Q+ m# x6 W
- 5 ]! g# `; z( t2 p' v; R# @
- 9 p# |" g( X2 G. r/ {% k
- /* ---------------------------- MISCELLANEOUS -------------------------- */2 v1 O# V+ r: C5 {' n
- #define OS_CFG_APP_HOOKS_EN 1u /* Enable (1) or Disable (0) application specific hooks */ S @1 ]: F( g/ a3 a2 `/ I
- #define OS_CFG_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking */" [9 ?. r+ [6 y+ b* r
- #define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u /* Enable (1) or Disable (0) check for called from ISR */; W! q' `. W' F j" F( n
- #define OS_CFG_DBG_EN 1u /* Enable (1) debug code/variables */* d0 E* ?8 N/ i0 W# f ^- U
- #define OS_CFG_ISR_POST_DEFERRED_EN 0u /* Enable (1) or Disable (0) Deferred ISR posts */
3 D5 }5 h/ i' c - #define OS_CFG_OBJ_TYPE_CHK_EN 1u /* Enable (1) or Disable (0) object type checking */
5 L6 A3 S" ?6 w3 U) @' U4 T' C - #define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping */
7 S8 H; o" q( [0 W. N" { -
; t) v1 k1 ~ o/ ]1 y U" j' r* \5 G$ \6 Q - #define OS_CFG_PEND_MULTI_EN 1u /* Enable (1) or Disable (0) code generation for multi-pend feature */+ `0 r7 J5 J" B( p8 S4 B
- & Z. Q: k$ i: H. p% }- N
- #define OS_CFG_PRIO_MAX 64u /* Defines the maximum number of task priorities (see OS_PRIO data type) */0 S9 u" X1 ]2 R
-
% |" V! [& r/ O/ C0 b - #define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 0u /* Include code to measure scheduler lock time */+ @9 {6 j. N& O. P: r9 d4 D
- #define OS_CFG_SCHED_ROUND_ROBIN_EN 0u /* Include code for Round-Robin scheduling */
; O L5 E2 M+ V$ K- J - #define OS_CFG_STK_SIZE_MIN 64u /* Minimum allowable task stack size */. I3 `! k0 @9 g" y3 x! I
- 1 o2 E: `( t7 ]( ^ K
- ) `# O) ~/ f: @. o
- /* ----------------------------- EVENT FLAGS --------------------------- */
9 |9 [7 A: X7 y2 W" ] - #define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */
7 R& T% C1 U, y9 m - #define OS_CFG_FLAG_DEL_EN 1u /* Include code for OSFlagDel() */1 l6 ^% A [6 L3 }
- #define OS_CFG_FLAG_MODE_CLR_EN 1u /* Include code for Wait on Clear EVENT FLAGS */; `. e" K% @7 t B. h
- #define OS_CFG_FLAG_PEND_ABORT_EN 1u /* Include code for OSFlagPendAbort() */
9 d' D+ C8 E5 ?" l# p+ o -
" F' r# `. n# j1 a( O -
5 P: E b4 b. u, i7 U" J' j - /* -------------------------- MEMORY MANAGEMENT ------------------------ */+ h* P& H$ c9 y) S( v0 K* w1 G$ A
- #define OS_CFG_MEM_EN 1u /* Enable (1) or Disable (0) code generation for MEMORY MANAGER */+ }+ E, \0 A- e8 j
-
& \% a8 ]! p. j9 f4 g -
# B$ q; D {$ Z2 z {2 K - /* --------------------- MUTUAL EXCLUSION SEMAPHORES ------------------- */2 @2 R. _% }1 ]3 F1 |; o
- #define OS_CFG_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX *// n) O5 _) x9 [/ A/ [6 }+ r
- #define OS_CFG_MUTEX_DEL_EN 1u /* Include code for OSMutexDel() */
& @, n' y+ s0 T+ e% B0 B- ~: w - #define OS_CFG_MUTEX_PEND_ABORT_EN 1u /* Include code for OSMutexPendAbort() */
! K" O$ i5 i/ V' G0 r - + s& ]' Y8 ^) H4 X
- ! R( ]! J2 Z3 l
- /* --------------------------- MESSAGE QUEUES -------------------------- */
& [7 F% q3 n$ _* `) q, p' A3 i# ?8 E' | - #define OS_CFG_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES */
- d# {6 z2 P4 o) x: M8 L - #define OS_CFG_Q_DEL_EN 1u /* Include code for OSQDel() */2 Q8 i: n+ v) K, g; O2 K
- #define OS_CFG_Q_FLUSH_EN 1u /* Include code for OSQFlush() */
* I7 o, [, y# y! S - #define OS_CFG_Q_PEND_ABORT_EN 1u /* Include code for OSQPendAbort() */2 s$ }' p" X! S
- 9 K+ e* O- ?/ g
- ! J8 ^: k" ? F' e. [
- /* ----------------------------- SEMAPHORES ---------------------------- */% ~6 E5 Y7 k% K9 ^0 g. N
- #define OS_CFG_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES */- y. a7 i! O1 t3 j/ q
- #define OS_CFG_SEM_DEL_EN 1u /* Include code for OSSemDel() */
; B+ p& U3 ?3 M3 T) S: C - #define OS_CFG_SEM_PEND_ABORT_EN 1u /* Include code for OSSemPendAbort() */
) s' q3 ]& I; y2 d* B* b |9 ] - #define OS_CFG_SEM_SET_EN 1u /* Include code for OSSemSet() */
9 y* d" |( c% T; P! s1 { - 8 w; i5 a$ K1 i/ A7 ~! s' ?+ W- G5 j
- : L& _: v( R; V
- /* -------------------------- TASK MANAGEMENT -------------------------- */
! W( Q1 Y' T0 Z9 Q8 `# J - #define OS_CFG_STAT_TASK_EN 1u /* Enable (1) or Disable(0) the statistics task */2 j" _5 c, T$ X n$ u) {+ d4 \
- #define OS_CFG_STAT_TASK_STK_CHK_EN 1u /* Check task stacks from statistic task */
$ D' K+ V, u; v' @ -
0 q: W$ y' A3 w. c - #define OS_CFG_TASK_CHANGE_PRIO_EN 1u /* Include code for OSTaskChangePrio() */- _+ ~: z0 K: t# p% R$ f
- #define OS_CFG_TASK_DEL_EN 1u /* Include code for OSTaskDel() */
2 \( G& F* r0 f( T1 R" q - #define OS_CFG_TASK_Q_EN 1u /* Include code for OSTaskQXXXX() */- x- \ ?1 k$ S, t
- #define OS_CFG_TASK_Q_PEND_ABORT_EN 1u /* Include code for OSTaskQPendAbort() */
! P7 \1 R2 L7 d( R/ ?$ ] - #define OS_CFG_TASK_PROFILE_EN 1u /* Include variables in OS_TCB for profiling */
+ `, Z. S5 q8 Y' k* m7 q - #define OS_CFG_TASK_REG_TBL_SIZE 1u /* Number of task specific registers */
3 y2 {' y0 v( D9 b* ~ - #define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u /* Include code for OSTaskSemPendAbort() */
2 N: v5 @9 d1 n+ ^8 r - #define OS_CFG_TASK_SUSPEND_EN 1u /* Include code for OSTaskSuspend() and OSTaskResume() */
; t1 g5 r$ ~( I7 f+ r - * ^2 ]- a' z& I/ z% r3 H) I
-
b, W1 S. i) M' f( ^ - /* -------------------------- TIME MANAGEMENT -------------------------- */
6 l% c: u0 y( R) ^: X - #define OS_CFG_TIME_DLY_HMSM_EN 1u /* Include code for OSTimeDlyHMSM() */
8 K* Y8 y0 Z& { - #define OS_CFG_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume() */
0 p7 n8 n! { b/ W8 z- ^ -
; N' T; R& ~/ r% ]/ W# V -
0 c! i( M( o: a$ {; ~ - /* ------------------------- TIMER MANAGEMENT -------------------------- */$ N S" H" L+ I1 h' \5 f6 R
- #define OS_CFG_TMR_EN 1u /* Enable (1) or Disable (0) code generation for TIMERS */% K5 |4 z; B7 N8 Q. O% R
- #define OS_CFG_TMR_DEL_EN 1u /* Enable (1) or Disable (0) code generation for OSTmrDel() */+ ?0 s- o0 `& {; u# }5 P+ t: S7 u
-
" c4 N% h+ E2 w4 [% i; Z% u( R* L0 e - #endif
复制代码 这个配置文件比较的重要,主要用于μCOS-III源码中相关函数的配置。
( ^7 Y) w! Q% e) y( X. J |
11.7 临界段2 `" f# D8 I' g6 e: f1 D
. i2 B; |& k# ]3 H
11.7.1 临界段基本概念
8 W+ R' J3 {3 M6 @3 `
11.3.2 初始化函数OSInit()
/ x! d6 E$ {. @4 q6 E+ u
11.9.2 中断级任务切换OSIntExit()
11.9.3 函数使用举例
11.1.3 os_cfg_app.h配置文件
11.1.5 cpu_cfg.h配置文件
" T N8 C) n& D, R
11.4.1 启动
1 o" l5 E# F% Z/ c- G `- b
5. 可接受凤险 (ACCeptable risk)
( T) X! e5 O% B
& w, c( M. i) k! j0 }
11.10.2 调度器解锁OSSchedUnlock
11.10.3 调度器被锁时间测量OS_SchedLockTimeMeas
11.10.4 函数使用举例