赞
踩
FreeRTOS是一个热门的嵌入式设备用即时操作系统核心,它于2003年由Richard Barry设计,并已被经成功移植到35种不同的微控制器上。
FreeRTOS的设计小巧且简易,整个核心代码只有3到4个C文件,为了让代码容易阅读、移植和维护,大部分的代码都是以C语言编写,只有一些函数(多数是架构特定排班副程序)采用汇编语言编写。
FreeRTOS提供许多方法以实现多线程(threads)、多作业(task)、互斥锁(mutex)、信号量(semaphore)和软件计时器(software timer),有个为低耗电应用程序提供的无嘀嗒(tick-less)模式,线程的优先权管理也有支持,此外,FreeRTOS提供了四种存储器配置的模式:
ST公司给出了FreeRTOS例程,在原本的FreeRTOS上又进行了一层封装,这层就是CMSIS-RTOS。
CMSIS-RTOS是keil公司对不同RTOS的一种封装结构,可以使不同的RTOS具有相同的调用接口,以方便今后程序的移植。在这里我们介绍一下使用CMSIS-RTOS建立任务的方法。使用的版本是V1.02。
使用CMSIS-RTOS建立任务需要用到两个API,分别是osThreadDef和GprsTaskHandle,其具体定义如下:
#define osThreadDef(name, thread, priority, instances, stacksz)
这个宏定义了线程函数的属性,该线程函数可以由函数 osThreadCreate 使用 osThread 创建。参数instances定义了可以为同一个 osThreadDef 调用 osThreadCreate 的次数。
参数含义:
参数 | 含义 |
---|---|
name | 线程函数的名称 |
priority | 线程函数的初始优先级 |
instances | 可能的线程实例的数量 |
stacksz | 线程函数的堆栈大小(字节)要求。 |
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument);
通过将线程功能添加到“Active Threads list”中来启动线程功能,并将其设置为状态READY。 启动函数时,线程函数将参数指针作为函数参数接收。 当创建的线程函数的优先级高于当前的RUNNING线程时,创建的线程函数将立即启动并成为新的RUNNING线程。
参数含义
参数 | 含义 |
---|---|
thread_def | 使用osThread引用的线程定义 |
argument | 作为开始参数传递给线程函数的指针 |
osThreadId defaultTaskHandle ;
void StartDefaultTask(void const * argument);
int main(void) { //前面省略了一些初始化函数 MX_FREERTOS_Init(); while (1) { } } void MX_FREERTOS_Init(void) { osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); }
void StartDefaultTask(void const * argument)
{
/* USER CODE */
}
注意,在任务中还可以嵌套任务,例如:
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 */
}
至此你可以自己编写你的StartDefaultTask,来实现你的任务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。