FreeROTS 就是一个免费的 RTOS 类系统。这里要注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 UCOS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行。
结合CUBEMX使用freertos----cubemx配置
自己配置好串口
1.CMSIS-V1与CMSIS-V2
这两个接口,前者是普通功能,后者是高级功能,在使用事件时,必须开启CMSIS-V2。
2.config parameters
使用默认配置
配置好之后生成工程。
3.任务函数
1.创建任务
这是生成代码后,keil5里的创建任务代码
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);//创建任务
函数osThreadCreate()原型如下
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint16_t usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
xTaskCreate((TaskFunction_t )start_task, //任务函数 (1)
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
2.删除任务
使用删除任务时,CUBEMX里的此项要开启,如下图
vTaskDelete(myTask02Handle);
/*osThreadTerminate(myTask02Handle);*/
二者相同
原型如下
void vTaskDelete( TaskHandle_t xTaskToDelete )
/*osStatus osThreadTerminate (osThreadId thread_id)
{
#if (INCLUDE_vTaskDelete == 1)
vTaskDelete(thread_id);
return osOK;
#else
return osErrorOS;
#endif
}*/
3.挂起任务和继续任务
vTaskSuspend(myTask02Handle);//osThreadSuspend(myTask02Handle);
vTaskResume(myTask02Handle);//osThreadResume(myTask02Handle);
osThreadSuspendAll();//全部挂起
osThreadResumeAll();//全部继续
使用几次全部挂起就要使用几次全部继续
4.任务调度
osStatus osKernelStart (void)
{
vTaskStartScheduler();
return osOK;
}
4.实验验证
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
printf("任务2执行\r\n");
task2++;
osDelay(1000);
}
/* USER CODE END StartTask02 */
}
void StartTask03(void const * argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
for(;;)
{
if(task2>5)
{
task2=0;
vTaskSuspend(myTask02Handle);// 等同osThreadSuspend(myTask02Handle);
printf("任务2已挂起\r\n");
osDelay(2200);
vTaskResume(myTask02Handle);//osThreadResume(myTask02Handle)
printf("任务2继续\r\n");
osDelay(2200);
vTaskDelete(myTask02Handle);//osThreadTerminate(myTask02Handle);
printf("任务2已删除\r\n");
}
osDelay(1);
}
/* USER CODE END StartTask03 */
}
task2执行五次,相继挂起,执行,删除。
欢迎指正