芯片选择STM32,使用Keil创建RTOS。直接使用Keil自带的RTX5,简单方便。也可以选择用STM32CubeMX创建FreeRTOS。都是用CMSIS-RTOS2给封装了一层。用的API函数都一样。RTX5和FreeTOS原理都类似。
1.在Manage Run-Time Environment上点击,添加为RTOS2(API),我这里选择了Source
2.点击Resolve
将多出来的2个文件取消变异
将void PendSV_Handler(void),void SysTick_Handler(void),void SVC_Handler(void) 这3个中断都屏蔽掉
加入头文件#include “cmsis_os2.h”
osThreadId_t threadID_LED = NULL; /* 保存线程ID */
osThreadId_t threadID_Start = NULL; /* 保存线程ID */
/* LED线程 */
const osThreadAttr_t thread_LED_Attr =
{
.name = "LED_App", /* 线程名字 */
.stack_size = 256, /* 堆栈的大小 */
.priority = osPriorityNormal3, /* 线程优先级 */
.attr_bits = osThreadDetached, /* 线程类型 */
};
/* Start线程 */
const osThreadAttr_t thread_Start_Attr =
{
.name = "Start_App", /* 线程名字 */
.stack_size = 512, /* 堆栈的大小 */
.priority = osPriorityNormal2, /* 线程优先级 */
.attr_bits = osThreadDetached, /* 线程类型 */
};
分别创建2个线程 ,句柄分别为threadID_LED和threadID_Start。将相关属性配置好
开启调度
2个任务函数
void thread_LED_App(void *argment)
{
while(1)
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
printf("LED is Toggle. \r\n");
osDelay(1000);
}
}
void thread_Start_App(void *argument)
{
threadID_LED = osThreadNew(thread_LED_App,NULL,&thread_LED_Attr); /* ´´½¨LEDÏß³Ì */
while(1)
{
printf("Thread Start is Working !\r\n");
osDelay(1000);
}
}
对于RTOS的创建便结束
CMSIS-RTOS2的官网