开门见山,直接上干货,我们这里讲的是CMSIS-RTOS2 即CMSIS V2,也是stm32cubemx可以直接生成的操作系统封装;由于stm32cubemx使用cmsis封装的freertos所以我接下来,就结合被封装的freertos来讲解cmsis-rtos 2的用法。

cmsis_os.h文件里有一个枚举定义

typedef enum {
  osKernelInactive        =  0,         ///< Inactive.不活跃的
  osKernelReady           =  1,         ///< Ready.准备好的
  osKernelRunning         =  2,         ///< Running.正在运行
  osKernelLocked          =  3,         ///< Locked.调度器上锁
  osKernelSuspended       =  4,         ///< Suspended.挂起
  osKernelError           = -1,         ///< Error.错误
  osKernelReserved        = 0x7FFFFFFFU ///< Prevents enum down-size compiler optimization.预留
} osKernelState_t;

这是cmsis用来表示系统状态的,和以下几个封装函数有关。

首先cmsis有个操作系统初始化函数osKernelInitialize,操作系统状态上电默认是Inactive.不活跃的,在这里没有啥复杂操作,就是把状态改为Ready.准备好的。所以这个函数一般放在最开始,表示初始化操作系统了,其实和freertos没啥关系,放在前面即可。

然后cmsis有个使能操作系统的函数osKernelStart,它是用来封装freertos的vTaskStartScheduler开调度的函数的,在这个函数里除了封装一下vTaskStartScheduler之外,又把操作系统状态设置为osKernelRunning,成功返回osOK

如果同学们用stcubemx,那么就会看见在main函数里有以下三句
  osKernelInitialize(); //操作系统初始化
  MX_FREERTOS_Init();//用来定义其他任务和信号量、队列等
  osKernelStart();//使能操作系统即开调度

再看下面2个cmsis函数

osKernelLock  调度器上锁

osKernelUnlock 调度器恢复

分别封装的是freeRTOS的vTaskSuspendAll和xTaskResumeAll,函数里面对挂起或者恢复的嵌套逻辑做了些判断

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐