特别说明:
: ~+ ~( L( h8 Q5 f: i3 L3 K1. 本教程是安富莱电子原创。" F7 w* z# J5 e) h: c5 Y
2. 安富莱STM32F407开发板资料已经全部开源,开源地址:地址链接1 \- ~: w4 C3 B# ^" d( ?; V1 ^6 G% U
3. 当前共配套300多个实例,4套用户手册。. J- W* P7 _( [0 G- o
第11章 μCOS-III内核函数分析 R6 ?; i N% y! ^
本期教程开始分析μ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 总结 & T8 r- U8 B: S
11.1 系统配置文件 下面先简单说明下μCOS-III中几个配置文件的作用,方便分析源码的时候查看,配置文件主要有以下几个:
4 o& {& m" _' I# M, ~- j11.1.1 lib_cfg.h配置文件 lib_cfg.h文件内容如下: - /*/ i- H; _6 z* T2 g3 O
- *********************************************************************************************************+ P. Q. w' s' D, ~5 L" J' Z
- * MODULE
8 y; t( B* v0 r1 N$ J - *********************************************************************************************************" _8 u% g2 T! C _ J
- */
" \0 ^; t0 f# V, h, w" G - ; J/ x' W# T6 t6 `. L
- #ifndef LIB_CFG_MODULE_PRESENT
; g- {+ W# e" T - #define LIB_CFG_MODULE_PRESENT
8 N8 X4 ?- p6 o% d& ]# k3 P9 s3 _! V' e - 5 m# w# s) M6 J' @! D0 e
- /*5 `! e; ^) [2 e
- *********************************************************************************************************0 }2 U, J9 x0 ^ R8 \8 G0 b2 ~
- * uC/LIB CONFIGURATION
4 |8 \) G7 h* l9 V7 S& f* b2 ? - *********************************************************************************************************2 b5 S1 B$ m5 h. b1 v9 t9 {' a
- */( O; {) L0 S& S
- . Z4 k0 w* v7 S7 I0 q" o
- #define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_ENABLED% |5 B0 n; ]) [$ N# X7 t. i
- /* DEF_DISABLED Argument check DISABLED */; }. y1 V" L; e$ ?
- /* DEF_ENABLED Argument check ENABLED */0 O g! H4 b% g8 q
-
* w8 @8 O, v0 Y; V - #define LIB_MEM_CFG_OPTIMIZE_ASM_EN DEF_ENABLED# F, w% p4 C$ c+ Q* M& w
- /* DEF_DISABLED Assembly-optimized function(s) DISABLED */& n! b* C2 B) k* Y; _& Z
- /* DEF_ENABLED Assembly-optimized function(s) ENABLED */
! r8 b( d! M" Z' z5 E* @0 j7 ? k - $ I5 ]0 C2 F' j1 J5 Z& l& V4 H
- #define LIB_MEM_CFG_ALLOC_EN DEF_ENABLED
3 [. D% x% s, j& ~' O) T - /* DEF_DISABLED Memory allocation DISABLED */. F# ^5 T _% c* d; ^
- /* DEF_ENABLED Memory allocation ENABLED */
: n G' k6 r! S& J -
U& @8 r$ X, a) Z9 ]) Z - #define LIB_MEM_CFG_HEAP_SIZE 23u * 1024u /* Configure Heap Memory Size */
4 M9 U; {9 L0 j; u - ) W T; g( V# y+ l1 Q
- /*
8 Y7 g- w: I! ` - *********************************************************************************************************: n, p7 Y& V- g! k3 E3 b
- * MODULE END- O3 d: H3 q1 @+ t) G
- *********************************************************************************************************
- o% R! m+ h8 E; O# S) ~ - */7 E; B7 r- Y9 L8 d2 F" I
- # T% o! n/ j. l- L+ i6 D
- #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_H5 a$ @4 O/ ~) a' f: j1 T; L9 [
- #define OS_CFG_H
/ j+ \# `: x6 G) N$ B6 {& E -
% h( k5 n+ P9 Y* E4 ~$ s7 r -
/ a: V) [& J" d. ^' S/ J# N - /* ---------------------------- MISCELLANEOUS -------------------------- */9 L: i! ~5 l e8 F+ N# x
- #define OS_CFG_APP_HOOKS_EN 1u /* Enable (1) or Disable (0) application specific hooks */
) @( q9 C- A0 K - #define OS_CFG_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking */$ ?3 \) H: W& A7 ]; [
- #define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u /* Enable (1) or Disable (0) check for called from ISR */
* O1 p! Q' ^7 F# Q% V" X% X - #define OS_CFG_DBG_EN 1u /* Enable (1) debug code/variables */
( C) \. c1 L5 b - #define OS_CFG_ISR_POST_DEFERRED_EN 0u /* Enable (1) or Disable (0) Deferred ISR posts */9 d3 L7 z3 ?) W( W4 c
- #define OS_CFG_OBJ_TYPE_CHK_EN 1u /* Enable (1) or Disable (0) object type checking */
/ E: P# v8 E% _9 f! K - #define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping */$ w) f% j: @% p Z) m. J
- . ?5 ~' Y; r8 x7 B+ t1 B$ W
- #define OS_CFG_PEND_MULTI_EN 1u /* Enable (1) or Disable (0) code generation for multi-pend feature */
: ?. B1 D4 ]4 x# h& ~ - 4 S" k; @1 G/ {6 W1 y
- #define OS_CFG_PRIO_MAX 64u /* Defines the maximum number of task priorities (see OS_PRIO data type) */; o, u4 L2 s2 u+ P' N2 W1 T; }' q
-
; i6 t$ J% L: S9 |9 r5 P- r - #define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 0u /* Include code to measure scheduler lock time */ D- V5 K/ y8 ?4 K6 q
- #define OS_CFG_SCHED_ROUND_ROBIN_EN 0u /* Include code for Round-Robin scheduling */- D& V$ X4 D+ X- M
- #define OS_CFG_STK_SIZE_MIN 64u /* Minimum allowable task stack size */
+ X( U' M/ H% B. S$ E/ X! w -
; e7 I* B. U m& h S$ z - 7 m! c1 k7 w9 o9 P9 q8 \
- /* ----------------------------- EVENT FLAGS --------------------------- */
# d; w: a8 w+ L - #define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */( x- ^3 q% v( L
- #define OS_CFG_FLAG_DEL_EN 1u /* Include code for OSFlagDel() */
3 t* v$ E/ ~7 A) U6 b' ~! ^ - #define OS_CFG_FLAG_MODE_CLR_EN 1u /* Include code for Wait on Clear EVENT FLAGS */
1 N W9 j) a4 H% t( S - #define OS_CFG_FLAG_PEND_ABORT_EN 1u /* Include code for OSFlagPendAbort() */2 a1 ^# a4 }! e) T9 [
- $ F# i8 D$ c2 @5 r* |1 H
- ( g8 |; a* V5 ^5 j; v# z# v. @
- /* -------------------------- MEMORY MANAGEMENT ------------------------ */7 y6 o# ^, \ H* W9 ^* H4 p
- #define OS_CFG_MEM_EN 1u /* Enable (1) or Disable (0) code generation for MEMORY MANAGER */
1 @9 ]- G3 k( ^: w7 H3 f" N" p -
8 I6 B+ w8 S& {2 }+ o2 M -
4 w! U6 W" X" I# H) J& @3 N6 } - /* --------------------- MUTUAL EXCLUSION SEMAPHORES ------------------- */( D5 K- e3 K2 n+ k. t! r
- #define OS_CFG_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX */1 ~: G* i6 a/ n/ @. V8 V2 Z; k
- #define OS_CFG_MUTEX_DEL_EN 1u /* Include code for OSMutexDel() */
& w' G* W" K) `2 h) R( U - #define OS_CFG_MUTEX_PEND_ABORT_EN 1u /* Include code for OSMutexPendAbort() */
8 |7 [% G3 }7 A- h$ C -
- w0 ~7 M! R/ m( E! y1 z - $ f0 I9 Y: T" l; }6 E. l& |
- /* --------------------------- MESSAGE QUEUES -------------------------- */
* i$ d6 ]( y2 j - #define OS_CFG_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES */
" ?. V4 {- l+ Q4 p* q7 W - #define OS_CFG_Q_DEL_EN 1u /* Include code for OSQDel() */ Y, m+ q" R2 p$ J! U7 T! H# w
- #define OS_CFG_Q_FLUSH_EN 1u /* Include code for OSQFlush() */+ Y2 O& b: j/ M
- #define OS_CFG_Q_PEND_ABORT_EN 1u /* Include code for OSQPendAbort() */+ J4 a/ b' p! }% M# l4 a, [
- 2 [" p0 e. R0 p: E" S6 i) K/ M
-
5 c% R$ j9 P7 n" o1 @$ V! |* Q# t - /* ----------------------------- SEMAPHORES ---------------------------- */
; L7 N" m9 ~0 M3 Q% t- H - #define OS_CFG_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES */
/ ?! T9 ^/ ?; _" P0 P1 f3 w6 K - #define OS_CFG_SEM_DEL_EN 1u /* Include code for OSSemDel() */6 `& b0 J: ~7 x' b
- #define OS_CFG_SEM_PEND_ABORT_EN 1u /* Include code for OSSemPendAbort() */, O! k' k2 |& V
- #define OS_CFG_SEM_SET_EN 1u /* Include code for OSSemSet() */
: j$ a) @, g- [- r7 u2 O! J - 2 Q7 H% o0 C4 C8 E% o* J. F1 _
- : H: o( @ t+ i4 }( r4 l
- /* -------------------------- TASK MANAGEMENT -------------------------- */5 D4 P* G Y- d! J
- #define OS_CFG_STAT_TASK_EN 1u /* Enable (1) or Disable(0) the statistics task */# J' k h' \% L! b0 K1 X7 {9 F# z7 m
- #define OS_CFG_STAT_TASK_STK_CHK_EN 1u /* Check task stacks from statistic task */
% o! D& ~ z$ i. z9 y - " ^3 V/ I- v9 H9 n3 d( ^
- #define OS_CFG_TASK_CHANGE_PRIO_EN 1u /* Include code for OSTaskChangePrio() *// g! S1 @4 k9 j3 m
- #define OS_CFG_TASK_DEL_EN 1u /* Include code for OSTaskDel() */: l* t; h& L' n# O2 s1 P
- #define OS_CFG_TASK_Q_EN 1u /* Include code for OSTaskQXXXX() */
% o( M$ H9 `0 s- g - #define OS_CFG_TASK_Q_PEND_ABORT_EN 1u /* Include code for OSTaskQPendAbort() */& F, x9 E7 H7 E6 i; r
- #define OS_CFG_TASK_PROFILE_EN 1u /* Include variables in OS_TCB for profiling */
2 ]. w7 O# a' ? - #define OS_CFG_TASK_REG_TBL_SIZE 1u /* Number of task specific registers */
* L- k3 A `% W - #define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u /* Include code for OSTaskSemPendAbort() */
7 J* o9 W R9 _9 Q; a - #define OS_CFG_TASK_SUSPEND_EN 1u /* Include code for OSTaskSuspend() and OSTaskResume() */2 J# V5 B1 o; w3 E' w
- 7 C7 n& ~: Y7 j0 W3 U1 A* [4 A
-
& l/ m2 |: y o9 B - /* -------------------------- TIME MANAGEMENT -------------------------- */4 f. P3 Z4 v+ v( i
- #define OS_CFG_TIME_DLY_HMSM_EN 1u /* Include code for OSTimeDlyHMSM() */5 ]6 r5 Y( H# Q6 E6 T: z1 m, }
- #define OS_CFG_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume() */ J* H2 k# e! ~# w
- # N E* Q/ D& O5 U- Y7 a
- # H4 ~9 o, ]2 s; ^- q
- /* ------------------------- TIMER MANAGEMENT -------------------------- */
+ s3 z0 h' z6 E/ g5 j% n/ X$ ^ - #define OS_CFG_TMR_EN 1u /* Enable (1) or Disable (0) code generation for TIMERS */7 w: f8 f" e, S1 L
- #define OS_CFG_TMR_DEL_EN 1u /* Enable (1) or Disable (0) code generation for OSTmrDel() */
8 t/ | [9 h a' Y$ p -
# L) I/ D- H/ z- w - #endif
复制代码 这个配置文件比较的重要,主要用于μCOS-III源码中相关函数的配置。 ) }' s. N% y$ Z. {; b7 R
|
) R r+ B# E3 R* Z; J! S9 V1 m
11.7 临界段 n" R- F2 b' F+ } o" H
/ u( J) T. Z; x; @% ~9 x, K
11.7.1 临界段基本概念
+ i6 {" R9 A+ l
5 Y/ O/ [1 _' l
7 q8 K5 G' G; x" A5 P$ S K/ A. M4 V
11.3.2 初始化函数OSInit()
& A/ o o$ O$ K8 E9 ~
11.9.2 中断级任务切换OSIntExit()
11.9.3 函数使用举例
11.1.3 os_cfg_app.h配置文件
11.1.5 cpu_cfg.h配置文件
2 K' e0 \9 }2 x ?. {* k Y! E
11.4.1 启动
; m+ W* S$ Q+ X2 m: ?4 F
5. 可接受凤险 (ACCeptable risk)
' e4 d; ^% S" J a% d- z" u( y# p
11.10.2 调度器解锁OSSchedUnlock
11.10.3 调度器被锁时间测量OS_SchedLockTimeMeas
11.10.4 函数使用举例
9 L2 ? X1 f0 c- ^