1. CMSIS-RTOS API
CMSIS-RTOS API是ARM公司为RTOS内核制定的一套通用接口协议,它提供了一套「标准的API接口」,可以移植到各种各样的RTOS上,使得上层的软件、中间件、库以及其他组件在不同的RTOS之上都可以正常工作。
这套API表现为两个文件:cmsis-os.h和cmsis-os.c,也就是说,不同的RTOS内核分别用自己的一套东西去适配.c文件中的接口,而用户只需要调用.h文件中给出的API编写应用。
本文会列举性的给出CMSIS-RTOS有哪些API和宏定义,并给出每类API的使用demo,学习者只需要了解这些东西,能看懂用CMSIS-RTOS API编写的应用程序即可~
在TencentOS-tiny中如下。
- 基于TencentOS-tiny的CMSIS-RTOS API v1.02版本实现:
cmsis_os.h
cmsis_os.c
- 基于TencentOS-tiny的CMSIS-RTOS API v2.1.3版本实现:
cmsis_os2.h
cmsis_os2.c
CMSIS-RTOS API的整体架构如下图:
2. CMSIS-RTOS API列表
下面列出了 CMSIS-RTOS API v1.02 版本提供的所有API。
CMSIS-RTOS 所有API使用的错误码(cmsis-os.h):
typedef enum {
osOK = 0, ///
osEventSignal = 0x08, ///
osEventMessage = 0x10, ///
osEventMail = 0x20, ///
osEventTimeout = 0x40, ///
osErrorParameter = 0x80, ///
osErrorResource = 0x81, ///
osErrorTimeoutResource = 0xC1, ///
osErrorISR = 0x82, ///
osErrorISRRecursive = 0x83, ///
osErrorPriority = 0x84, ///
osErrorNoMemory = 0x85, ///
osErrorValue = 0x86, ///
osErrorOS = 0xFF, ///
os_status_reserved = 0x7FFFFFFF ///
} osStatus;
CMSIS-RTOS API一些可选项控制是否开启(cmsis-os.h):
#define osFeature_MainThread 1 ///#define osFeature_Pool 1 ///#define osFeature_MailQ 1 ///#define osFeature_MessageQ 1 ///#define osFeature_Signals 0 ///#define osFeature_Semaphore 30 ///#define osFeature_Wait 0 ///#define osFeature_SysTick 1 ///
2.1. 内核信息和控制
API | 描述 |
---|---|
osKernelInitialize | 初始化RTOS内核 |
osKernelStart | 启动RTOS内核 |
osKernelRunning | Query if the RTOS kernel is running |
osKernelSysTick (可选) | Get RTOS kernel system timer counter |
osKernelSysTickFrequency (可选) | RTOS kernel system timer frequency in Hz |
osKernelSysTickMicroSec (可选) | Convert microseconds value to RTOS kernel system timer value |
osKernelInitialize
osStatus osKernelInitialize(void);
返回值:status code
osKernelStart
osStatus osKernelStart(void);
返回值:status code
osKernelRunning
int32_t osKernelRunning(void);
返回值:0表示RTOS未启动,1表示RTOS已经启动
osKernelSysTick
uint32_t osKernelSysTick(void);
返回值:RTOS内核系统当前的时间
2.2. 线程管理
❝❞
##
连接符的作用是连接两个字符串,合为一个字符串。
CMSIS-RTOS API 存放线程参数管理的结构体如下:
typedef struct os_thread_def {
char *name; ///
os_pthread pthread; ///
osPriority tpriority; ///uint32_t instances; ///k_stack_t *stackbase; ///uint32_t stacksize; ///k_timeslice_t timeslice; ///k_task_t *task;
} osThreadDef_t;
CMSIS-RTOS API 定义线程的宏如下:
#define osThreadDef(name, priority, instances, stacksz) \
k_task_t task_handler_##name; \
k_stack_t task_stack_##name[(stacksz)]; \
const osThreadDef_t os_thread_def_##name = \
{ #name, (os_pthread)(name), (osPriority)(priority), (instances), \
(&((task_stack_##name)[0])), (stacksz), ((k_timeslice_t)0u), (&(task_handler_##name)) }
❝宏定义中的 instances 表示基于此任务参数,创建出几个任务实例,比如instances为2,则会创建出两个任务。
❞
CMSIS-RTOS API定义的获取线程参数结构体的宏如下:
#define osThread(name) \
&os_thread_def_##name
管理线程参数的API如下:
API | 描述 |
---|---|
osThreadCreate | 创建线程并开始执行 |
osThreadTerminate | 停止线程执行 |
osThreadYield | 线程主动让出 |
osThreadGetID | 获取当前正在运行线程的ID |
osThreadSetPriority | 改变线程优先级 |
osThreadGetPriority | 获取线程优先级 |
osThreadCreate
osThreadId osThreadCreate(const osThreadDef_t *thread_def, void *argume