上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。
所谓的挂起,也可以认为是 暂停 ,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。
在FreeRTOS的API文档中找到任务挂起函数的介绍,函数需要的参数为我们想要挂起的任务句柄,如果传递为NULL则暂停我们的调用任务。
同样的,在文档中也可以找到恢复任务函数介绍。
接下来我们实现一个任务,目标是当LED1闪烁5次后挂起LED0闪烁的任务,当LED1再闪烁5次后恢复LED0闪烁的任务。
我们在API中找到查询任务状态的函数eTaskGetState,该函数传入参数为任务句柄,返回参数为任务状态。
LED0在进行vTaskDelay时是处于阻塞态,因此我们只需要判断LED0是阻塞状态还是挂起状态,再进行挂起和恢复操作。
因此我们的代码如下
void LED_TOG2(void * pvParameters)//参数为 void * pvParameters
{
while(1)
{
printf("LED_TOG2 runningrn");//串口打印运行信息
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转
LED2_Number++;//LED0翻转计数
if(LED2_Number %10==0)
{
if(eTaskGetState(LED_TOG_Handler) == eSuspended)
{
vTaskResume(LED_TOG_Handler);//LED0任务恢复
}
if(eTaskGetState(LED_TOG_Handler) == eBlocked )
{
vTaskSuspend(LED_TOG_Handler);//LED0任务挂起
}
}
vTaskDelay(500);//延迟500ms
}
}
void Start_LED(void * pvParameters)
{
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t )LED_TOG,//任务函数
(char * )"LED_TOG",//任务名称
(configSTACK_DEPTH_TYPE) 128,//堆栈空间128Byte
(void* ) NULL,//无返回
(UBaseType_t ) 1,//优先级1
(TaskHandle_t * )&LED_TOG_Handler);//任务函数句柄
xTaskCreate((TaskFunction_t )LED_TOG2,//任务函数
(char * )"LED_TOG2",//任务名称
(configSTACK_DEPTH_TYPE) 128,//堆栈空间128Byte
(void* ) NULL,//无返回
(UBaseType_t ) 2,//优先级1
(TaskHandle_t * )&LED_TOG2_Handler);//任务函数句柄
taskEXIT_CRITICAL();
vTaskDelete(NULL);
}
在第10 和 17行,上期编写时xTaskCreate第六个参数传入的应该是TaskHandle_T *类型,即句柄指针,而上期写的时候忘记加&取地址符号会导致在这期调用挂起函数时整个程序卡死。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
led
+关注
关注
237文章
22449浏览量
645877 -
函数
+关注
关注
3文章
3868浏览量
61309 -
FreeRTOS
+关注
关注
12文章
473浏览量
61347 -
STM32F407
+关注
关注
15文章
187浏览量
28973
发布评论请先 登录
相关推荐
基于STM32F407的FreeRTOS学习笔记(1)
其实从很早之前就想学实时操作系统(RTOS)了,但是一直没有时间去学,以前使用STM32单片机一直停留在逻辑开发以及前后台系统,而真正被广泛使用的则是RTOS。
基于STM32F407的FreeRTOS学习笔记(5)
在数据结构中有一种很重要的数据结构叫做队列,其特点是数据先进先出。在FreeRTOS中也有一类队列,我们利用这类队列在FreeRTOS中实现任务与任务间的消息传递,所以也可以称之为消息队列。
基于STM32F407的FreeRTOS学习笔记(6)
信号量(Semaphore)也被称为信号灯。有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量(来自百度百科)
基于STM32F407的FreeRTOS学习笔记(8)
前面几期我们介绍过队列、二进制信号量以及计数信号量。但是在使用二进制信号量的时候会有一种优先级反转问题的出现,简而言之就是低优先级任务因为无法及时释放信号量而导致等待信号量发生的高优先级任务迟迟无法进行。
基于STM32F407的FreeRTOS学习笔记(9)
在嵌入式编程中,定时器是一个非常重要且强大的功能,用来帮我们定时性的调用中断服务函数来帮助我们处理程序。定时器通常是用硬件来实现的,例如STM32F407就有8个硬件定时器。
基于STM32F407的FreeRTOS学习笔记(10)
在介绍二进制信号量时曾经讲过,二进制信号量可以代替我们裸机开发中的标志位来使用。在裸机开发中我们使用标志位来表示某个事件是否发生,并且其他程序利用标记位的状态来判断程序是否可以继续进行。但是这种大量使用标记位的情况会导致代码的逻辑异常的复杂。
STM32F407 FreeRTOS开发指南
参考资料:正点原子《littleVGL 开发指南》正点原子《STM32F407 FreeRTOS 开发指南》硬件平台:stm32f407开发板(或最小系统)、4.3寸TFTLCD以正点原子的例程为
发表于 01-05 06:55
STM32F407标准库学习
STM32F407标准库学习笔记-AFIO- 头文件 gpio.h#define GPIO_PinSource0((uint8_t)0x00)#define GPIO_PinSource1
发表于 01-24 06:42
评论