特别说明:
! L, r* \7 S z4 A' w, z! A1. 本教程是安富莱电子原创。
( I$ J( ]- J* D5 U+ B a7 x4 L2. 安富莱STM32F407开发板资料已经全部开源,开源地址:地址链接: r& a! M0 w& o& }
3. 当前共配套300多个实例,4套用户手册。# f5 V( ]5 r3 [5 K* i6 ]! l
第11章 μCOS-III内核函数分析
8 q% x5 N+ O: I \" Z$ O 本期教程开始分析μ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 总结
! o, C- ]" e" O# K9 S( w( ^6 P11.1 系统配置文件 下面先简单说明下μCOS-III中几个配置文件的作用,方便分析源码的时候查看,配置文件主要有以下几个:
9 O. p! \5 C7 I11.1.1 lib_cfg.h配置文件 lib_cfg.h文件内容如下: - /*
. _: H" B% K: @/ h; h( X9 S1 H - *********************************************************************************************************
6 A9 O) h2 U$ ? - * MODULE# m( z. _! o. _0 B+ u! \0 a
- ********************************************************************************************************** |) G7 { g. U$ m, g: ~
- */
% A: Q( V1 W4 ~( m5 _ - 4 v! _) O. W* L9 |% U+ g
- #ifndef LIB_CFG_MODULE_PRESENT$ j: D, V9 l9 B5 v+ v( w. u
- #define LIB_CFG_MODULE_PRESENT
1 `3 ?+ K( Q; A7 N - ( t F+ m/ D1 t" v
- /*
( u* e A( d& G9 P - *********************************************************************************************************$ {. V" u/ Q1 n. f# ~4 q
- * uC/LIB CONFIGURATION! x8 g" z7 c6 x3 V. Q3 }8 t
- *********************************************************************************************************
' W, K, u- S. D5 \8 m; ?7 y) j9 C - */$ f* e% |' K- p9 O) U
-
+ a3 P. f7 C' Z5 _0 t - #define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_ENABLED
/ Z) p) |' G0 S( J* F - /* DEF_DISABLED Argument check DISABLED */
" [2 C( r8 u7 |0 s - /* DEF_ENABLED Argument check ENABLED */) l( A" j* T8 i1 U
- ( O% X( v# S4 m
- #define LIB_MEM_CFG_OPTIMIZE_ASM_EN DEF_ENABLED
4 P3 d" h$ [/ X6 ~5 F - /* DEF_DISABLED Assembly-optimized function(s) DISABLED */! c5 S2 y* o, H L z2 `1 L
- /* DEF_ENABLED Assembly-optimized function(s) ENABLED */
1 S4 T* `$ M+ I8 W - 0 ^$ [+ {' O) k# s
- #define LIB_MEM_CFG_ALLOC_EN DEF_ENABLED
3 T4 U6 B5 i% X# N. Y4 d - /* DEF_DISABLED Memory allocation DISABLED */) ]+ u7 U/ b2 h# X" u4 |
- /* DEF_ENABLED Memory allocation ENABLED */
0 {$ s; W2 W3 J9 X4 f -
& M3 V0 C& G. u5 A - #define LIB_MEM_CFG_HEAP_SIZE 23u * 1024u /* Configure Heap Memory Size */
2 \ m; E% |5 x( J* S' B -
4 G3 `! Y B+ L3 f1 g. u [: [ - /*
; z! t9 J/ n' ?$ _% V' z - *********************************************************************************************************
# l' N* o: s, ^' U$ j# Z$ C - * MODULE END4 e, C6 M( u; O0 i5 C$ S
- *********************************************************************************************************
7 B1 S* |+ }2 t. K$ l9 Z( G - */
* r2 j. M* S1 J3 u% R' i - " A% w* r9 \9 Y1 t& A) R
- #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_H7 m- [. Z* ?: t; J+ u# ~
- #define OS_CFG_H
E( b8 f9 g: h. R4 U" w1 x. v -
3 n4 b. [! ?4 Z. @' ? -
8 K3 b* o0 N8 x - /* ---------------------------- MISCELLANEOUS -------------------------- */
1 U( v3 U' d, e1 U5 } - #define OS_CFG_APP_HOOKS_EN 1u /* Enable (1) or Disable (0) application specific hooks */
; G' O) _4 X4 x; F - #define OS_CFG_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking */1 F7 m5 g/ `0 b! j, Y) u
- #define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u /* Enable (1) or Disable (0) check for called from ISR */) G l1 B) |, D+ d
- #define OS_CFG_DBG_EN 1u /* Enable (1) debug code/variables */7 |' i7 H$ @, z! ?" j
- #define OS_CFG_ISR_POST_DEFERRED_EN 0u /* Enable (1) or Disable (0) Deferred ISR posts */7 O P( C1 M& ]& r" F
- #define OS_CFG_OBJ_TYPE_CHK_EN 1u /* Enable (1) or Disable (0) object type checking */
2 H _" \# T) |6 n& d! t1 ]- B - #define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping */2 y( h7 K3 E( [
-
" Z' L0 r# ?" o, S0 f' L - #define OS_CFG_PEND_MULTI_EN 1u /* Enable (1) or Disable (0) code generation for multi-pend feature */, e* _5 \: V! a) z! t0 s4 {8 q
- % X6 U7 j+ U+ A6 [( B3 ]
- #define OS_CFG_PRIO_MAX 64u /* Defines the maximum number of task priorities (see OS_PRIO data type) */: ^8 v9 h" Q8 b- r+ |0 {
- 9 n9 |! H( ^- c0 K' |& T
- #define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 0u /* Include code to measure scheduler lock time */
) q9 }, f; a2 Z2 u( R6 G - #define OS_CFG_SCHED_ROUND_ROBIN_EN 0u /* Include code for Round-Robin scheduling */
, p2 `9 ^) H8 D K9 n) G - #define OS_CFG_STK_SIZE_MIN 64u /* Minimum allowable task stack size */
+ u" w0 A5 v2 R) @; i% h( f3 \2 w -
7 S! y8 t5 W( ]5 n, C -
" u7 n+ z% a$ A5 T" K! d - /* ----------------------------- EVENT FLAGS --------------------------- */
+ ]1 S6 H, f3 v8 ] - #define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */
. [. ^( j4 L$ y$ T1 \ - #define OS_CFG_FLAG_DEL_EN 1u /* Include code for OSFlagDel() */( ]# Y z+ H5 ~; W P1 t
- #define OS_CFG_FLAG_MODE_CLR_EN 1u /* Include code for Wait on Clear EVENT FLAGS */( z2 L( V+ x8 Q0 d- U# n' n
- #define OS_CFG_FLAG_PEND_ABORT_EN 1u /* Include code for OSFlagPendAbort() */
- }7 L& T* Y, J8 e# u/ y3 J - / r: P7 m6 O6 K. A) a6 T) k& \
-
: g' ^$ G4 b% z9 a( g - /* -------------------------- MEMORY MANAGEMENT ------------------------ */' X% }( |" X |3 q* ~, ?; @
- #define OS_CFG_MEM_EN 1u /* Enable (1) or Disable (0) code generation for MEMORY MANAGER */
, c. h! v+ F6 C6 v - 4 J: g9 t8 F' x% q- V, n( ]) F
-
; U. k6 P' R1 y0 a - /* --------------------- MUTUAL EXCLUSION SEMAPHORES ------------------- */- O7 f h( ^- R. i# [: o
- #define OS_CFG_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX */5 X# _1 j4 ]2 n, E) Z( l: p3 T
- #define OS_CFG_MUTEX_DEL_EN 1u /* Include code for OSMutexDel() */
* V1 ?: w# u9 a/ O; {# l. l - #define OS_CFG_MUTEX_PEND_ABORT_EN 1u /* Include code for OSMutexPendAbort() */
/ v: n# o- V4 z$ R" x1 E' r5 O5 d -
3 s8 s1 a. M7 ~5 S% Y -
. J# i3 P9 R! |7 c K- J5 R - /* --------------------------- MESSAGE QUEUES -------------------------- *// E' a0 X6 J( b2 W0 R
- #define OS_CFG_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES */& r& `6 j* Q0 Z
- #define OS_CFG_Q_DEL_EN 1u /* Include code for OSQDel() */
+ ^! I/ o, v# A" G$ V- A# k+ d; N - #define OS_CFG_Q_FLUSH_EN 1u /* Include code for OSQFlush() */
* N' u$ p- Q' U - #define OS_CFG_Q_PEND_ABORT_EN 1u /* Include code for OSQPendAbort() */
3 y( N' p, C# p" p4 |9 @ - 8 H0 c, @9 T! [" c; ]5 T2 d# o8 E
-
1 ?5 L* z1 d/ }( I+ R8 o% S - /* ----------------------------- SEMAPHORES ---------------------------- */1 K1 i0 z& Z$ z. T& r
- #define OS_CFG_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES */
( v- G" U( M- A; Z3 f - #define OS_CFG_SEM_DEL_EN 1u /* Include code for OSSemDel() */
, Q# t- V- d4 Q$ B - #define OS_CFG_SEM_PEND_ABORT_EN 1u /* Include code for OSSemPendAbort() */2 O+ ?6 X# O' X2 a9 m0 d
- #define OS_CFG_SEM_SET_EN 1u /* Include code for OSSemSet() */2 F" i8 g, d8 T0 u0 \, q
-
5 r- _: |9 V9 J0 v) k: E3 F3 W - 6 s5 q7 }8 i) N9 X" w, k. f* [
- /* -------------------------- TASK MANAGEMENT -------------------------- */
/ ^- Z; r: ]" T H) G - #define OS_CFG_STAT_TASK_EN 1u /* Enable (1) or Disable(0) the statistics task */
# }- s( f5 {5 Q. ]9 _' {9 B' y# K - #define OS_CFG_STAT_TASK_STK_CHK_EN 1u /* Check task stacks from statistic task */" H& d% b2 ], e6 k) t
- % ]3 w5 ?. w' H- v0 J4 N
- #define OS_CFG_TASK_CHANGE_PRIO_EN 1u /* Include code for OSTaskChangePrio() */; V Z, f0 o( z8 p% W
- #define OS_CFG_TASK_DEL_EN 1u /* Include code for OSTaskDel() */
Z+ t/ [) L5 b$ J - #define OS_CFG_TASK_Q_EN 1u /* Include code for OSTaskQXXXX() */
/ g1 R8 ]. D6 Q; Z - #define OS_CFG_TASK_Q_PEND_ABORT_EN 1u /* Include code for OSTaskQPendAbort() */7 F1 d" I E. V
- #define OS_CFG_TASK_PROFILE_EN 1u /* Include variables in OS_TCB for profiling */) s: n9 w8 Z, v: W
- #define OS_CFG_TASK_REG_TBL_SIZE 1u /* Number of task specific registers */" A* Z" p' {" }: {) l
- #define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u /* Include code for OSTaskSemPendAbort() */
. g; E% i+ {) V& v! _ - #define OS_CFG_TASK_SUSPEND_EN 1u /* Include code for OSTaskSuspend() and OSTaskResume() */7 M$ m. @# T' C% S" g7 \
- 4 c7 t- F) {6 g
- 2 ]/ |8 o3 d2 r5 L3 @$ R4 h) j
- /* -------------------------- TIME MANAGEMENT -------------------------- */9 Y4 H; e0 B& c) v# q
- #define OS_CFG_TIME_DLY_HMSM_EN 1u /* Include code for OSTimeDlyHMSM() */
# E0 g$ L. Z& {% D1 d/ i - #define OS_CFG_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume() */! ]: j1 ?4 U$ F0 r3 O/ O u
-
1 S: D+ @, |& q* s. X -
! v4 Z/ O# L" } - /* ------------------------- TIMER MANAGEMENT -------------------------- */
. c! J$ j+ U# j8 z/ I, @* c+ ~7 P - #define OS_CFG_TMR_EN 1u /* Enable (1) or Disable (0) code generation for TIMERS */
% ^; X! y. g! x3 J- j, s( O3 V - #define OS_CFG_TMR_DEL_EN 1u /* Enable (1) or Disable (0) code generation for OSTmrDel() */
2 L" J, i+ f. F; D, A6 E -
+ }: }4 O& y/ f0 p* W( _7 b; a2 _ - #endif
复制代码 这个配置文件比较的重要,主要用于μCOS-III源码中相关函数的配置。 3 f' n2 w$ u! }: I
|
" C& c: Q& |0 ^4 S8 H, k
11.7 临界段* N, N$ R: j C1 a
11.7.1 临界段基本概念
! r+ D! Y% p/ A5 b* P5 f/ y
9 h5 c h v9 O$ g3 R& K
6 a) s' W1 ~. S! o8 D9 A# y; r' ]
" N M, F# }+ A; X4 V) ^. H* f, r
11.3.2 初始化函数OSInit()
( E7 {2 R. q* @: i' O6 Q8 w, [
11.9.2 中断级任务切换OSIntExit()
11.9.3 函数使用举例
11.1.3 os_cfg_app.h配置文件
11.1.5 cpu_cfg.h配置文件
( U1 A6 v, h, Z I d5 O4 h
11.4.1 启动
5. 可接受凤险 (ACCeptable risk)
" T7 K ?+ K# U X g. K3 }+ b$ f
. [2 `! M8 c5 Z2 l# T
11.10.2 调度器解锁OSSchedUnlock
11.10.3 调度器被锁时间测量OS_SchedLockTimeMeas
11.10.4 函数使用举例
0 j" j# |$ g3 H, w' y