• CMSIS-RTOS2简介


    本文介绍CMSIS-RTOS2。

    1.引入

    CMSIS-RTOS2在基于Arm Cortex处理器的设备上运行的实时操作系统内核上指定了通用RTOS接口。应用程序和中间件组件可以使用CMSIS-RTOS2 API在各种软件生态系统中实现更好的代码重用和更简单的集成。

    CMSIS-RTOS2还指定了RTOS内核使用的标准OS Tick接口。它提供了几个操作系统tick实现,用于将简单的内核移植到不同的Cortex-M和Cortex-A处理器。

    CMSIS-RTOS2在软件层次中的位置如下图(浅蓝色部分)。

    目前支持的主流RTOS Kernel:

    1)RTX(Keil)

    2)FreeRTOS

    3)Zephyr RTOS

    4)Micrium OS

    2.主要接口

    关于CMSIS-RTOS2的接口(API)可参考网址:CMSIS-RTOS2: API Reference

    下面简要介绍CMSIS-RTOS2中常用的接口(API),按如下类别进行划分。

    1)线程管理

    通常将一个复杂的任务划分为若干个独立的线程,每个独立的线程完成一定的功能。

    创建:

    1. osThreadId_t osThreadNew(osThreadFunc_t func,
    2. void *argument,
    3. const osThreadAttr_t *attr
    4. )

    切换:

    用于同等优先级任务切换。

    osStatus_t osThreadYield(void)

    挂起:

    osStatus_t osThreadSuspend(osThreadId_t thread_id)

    恢复:

    osStatus_t osThreadResume(osThreadId_t thread_id)

    终止:

    osStatus_t osThreadTerminate(osThreadId_t thread_id)

    2)线程间同步

    a)信号量

    用于多个任务协作,或访问某一临界资源时。

    创建:

    1. osSemaphoreId_t osSemaphoreNew(uint32_t max_count,
    2. uint32_t initial_count,
    3. const osSemaphoreAttr_t *attr
    4. )

    获取:

    1. osStatus_t osSemaphoreAcquire(osSemaphoreId_t semaphore_id,
    2. uint32_t timeout
    3. )

    释放:

    osStatus_t osSemaphoreRelease(osSemaphoreId_t semaphore_id)

    b)互斥量

    互斥量相当于单值型信号量,用于临界资源的互斥访问,区别于单值型信号量,其在优先级反转方面有特殊的处理。

    创建:

    osMutexId_t osMutexNew(const osMutexAttr_t *attr)

    请求:

    1. osStatus_t osMutexAcquire(osMutexId_t mutex_id,
    2. uint32_t timeout
    3. )

    释放:

    osStatus_t osMutexRelease(osMutexId_t mutex_id)

    c)事件集

    事件集主要用于线程间的同步,与信号量不同,它的特点是可以实现一对多,多对多的同步。即多个事件可以实现“或”或“与”的运算。

    创建:

    osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr)

    设置:

    1. uint32_t osEventFlagsSet(osEventFlagsId_t ef_id,
    2. uint32_t flags
    3. )

    其中,flags为某一位或几位,如:((1 << 2) | (1 << 3)),表示将第2位和第3位置位。

    清除:

    1. uint32_t osEventFlagsClear(osEventFlagsId_t ef_id,
    2. uint32_t flags
    3. )

    等待:

    1. uint32_t osEventFlagsWait(osEventFlagsId_t ef_id,
    2. uint32_t flags,
    3. uint32_t options,
    4. uint32_t timeout
    5. )

    等待的信号被置位后,默认会被自动清零,若想手动清零,可设置“options”参数。

    3)线程间通信

    线程间通信这里仅有消息队列。

    创建:

    1. osMessageQueueId_t osMessageQueueNew(uint32_t msg_count,
    2. uint32_t msg_size,
    3. const osMessageQueueAttr_t *attr
    4. )

    发送:

    1. osStatus_t osMessageQueuePut(osMessageQueueId_t mq_id,
    2. const void *msg_ptr,
    3. uint8_t msg_prio,
    4. uint32_t timeout
    5. )

    接收:

    1. osStatus_t osMessageQueueGet(osMessageQueueId_t mq_id,
    2. void *msg_ptr,
    3. uint8_t *msg_prio,
    4. uint32_t timeout
    5. )

    4)时钟管理

    休眠:

    让出处理器资源,进入就绪状态,同时进行一次调度,选出当前优先级最高的任务执行。

    osStatus_t osDelay(uint32_t ticks)

    等绝对时间:

    osStatus_t osDelayUntil(uint32_t ticks)

    获取系统Tick:

    uint32_t osThreadGetCount(void)

    返回为32位数,注意溢出问题。

    5)中断管理

    涉及中断任务之间的临界资源的访问(注意和互斥量之间的区别)。

    若使用FreeRTOS,可用如下宏:

    1. taskENTER_CRITICAL()
    2. taskEXIT_CRITICAL()

    总结,本文介绍了CMSIS-RTOS2。

  • 相关阅读:
    最新版微信如何打开青少年模式?
    javaweb Mybatis 配置 代理开发 案例分析 增删改查 动态SQL
    前端开发综合指南:HTML、CSS和JavaScript详解
    关于面试,95%会问到的Java面试题(高级部分)
    守护安全|AIRIOT城市天然气综合管理解决方案
    字节输入流【InputStream】(读文件)
    Vue3+TypeScript学习
    SpreadsheetGear V9 2023 Crack
    理解Go语言中多种并发模式
    【HTML】笔记2-表格、列表、表单标签
  • 原文地址:https://blog.csdn.net/propor/article/details/139742246