当前位置:   article > 正文

STM32中使用CMSIS-RTOS建立任务_stm32 azure rtos 的cmsis

stm32 azure rtos 的cmsis

一、FreeRTOS简介

FreeRTOS是一个热门的嵌入式设备用即时操作系统核心,它于2003年由Richard Barry设计,并已被经成功移植到35种不同的微控制器上。

FreeRTOS的设计小巧且简易,整个核心代码只有3到4个C文件,为了让代码容易阅读、移植和维护,大部分的代码都是以C语言编写,只有一些函数(多数是架构特定排班副程序)采用汇编语言编写。

FreeRTOS提供许多方法以实现多线程(threads)、多作业(task)、互斥锁(mutex)、信号量(semaphore)和软件计时器(software timer),有个为低耗电应用程序提供的无嘀嗒(tick-less)模式,线程的优先权管理也有支持,此外,FreeRTOS提供了四种存储器配置的模式:

  • 仅配置(allocate only)
  • 以非常简易但快速的算法进行配置与释放
  • 搭配存储器合并,以较复杂但快速的算法进行配置与释放
  • 搭配互斥保护,以 C 库配置进行配置与释放

二、STM32系列中使用RTOS

ST公司给出了FreeRTOS例程,在原本的FreeRTOS上又进行了一层封装,这层就是CMSIS-RTOS。
CMSIS-RTOS是keil公司对不同RTOS的一种封装结构,可以使不同的RTOS具有相同的调用接口,以方便今后程序的移植。在这里我们介绍一下使用CMSIS-RTOS建立任务的方法。使用的版本是V1.02。

使用CMSIS-RTOS建立任务需要用到两个API,分别是osThreadDef和GprsTaskHandle,其具体定义如下:

  1. osThreadDef
#define osThreadDef(name, thread, priority, instances, stacksz)
  • 1

这个宏定义了线程函数的属性,该线程函数可以由函数 osThreadCreate 使用 osThread 创建。参数instances定义了可以为同一个 osThreadDef 调用 osThreadCreate 的次数。

参数含义:

参数含义
name线程函数的名称
priority线程函数的初始优先级
instances可能的线程实例的数量
stacksz线程函数的堆栈大小(字节)要求。
  1. osThreadCreate
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument);
  • 1

通过将线程功能添加到“Active Threads list”中来启动线程功能,并将其设置为状态READY。 启动函数时,线程函数将参数指针作为函数参数接收。 当创建的线程函数的优先级高于当前的RUNNING线程时,创建的线程函数将立即启动并成为新的RUNNING线程。

参数含义

参数含义
thread_def使用osThread引用的线程定义
argument作为开始参数传递给线程函数的指针

建立任务的步骤

  1. 声明任务ID
osThreadId defaultTaskHandle ;
  • 1
  1. 声明任务的函数原型
void StartDefaultTask(void const * argument);
  • 1
  1. 在main函数中创建任务

int main(void)
{
 //前面省略了一些初始化函数
  MX_FREERTOS_Init();
  while (1)
  {
  }

}

void MX_FREERTOS_Init(void) {

  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  1. 实现StartDefaultTask
void StartDefaultTask(void const * argument)
{
  /* USER CODE  */
}
  • 1
  • 2
  • 3
  • 4

注意,在任务中还可以嵌套任务,例如:

void StartDefaultTask(void const * argument)
{
  /* USER CODE  */
  
    /* 任务1*/
    osThreadDef(Task1, Task1, osPriorityNormal, 0, 256);
    Task1Handle = osThreadCreate(osThread(Task1), NULL); 
      
 	/*任务2*/
    osThreadDef(Task2, Task2, osPriorityHigh, 0, 1024);
    Task2Handle = osThreadCreate(osThread(Task2), NULL);
    
  /* USER CODE  */
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

至此你可以自己编写你的StartDefaultTask,来实现你的任务。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号