本帖最后由 XinLiYF 于 2018-4-22 22:00 编辑
: v) `5 N0 z2 z/ {- R* g
$ K4 l1 Y9 x' ]( Q功能概述
1 |# Y5 Z2 Y$ f% _2 {4 r# }, Z0 | f0 L+ w/ H4 Q' Q
CMSIS-RTOS v2 提供了多种 API 接口:
- E. p; Y( p6 m& {7 h- CMSIS-RTOS2 是支持动态对象创建和 Armv8-M(Arm Cortex-M23 和 Cortex-M33)的新 C 函数 API 。
- CMSIS-RTOS C API v1 是与 CMSIS-RTOS v1 向后兼容的 C 函数 API 。
- CMSIS-RTOS C++ API 是一个 C++ 类函数 API 。
+ K" B$ _# Y- d' q1 y% z % v5 I6 Q0 `7 u
可以在同一应用程序中混合使用不同的 API 版本,甚至可以在同一个 C/C++ 源码模块中混用不同的 API 版本。 但是,在未来版本的 CMSIS-RTOS 中,C API v1 的功能可能会被弃用。
( N; Q% k/ k4 \: p0 iCMSIS-RTOS28 }0 ~2 \) i8 l' h/ H6 B* I% H
在 cmsis_os2.h 头文件中实现的所有 CMSIS-RTOS C API v2 函数的概述。 1 q' I! e" E# B$ T
通用设计概念6 \. V" W% q; H( g& [/ v
所有的 RTOS 对象都有一个共同的设计概念。对象的整个生命周期可以概括为创建 -> 使用 -> 销毁。 / P2 ]. k( N' q' j
创建对象
' t- |" x) \. |( M9 `
通过调用它的 osXxxNew 函数创建一个对象。新函数返回一个可用于与新对象一起操作的标识符。一个对象的实际状态通常存储在一个对象特定的控制块中。控制块的内存布局(和所需的大小)是特定于实现的。人们不应该对控制块做任何具体的假设。控制块布局可能会发生变化,因此应视为实现内部的细节。 2 o+ Z8 \/ l3 q% U
为了公开有关对象特定选项的控制,所有 osXxxNew 函数都提供了一个可选的 attr 参数,默认情况下它可以保留为 NULL 。它需要一个指向特定于对象的属性结构的指针,通常包含这些字段
C1 A. q4 M! d; `0 M! z' `1 `, |
- name 为了标识附加可读的名称,
- attr_bits 控制对象特定的选项,
- cb_mem 手动为控制块提供内存
- cb_size 量化为控制块提供的内存大小。# z; ~- y2 v! n/ H& F, g
, Z- V# ]1 O- r R
name 属性仅用于对象识别,例如,使用 RTOS 感知调试。附加的字符串不用于内部任何其他的作用。
2 `3 E5 H" ?5 Q& [" @; h
可以使用 cb_mem 和 cb_size 属性手动为控制块提供内存,而不是依赖实现内部的内存分配。必须确保 cb_mem 指向的内存量足够用于对象控制块的结构。如果以 cb_size 给出的大小不足,则 osXxxNew 函数返回一个错误,即返回 NULL 。此外手动提供控制块存储器的便携性较差。因此,例如,人们必须关注实现特定的对齐和放置要求。有关详细信息,请参阅内存管理。 7 x" ]) p4 U) {( I
对象使用 : }9 ?9 B3 _9 m4 q) s! c
对象创建成功后,可以使用该对象直到它被销毁。为对象定义的动作取决于其类型。通常,所有 osXxxDoSomething 访问函数都需要引用该对象作为第一个 xxx_id 参数。
5 }0 T# h2 u' M+ a: [: E) e
访问函数可以假定对 id 参数进行某种理智检查。这样就可以确保不会意外地用 NULL 对象引用调用访问函数。此外,验证具体对象类型,即不能通过引用另一对象类型来调用一个对象类型的访问函数。
% r6 R, C; }! j$ _; G2 i
应用的所有其他参数检查都是对象和操作特定的,或者甚至可能是特定于实现的。因此,应该总是检查 osErrorParameter 的动作函数返回值,以确认提供的参数被接受。
; e7 a' [6 b$ ^
根据经验,中断服务程序(Interrupt Service Routines,ISR)只能使用非阻塞访问功能。这包含 osXxxWait 函数(以及类似的),仅限于在参数timeout 设置为 0 的情况下调用,即使用 try-semantics 。
7 r9 h! r0 R S/ G. r/ E: D8 u
对象销毁 1 x9 `5 z- P& y& B$ ]+ z
不再需要的对象可以根据需要销毁以释放控制块内存。对象不会隐式地被破坏。因此可以假定一个对象 id 是有效的,直到 osXxxDelete 被显式调用。删除功能最终释放控制块内存。如果用户提供了控制块存储器,请参见上文,存储器也必须手动释放。
9 Z+ c; X4 ^# C9 d A
唯一需要注意的例外是没有显式 osThreadDelete 函数的线程。线程可以是分离的或可连接的。分离线程在终止时自动销毁,即调用 osThreadTerminate 或 osThreadExit 或从线程函数返回。另一方面,可连接线程保持活动状态,直到明确调用 osThreadJoin 。
4 {- @- i( b. p }/ m0 B 函数参考& a) j6 M0 A' V: M# P1 Z$ O6 ^
: B6 a1 k" ^; M, f0 ?- 内核信息和控制" p) w- o) B- ?+ R+ V9 @% M
- osKernelGetInfo : 获取 RTOS 内核信息。
- osKernelGetState : 获取当前 RTOS 内核状态。
- osKernelGetSysTimerCount : 获取 RTOS 内核的系统计时器的计数。
- osKernelGetSysTimerFreq : 获取 RTOS 内核的系统定时器的频率。
- osKernelInitialize : 初始化 RTOS 内核。
- osKernelLock : 锁定 RTOS 内核调度程序。
- osKernelUnlock : 解锁 RTOS 内核调度程序。
- osKernelRestoreLock : 恢复 RTOS 内核调度程序的锁定状态。
- osKernelResume : 恢复 RTOS 内核调度程序。
- osKernelStart : 启动 RTOS 内核调度程序。
- osKernelSuspend : 挂起 RTOS 内核调度程序。
- osKernelGetTickCount : 获取 RTOS 内核计数。
- osKernelGetTickFreq : 获取 RTOS 内核滴答频率。
' S) W" Z/ I# Y
# U; k$ w/ j1 z$ i% B
- 线程管理/ Y; R- {2 K8 Y+ U6 r5 g) e2 C. b
- osThreadDetach : 分离一个线程(当线程终止时线程存储可以被回收)。
- osThreadEnumerate : 枚举活动线程。
- osThreadExit : 终止当前正在运行的线程。
- osThreadGetCount : 获取活动线程的数量。
- osThreadGetId : 返回当前正在运行的线程的线程 ID 。
- osThreadGetName : 获取线程的名称。
- osThreadGetPriority : 获取线程的当前优先级。
- osThreadGetStackSize : 获取线程的堆栈大小。
- osThreadGetStackSpace : 在执行期间基于堆栈水印记录获取线程的可用堆栈空间。
- osThreadGetState : 获取线程的当前线程状态。
- osThreadJoin : 等待指定的线程终止。
- osThreadNew : 创建一个线程并将其添加到活动线程。
- osThreadResume : 恢复线程的执行。
- osThreadSetPriority : 更改线程的优先级。
- osThreadSuspend : 暂停执行一个线程。
- osThreadTerminate : 终止线程的执行。
- osThreadYield : 将控制权交给状态为 READY 的下一个线程。* ~1 H5 @4 m) I% t1 Y7 a H2 ^
L9 u+ Z3 L3 f! [& {
- 线程标志
$ C0 O0 ?/ @- t& \0 C6 Q- osThreadFlagsSet : 设置线程指定的线程标志。
- osThreadFlagsClear : 清除当前运行线程指定的线程标志。
- osThreadFlagsGet : 获取当前正在运行的线程的当前线程标志。
- osThreadFlagsWait : 等待当前正在运行的线程的一个或多个线程标志发出信号。. H6 T' {8 `( \/ C
- 事件标志
* r) w7 R( n( l$ D& z4 V5 g+ R- osEventFlagsGetName : 获取事件标志对象的名称。
- osEventFlagsNew : 创建并初始化事件标志对象。
- osEventFlagsDelete : 删除事件标志对象。
- osEventFlagsSet : 设置指定的事件标志。
- osEventFlagsClear : 清除指定的事件标志。
- osEventFlagsGet : 获取当前的事件标志。
- osEventFlagsWait : 等待一个或多个事件标志发出信号。
# r# E# a5 Y3 \/ p ) z% m9 b' ^1 v x8 L
- 通用等待函数' G/ E7 H2 j ]: f/ `% Z5 b
- osDelay : 等待超时(时间延迟)。
- osDelayUntil : 等到指定的时间。6 M5 {; I1 |* R! Z! z9 n
- 定时器管理
& `8 J: E" q; M' s- osTimerDelete : 删除一个定时器。
- osTimerGetName : 获取定时器的名称。
- osTimerIsRunning : 检查定时器是否正在运行。
- osTimerNew : 创建并初始化一个定时器。
- osTimerStart : 启动或重新启动定时器。
- osTimerStop : 停止一个定时器。
1 G6 p: l0 t' o0 V1 x- w; G
- 互斥管理& F% e* Z1 Z" J/ _6 V& j
- osMutexAcquire : 如果它被锁定,则获取互斥锁或超时值。
- osMutexDelete : 删除互斥对象。
- osMutexGetName : 获取互斥对象的名称。
- osMutexGetOwner : 获取拥有互斥对象的线程。
- osMutexNew : 创建并初始化一个互斥对象。
- osMutexRelease : 释放由 osMutexAcquire 获取的互斥锁。% z2 o! X, l& c
7 Y# Y; I& `* ^' \/ I" N
- 信号量
O1 b7 q2 Y7 e0 P7 A4 F) L7 v- osSemaphoreAcquire : 如果没有令牌可用,请获取信号量令牌或超时。
- osSemaphoreDelete : 删除一个信号量对象。
- osSemaphoreGetCount : 获取当前的信号量令牌计数。
- osSemaphoreGetName : 获取信号量对象的名称。
- osSemaphoreNew : 创建并初始化信号量对象。
- osSemaphoreRelease : 释放一个信号量令牌直到最初的最大数量。) d9 z Q0 Y# m* A
- 内存池* H- z; Q# f3 G, B; U
- osMemoryPoolAlloc : 从内存池中分配内存块。
- osMemoryPoolDelete : 删除一个内存池对象。
- osMemoryPoolFree : 将分配的内存块返还给内存池。
- osMemoryPoolGetBlockSize : 获取内存池中的内存块大小。
- osMemoryPoolGetCapacity : 获取内存池中的最大内存块数。
- osMemoryPoolGetCount : 获取内存池中使用的内存块数量。
- osMemoryPoolGetName : 获取内存池对象的名称。
- osMemoryPoolGetSpace : 获取内存池中可用的内存块数量。
- osMemoryPoolNew : 创建并初始化一个内存池对象。
. G& l* H+ g4 [
( Z( r; J J G3 u) {
- 消息队列8 E1 V/ A2 H2 _5 u4 b3 \
- osMessageQueueDelete : 删除一个消息队列对象。
- osMessageQueueGet : 如果队列为空,则从队列获取消息或超时。
- osMessageQueueGetCapacity : 在消息队列中获取最大数量的消息。
- osMessageQueueGetCount : 获取消息队列中排队的消息数量。
- osMessageQueueGetMsgSize : 获取内存池中的最大消息大小。
- osMessageQueueGetName : 获取消息队列对象的名称。
- osMessageQueueGetSpace : 获取消息队列中消息的可用插槽数量。
- osMessageQueueNew : 创建并初始化消息队列对象。
- osMessageQueuePut : 如果队列已满,请将消息放入队列或超时。
- osMessageQueueReset : 将消息队列重置为初始空状态。+ G8 c0 O! o N4 d) J
- OS Tick API! m* B) ]" n+ |, P4 b- h! `
- OS_Tick_Setup : 建立 OS Tick 。
- OS_Tick_Enable : 启用 OS Tick 。
- OS_Tick_Disable : 禁用 OS Tick 。
- OS_Tick_AcknowledgeIRQ : 确认 OS Tick IRQ 。
- OS_Tick_GetIRQn : 获取 OS Tick IRQ 编号。
- OS_Tick_GetClock : 获取 OS Tick 时钟。
- OS_Tick_GetInterval : 获取 OS Tick 间隔。
- OS_Tick_GetCount : 获取 OS Tick 计数值。
- OS_Tick_GetOverflow : 获取 OS Tick 溢出状态。" A0 I$ b$ V5 G3 H/ i3 `, j
- RTX5 特定的 API' b _" R" _1 U' D7 x/ Z/ d; \
- osRtxErrorNotify : OS 错误回调函数。
- osRtxIdleThread : OS 空闲线程。
) { T2 y4 i! n( n6 } . E& I3 J* V) `7 Y& R5 b
可以从线程和中断服务程序(ISR)调用以下 CMSIS-RTOS2 函数:
$ V( a9 n1 }& r* F' E1 w) N) M
- osKernelGetInfo, osKernelGetState, osKernelGetTickCount, osKernelGetTickFreq, osKernelGetSysTimerCount, osKernelGetSysTimerFreq
- osThreadFlagsSet
- osEventFlagsSet, osEventFlagsClear, osEventFlagsGet, osEventFlagsWait
- osSemaphoreAcquire, osSemaphoreRelease, osSemaphoreGetCount
- osMemoryPoolAlloc, osMemoryPoolFree, osMemoryPoolGetCapacity, osMemoryPoolGetBlockSize, osMemoryPoolGetCount, osMemoryPoolGetSpace
- osMessageQueuePut, osMessageQueueGet, osMessageQueueGetCapacity, osMessageQueueGetMsgSize, osMessageQueueGetCount, osMessageQueueGetSpace2 b7 v/ G0 |8 [. ?9 C) `- Z
( q7 }' X o0 I" ] y$ ~; l' Z2 E% V归档链接:2 v3 C2 b& r; D
CMSIS-RTOS2 文档翻译 之 简介9 U9 z1 s# f! [* ?( y; h
CMSIS-RTOS2 文档翻译 之 修订记录
* M6 J+ {- P8 yCMSIS-RTOS2 文档翻译 之 通用 RTOS 接口- W; q) K1 O/ z4 ]: i7 ~
CMSIS-RTOS2 文档翻译 之 RTOS 验证 |