云南做网站公司,可以接单做网站的软件,无锡企业网站制作一般多少钱,wordpress english前言 #xff08;1#xff09;FreeRTOS是我一天过完的#xff0c;由此回忆并且记录一下。个人认为#xff0c;如果只是入门#xff0c;利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后#xff0c;再去学习网上的一些其他课程也许会简单很多。 #xff08;21FreeRTOS是我一天过完的由此回忆并且记录一下。个人认为如果只是入门利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后再去学习网上的一些其他课程也许会简单很多。 2本系列课程是使用的keil软件仿真平台所以对于没有开发板的同学也可也进行学习。 3叠甲再次强调本系列课程仅仅用于入门。学习完之后建议还要再去寻找其他课程加深理解。 4本系列博客对应代码仓库 实操 1依旧是将上一篇博客的工程复制一份下来 任务挂起和恢复的宏 1如果需要调用任务挂起和恢复的函数需要在FreeRTOSConfig.h文件中确认INCLUDE_vTaskSuspend 这个宏被置1了。 任务挂起和恢复代码实现 1在StartCubemxTask函数中进行如下补充即可。按CtrlF搜索StartCubemxTask即可找到任务函数 /* USER CODE END Header_StartCubemxTask */
void StartCubemxTask(void *argument)
{/* USER CODE BEGIN StartCubemxTask */char *CubemxTaskPrintf (char *)argument;uint8_t Task_Status 0;/* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) GPIO_PIN_SET){printf(CubemxTaskPrintf);Task_Status;while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) GPIO_PIN_SET);}switch(Task_Status){case 1:// 挂起 keilTask 任务vTaskSuspend(keilTaskHandle); break;case 2:// 恢复 keilTask 任务vTaskResume(keilTaskHandle); break;default:Task_Status 0;break;}}/* USER CODE END StartCubemxTask */
}测试结果 1因为这里不会修改STM32CubeMX所以keil的模拟器配置都还在因此可以直接开始测试。 2测试结果发现StartKeilTask Creat的字符串只会打印一次。而不是像任务删除和创建那样每进行一次删除和创建都会打印一次StartKeilTask Creat。 理论
FreeRTOS的4种任务状态 1首先我先介绍一下FreeRTOS的4种任务状态都是什么意思 1Running 运行态 当任务处于实际运行状态称之为运行态即CPU的使用权被这个任务占用对于单核处理器同一时间仅一个任务处于运行态。后续会讲解RTOS的多任务执行原理。 2Ready 就绪态 处于就绪态的任务是指那些能够运行没有被阻塞和挂起但是当前没有运行的任务因为同优先级或更高优先级的任务正在运行。 3Blocked 阻塞态 如果一个任务因延时或等待信号量、消息队列、事件标志组等而处于的状态被称之为阻塞态。当出现特定的事件发生会自动进入就绪态。 4Suspended 挂起态 任务暂停必须手动调用xTaskResume()函数才可以进入就绪态。 2因为网上的FreeRTOS的4种任务切换图都是纯英文的我于是就自己画了一个。这里简单介绍一下 1进入就绪态 当我们创建了一个任务之后他就会进入就绪态等待任务调度。 2就绪态和运行态切换 就绪态和运行态的切换是由FreeRTOS的任务调度器进行切换的我们人为无法改变。 3就绪态和阻塞态切换 当发生特定的任务时候任务会自动从阻塞态进入就绪态。例如任务延时结束成功获取到了信号量、消息队列、事件标志组等信息。听不懂别慌后面讲同步互斥与通信的时候会详细讲解 4就绪态和挂起态切换 当运行中的任务调用vTaskSuspend()函数并在这个函数中传入需要挂起的任务句柄那么这个处于就绪态的任务将会变为挂起态。当运行中的任务调用vTaskResume()函数并在这个函数中传入需要从挂起态进入就绪态的任务句柄那么这个处于挂起态的任务将会变为就绪态。 5运行态和挂起态切换 当运行中的任务调用vTaskSuspend(NULL)的时候就能够从运行态进入挂起态。 6运行态和阻塞态切换 调用相关的阻塞API接口例如vTaskDelay()、vTaskDelayUntil() 这种延时函数或者是信号量、消息队列或事件组等机制的一些函数。 7挂起态和阻塞态切换 当运行中的任务调用vTaskSuspend()函数并在这个函数中传入需要挂起的任务句柄那么这个处于阻塞态的任务将会变为挂起态。 eTaskGetState()函数介绍 1获取任务状态 /*** brief 获取任务状态** param 需要获取任务状态的任务句柄** return eRunning 任务处于Running运行态* -eReady 任务处于Ready就绪态* -eBlocked 任务处于Blocked阻塞态* -eSuspended 任务处于Suspended挂起态* -eDeleted 任务的结构正在等待清理*/
eTaskState eTaskGetState( TaskHandle_t xTask );vTaskSuspend()函数介绍 1 vTaskSuspend()用于挂起(暂停)任务传入对应的任务句柄即可。 2如果需要挂起(暂停)那么就传入NULL。 /*** brief 挂起(暂停)的任务** param 要挂起(暂停)任务的任务句柄如果是挂起(暂停)自己传入NULL** return 无*/
void vTaskSuspend( TaskHandle_t xTaskToSuspend );vTaskResume()函数介绍 1vTaskResume()用于恢复被挂起(暂停)任务传入对应的任务句柄即可。 2担心有小白问出一些抽象的问题比如为什么可以自己挂起自己而不能自己恢复自己呢你想想任务都挂起了根本就无法执行你还自己恢复自己咋想的 /*** brief 恢复的任务** param 要恢复任务的任务句柄** return 无*/
void vTaskResume( TaskHandle_t xTaskToResume );参考 1FreeRTOS官方文档vTaskSuspend函数介绍 2FreeRTOS官方文档vTaskResume函数介绍 3FreeRTOS官方API文档