列出所有内核_RTOS内功修炼记(八)— CMSIS RTOS API,内核通用API接口

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的整体架构如下图:20bb92a013158f9a2a3741f362e6799f.png

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值