STM32FreeRTOS任务通知(STM32cube高效开发)

这篇具有很好参考价值的文章主要介绍了STM32FreeRTOS任务通知(STM32cube高效开发)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、任务通知

(一)任务通知概述

1、任务通知可模拟队列和信号量

任务通知是FreeRTOS另外一种进程间通信技术。不需要创建任何中间对象,可以直接从任务向任务或ISR向任务发送通知,传递一个通知值任务通知可以模拟二值信号量、计数信号量、或长度为1的消息队列,使用任务通知,一般效率更高,消耗内存更少

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
任务通知和队列信号量事件组区别如下

  • 队列信号量事件组:

    使用队列、信号量、事件标志组时都需另外创建一个结构体,通过中间的结构体进行间接通信!

  • 任务通知:

    使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发过来的"通知"

2、任务通知优势和局限性

(1)任务通知值优势

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

  • 效率更高: 使用任务通知向任务发送事件或数据比使用队列、事件标志组或信号量快得多
  • 使用内存更少: 使用其他方法时都要先创建对应的结构体,使用任务通知时无需额外创建结构体

(2)任务通知值局限

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

  • 无法发送数据给ISR: ISR没有任务结构体,所以无法给ISR发送数据。但是ISR可以使用任务通知的功能,发数据给任务。
  • 无法广播给多个任务: 任务通知只能是被指定的一个任务接收并处理
  • 无法缓存多个数据; 任务通知是通过更新任务通知值来发送数据的,任务结构体中只有一个任务通知值,只能保持一个数据。
  • 发送受阻不支持阻塞: 发送方无法进入阻塞状态等待

(二) 任务通知函数

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

1、xTaskNotify()发送通知值不返回先前通知值的函数

向一个任务发送通知的函数
参数1:任务通知句柄
参数2:要发送的通知值(此参数的使用取决于参数3)
参数3:通知值得作用方式(可以传入五种不同得枚举值)

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

/*
参数1:接收者任务句柄
参数2:要发送的通知值(此参数的使用取决于参数3)
参数3:通知值作用方式(可以传入五种不同得枚举值eNotifyAction)
参数4:为NULL表明不会返回通知前的数值
通知值和枚举值共同决定了如何修改接收者通知值
返回值是更新后的通知值
*/
#define xTaskNotify( xTaskToNotify, ulValue, eAction ) 
xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL )

xTaskNotify()在调用函数xTaskGenericNotify()时没有传递最后一个参数,所以不能返回接收者更新之前的通知值。函数xTaskNotify()返回的是更新之后的接收者的通知值。

参数3的枚举值如下所示:
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

typedef enum
{
	eNoAction = 0, /* 无操作:只发通知,不改变接收者的通知值 */
	eSetBits, /* 更新指定bit: 接收者的通知值与ulValue按位或运算,适用于当做事件组使用 */
	eIncrement, /* t将接收者的通知值加1,适用于当做二值信号量或计数信号量使用 */
	eSetValueWithOverwrite,/* 覆写通知值:用ulValue覆盖接收者的通知值,即使前一次的通知未被处理 */
	eSetValueWithoutOverwrite /* 不覆写通知值:接收者处于非挂起状态时,用ulValue更新其通知值,否则不
	更新*/
} eNotifyAction;

参数3枚举值:
(1)传入eSetBits时(适用于任务通知做事件组时使用)
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
接收者的通知值与u1value进行按位或运算

(2)传入eIncrement(适用于当作计数型信号量或二值信号量场景)
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
接收者的通知值+1运算

(3)覆写
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
用u1value覆盖接收者的通知值(即使前一次的通知未被处理)
(4)不覆写更新通知值
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
接收者处于非挂起状态时,用u1value更新其通知值,否则不更新

宏函数实际调用执行的函数:

/*
参数1:任务通知句柄
参数2:要发送的通知值(此参数的使用取决于参数3)
参数3:通知值得作用方式(可以传入五种不同得枚举值eNotifyAction)
参数4:返回接收者的通知值被改变之前的值(NULL表明不会返回通知前的数值)
*/

#if( configUSE_TASK_NOTIFICATIONS == 1 )
	BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, 
								  uint32_t ulValue,
								  eNotifyAction eAction,
								  uint32_t *pulPreviousNotificationValue )
	{}


#endif /* configUSE_TASK_NOTIFICATIONS */

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

2、xTaskNotifyFromISR()发送通知函数ISR版本

ISR版本比任务中的发送函数多一个参数(最后一个参数是指是否需要进行上下文切换)

#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction,pxHigherPriorityTaskWoken ) 
xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL, ( HigherPriorityTaskWoken ) )

pxHigherPriorityTaskWoken是一个*BaseType_t 类型的指针,实际上是一个返回数据,表示退出中断ISR函数之后是否需要进行上下文切换

申请进行上下文切换调用函数portYIELD_FROM_ISR()

3、xTaskNotifyAndQuery()发送通知值且返回先前通知值的函数

函数xTaskNotifyAndQuery()与xTaskNotify()的功能相同,但是能返回接收者通知值改变之前的值。(还有一个ISR版本)
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
参数pulPreviousNotifyValue用于获取接收者之前的通知值,是uint32_t *类型的指针变量

示意代码如下:

uint32_t previousValue=0;
uint32_t currentValue=0;
currentValue =xTaskNotifyAndQuery(xTaskToNotify, ulValue, eAction, &previousValue);

4、xTaskNotifyGive()函数-发送通知值使通知值+1的函数

函数 xTaskNotifyGive() 是xTaskNotify()的一种功能简化版本(并有一个ISR版本)
参数eAction设置为eIncrement,所以,函数xTaskNotifyGive()的功能就是使接收者的通知值加1,这使其适用于 将任务通知当做二值信号量或计数信号量使用的场合。
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

注意:
发送通知API函数可以用于任务和中断服务函数中;接收通知API函数只能用在任务中。
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

5、xTaskNotifyWait()函数-等待任务通知和接收通知值

接收者使用函数xTaskNotifyWait()进入阻塞状态等待任务通知并获取通知值

BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, 
							uint32_t ulBitsToClearOnExit,
							uint32_t *pulNotificationValue, 
							TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;

参数1:函数进入时需要清零的通知值的位掩码。(需要清零的位在掩码中用1表示,否则用0表示)
		计算方式是当前值按位取反后再与通知值按位与运算,用计算的结果用来更新通知值,
		如果设置为0表示不更新通知值,如果设置为0xffffffff表示将所有位清零
参数2:函数在退出时需要清零的通知值的位的掩码。(0就是不更改通知值,0xFFFFFFFF就是将通知值设置为0)

参数3:是一个uint32_t *类型的指针,用于返回接收到的通知值。
参数4:超时阻塞时间(函数在阻塞状态等待的节拍数)
返回值:是pdTRUE或pdFALSE,pdTRUE表示接收到了任务通知,包括函数一进入就读取已挂起的任务通知

如果是未挂起的任务,也就是没有任务通知任务进入阻塞状态等待任务通知。
如果任务是挂起状态,有未处理的任务通知就立刻读取通知值然后返回。
任务接收到通知或者超时则会退出阻塞状态

6、ulTaskNotifyTake()函数–二值信号量或计数信号量获取任务通知

获取任务通知,可以设置在退出此函数的时候将任务通知值清零或者减一。
当任务通知用作二值信号量或者计数信号量的时候,使用此函数来获取信号量。

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;

参数1:pdTRUE或pdFALSE
(1)取值为pdTRUE时,函数接收到通知并退出时将通知值清零,
	这种情况下是将通知值当做二值信号量使用
(2)取值为pdFALSE时,函数接收到通知并退出时将通知值减1,
	这种情况下是将通知值当做计数信号量使用
参数2:超时等待时间(进入阻塞状态等待任务通知的节拍数)
返回值:减1或清零之前的通知值

函数ulTaskNotifyTake()一般与函数xTaskNotifyGive()搭配使用,将任务通知值当做二值信号量或计数信号量使用。

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

注意:
当任务通知用作于信号量时,使用函数获取信号量:ulTaskNotifyTake()
当任务通知用作于事件标志组或队列时,使用此函数来获取: xTaskNotifyWait()

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

7、xTaskNotifyStateClear()函数-清除任务通知值

清除接收者的任务通知等待状态使其变为未挂起状态,不会将接收者的通知值清零(参数是需要操作的任务句柄,设置为NULL表示当前的任务)
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

二、任务通知传递数据

(一)任务通知值模拟二值信号量

1、目标

使用中断方式进行ADC转换,通过任务通知将ADC转换结果作为通知值发送给另外一个任务
(1)ADC1在定时器TIM3的触发下进行周期为500ms的ADC数据采集,在ADC的ISR函数里通过函数xTaskNotifyFromISR()将转换结果发送给任务Task_Show
(2)任务Task_Show总是使用函数xTaskNotifyWait()等待任务通知,读取出通知值后在LCD上显示数据

2、STM32cubemx配置

(1)复制只有LCD的cube文件并重命名

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

(2)RCC

STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

(3)SYS选择TIM6作为FreeRTOS的基础时钟源
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
(4)定时器3选择内部时钟
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
TIM3挂载到APB1总线,84MHZ,如果将其划分为1khz的话,分频系数就需要设为84k
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
但是分频器最大65535,达不到8万4, 就设为8400-1获得一个10000h频率即定时0.1ms,由于希望获得到周期是500ms的延时,所以计数周期可以设置为5000-1,并且选择更新事件。
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
(5)ADC设置
选择通道5,选择定时器3触发事件,采样选择15
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
使能ADC的NVIC
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
(6)启动Freertos选择V2版本,并且对默认任务进行修改将栈空间设为256字
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
(7)设置NVIC
要在ADC的ISR中调用freertos的函数,所以ADC中断优先级不能比5高
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

生成代码

3、代码编写

(1)LCD部分
移植BSP文件夹到工程目录中并且添加相关路径到头文件中,并调用相关的头文件实现lcd的初始化和数据显示测试。 可以实现LCD的数据显示以后进行下一步
(2)main.c文件主函数
LCD初始化、LCD测试、启动定时器和ADC
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

 /* USER CODE BEGIN 2 */

  TFTLCD_Init();
  LCD_ShowString(10, 10+0*20, tftlcd_data.width, tftlcd_data.height, 12, "tasknotify test bin");

	//以中断方式启动adc1
	HAL_ADC_Start_IT(&hadc1);
	//启动定时器3
	HAL_TIM_Base_Start(&htim3);

  /* USER CODE END 2 */

main.h添加头文件(从main.c调用头文件处复制即可)
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

(3)Freertos代码编写

ADC1在定时器TIM3的触发下进行周期为500ms的ADC数据采集,在ADC的ISR函数里通过函数xTaskNotifyFromISR()将转换结果发送给任务Task_Show

/* USER CODE BEGIN Application */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	//由于定时器3每500ms更新一次事件,adc在500ms触发下周期性的进行adc转换,转换完就会触发这个回调函数

	//	//先查询是不是adc1的通道5
	if(hadc->Instance==ADC1)//adc1
	{
		uint32_t adc_value=HAL_ADC_GetValue(&hadc1);//获取ADC的数值,并赋值给局部变量
		//以任务通知的形式将数据发送给任务,且以覆写的形式进行
		//首先保证任务句柄存在才写入数据
		if(Task_showHandle!=NULL)
		{
			BaseType_t pxHigherPriorityTaskWoken=pdFALSE;//默认不进行任务调度
			//使用ISTR写入数据函数
			//参数1接收数据的任务句柄,参数2:传输数值
			//参数3:覆写,参数4:是否进行上下文切换
			xTaskNotifyFromISR(Task_showHandle,adc_value,eSetValueWithOverwrite,&pxHigherPriorityTaskWoken);
			//防止优先级反转需要传入数值来判断推出前是否需要进行一次任务调度申请
			portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);
		}


	}
}

/* USER CODE END Application */

任务Task_Show总是使用函数xTaskNotifyWait()等待任务通知,读取出通知值后在LCD上显示数据

/* USER CODE END Header_AppTask_show */
void AppTask_show(void *argument)
{
  /* USER CODE BEGIN AppTask_show */
	uint32_t pulNotificationValue=0;//接收的值

  /* Infinite loop */
  for(;;)
  {
	//参数1:函数进入时不更新通知值(0),0xffffffff表示将所有位清零
	//参数2:函数退出时清零所有位(0xffffffff),0就是不更改通知值
	//参数3:返回的通知值,参数4:超时等待时间
	BaseType_t result=xTaskNotifyWait(0, 0xffffffff, &pulNotificationValue, portMAX_DELAY);
	if(result==pdPASS)//表示接收到了通知
	{
		uint32_t adc_value=pulNotificationValue;
		uint8_t data[20];
		sprintf(data,"adc_value=%d    ",adc_value);
		LCD_ShowString(10,10+2*20,tftlcd_data.width,tftlcd_data.height,12,data);
		sprintf(data,"volatge=%d  mv  ",adc_value*3300>>12);//>>12就是除以4096
		LCD_ShowString(10,10+3*20,tftlcd_data.width,tftlcd_data.height,12,data);

	}
	//没有加入vtaskdelay表明一直在等待通知值的到来
  }
  /* USER CODE END AppTask_show */
}

(二)任务通知值模拟计数型信号量

使用函数xTaskNotifyGive()发送通知,使接收者的通知值加1,使用函数ulTaskNotifyTake()读取通知,使通知值减1或清零
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

1、目标

使用任务通知模拟计数信号量,表示如图所示的餐厅前排队的人数变化。
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

(1)在FreeRTOS中创建一个任务Task_CheckIn,其通知值表示当前在排队的人数。
(2)在任务Task_CheckIn中连续检测key1键,当Key1键按下时执行函数ulTaskNotifyTake()使通知值减1,表示允许1人进店,使排队人数减1。
(3) 设置RTC周期唤醒周期为2秒,在周期唤醒中断里执行函数vTaskNotifyGiveFromISR()向任务Task_CheckIn发送通知,使其通知值加1,表示又来1人加入排队的队伍。

2、STM32cubemx设置

(1)复制按键和LCD的cebemx文件并重命名
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
(2)RCC设置
由于要使用RTC,开启外部低速时钟
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
(3)SYS设置Freertos基础时钟源
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
(4)启用RTC
激活RTC、周期唤醒、二进制数据、2s唤醒一次
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
使能RTC中断
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
(5)启用Freertos并修改默认任务
栈空间设置为256字
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

(6)在原来基础之上设置RTC时钟源
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

3、代码编写

(1)移植BSP文件夹到工程目录中,并且添加头文件路径到工程中以及添加lcd头文件调用,实现LCD的初始化和显示测试
(2)main.c
lcd初始化和lcd显示测试
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知
main.h调用头文件
STM32FreeRTOS任务通知(STM32cube高效开发),STM32-FreeRTOS,STM32HAL库,stm32,STM32cube,Freertos,嵌入式,任务通知

(3)freeRTOS代码编写

任务函数

void AppTask_CheckIn(void *argument)
{
  /* USER CODE BEGIN AppTask_CheckIn */
  /* Infinite loop */
  for(;;)
  {
	  KEYS value=key_scan(20);
	  if(value==KEY_1)//如果是按�?1按下
	  {

			  //参数1:pdfalse表示计数信号量,pdfalse表示通知值不清零,进行-1操作
			  //参数2:一直等待
			  //返回值是上一次的通知值
			  uint32_t precount=ulTaskNotifyTake( pdFALSE, portMAX_DELAY );

			  uint8_t str[20];
			  sprintf(str,"people in waiting= %d     ",precount-1);
			  LCD_ShowString(10, 10+2*20, tftlcd_data.width, tftlcd_data.height, 12, str);

			  vTaskDelay(300);//消抖延时
	  }
	  else
		  vTaskDelay(5);
  }
  /* USER CODE END AppTask_CheckIn */
}

RTC唤醒中断函数

void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{

	LED1_TOGGLE();//2s进入回调函数一次

	BaseType_t pxHigherPriorityTaskWoken=pdFALSE;//不进行上下文切换

	//参数1:写入的任务句柄,参数2:是否进行上下文切换
	vTaskNotifyGiveFromISR(Task_CheckInHandle, &pxHigherPriorityTaskWoken);
	portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);
}

(1)LED1闪烁,表示RTC的中断ISR函数在执行,每2秒钟发送一次任务通知
(2)按下Key1键时, LCD上显示当前排队人数,连续按Key1键时会使排队人数减少,直到减少为0,任务Task_CheckIn就会进入阻塞等待状态。
(3)除了函数ulTaskNotifyTake()和xTaskNotifyWait()之外,没有其他函数能读取任务的当前通知值, 所以程序不能实时显示排队人数,只有在按下Key1键执行一次ulTaskNotifyTake()函数后才会显示当前排队人数文章来源地址https://www.toymoban.com/news/detail-839098.html

到了这里,关于STM32FreeRTOS任务通知(STM32cube高效开发)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 Hal库FreeRTOS统计CPU占比 找出有问题的任务 仅需一个函数搞定 超简单

    一、实现目标 STM32F103 基于Hal库跑FreeRTOS,统计CPU占比 找出有问题的任务,类似实现一个windows 系统的任务查看界面。 代码运行结果如下 二、思路 记录任务的时间点,相减获得任务所占用的时间,所得时间/总时间,得到该CPU占比。  三、实现函数 只需要调用一个vTaskGetRunT

    2024年01月24日
    浏览(45)
  • STM32基于HAL库和STM32CubeMX的实时操作系统FreeRtOS开发

    1、FreeRTOS RTOS是一类操作系统,µC/OS,FreeRTOS,RTX,RT-Thread 等这些都是RTOS 类的操作系统 FreeRTOS 是众多RTOS 类操作系统中的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,FreeRTOS 也不仅仅局限于在微控制器中使用。就单从文件数量上来看FreeRTOS 要比µC/OS 少得多

    2024年02月21日
    浏览(64)
  • (第48-59讲)STM32F4单片机,FreeRTOS【事件标志、任务通知、软件定时器、Tickless低功耗】【纯文字讲解】【】

    【吐血总结】FreeRTOS难点、Systick中断-滴答定时器、PendSV中断-任务切换、SVC中断-系统底层、时间片调度-时钟节拍【已完结】 (第1-8讲)STM32F4单片机,FreeRTOS基础知识总结【视频笔记、代码讲解】【正点原子】【原创】 (第9-10讲)STM32F4单片机,FreeRTOS任务创建和删除(动态方

    2024年02月01日
    浏览(65)
  • 1、STM32CubeMX和STM32Cube库(HAL)详细介绍

    目录 前言 STM32Cube生态 STM32Cube 是什么?         STM32Cube 软件工具套件 STM32Cube Embedded 软件 STM32CubeMX ​编辑         也许大家在学习正点原子或者其他32视频和代码的时候都听过HAL库,是的这是ST官方最新的函数库,而以前的标准库已不再更新与发展。而跟随而来的就是

    2024年02月03日
    浏览(59)
  • 【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)

    一、初识HAL库 1.1、CMSIS简介 1.2、HAL库简介 二、STM32Cube固件包浅析 2.1、如何获取STM32Cube固件包? 2.2、STM32Cube固件包文件夹简介 2.3、CMSIS文件夹关键文件 三、HAL库框架结构 3.1、HAL库文件夹结构 3.2、HAL库文件介绍 3.3、HAL库API函数和变量命名规则 四、如何使用HAL库 4.1、基于CM

    2024年02月21日
    浏览(45)
  • STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

    一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇) 二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速) 三、小车3.0——避障小车(超声波+舵机云台) 四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传) 五、双轮自平衡小车(HAL库版

    2024年02月05日
    浏览(77)
  • STM32+Cube mx hal库实现CAN通信收发实验

          关于CAN通信的入门教程和基本原理在其他博主发的文章里面都有介绍,笔者只是简单记录下学习过程,文章用到的是正点原子的阿波罗F429开发板,另一个设备是中盛科技的继电器模块(CAN版)。       实现之前看一下继电器模块相关信息          发送数据的格式官方文

    2024年02月16日
    浏览(44)
  • STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用

    此为软件模拟IIC,可以直接移植到HAL库使用。.h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论。 使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是根据IIC的时序图编写代码,主要内容就是包括开始信号,停止信号以及发送数

    2024年02月15日
    浏览(59)
  • 【STM32】驱动库的选择:CMSIS Driver、SPL、HAL、LL | 在ARM MDK、STM32Cube中如何选择?

    阅读本专栏其他文章,有助于理解本文。👆 STM32开发相关的库有很多,它们都是为了方便开发者使用STM32微控制器而提供的软件工具。根据不同的功能和层次,可以将它们分为以下几类: CMSIS库(准确来说是CMSIS pack) ( Cortex Microcontroller Software Interface Standard )是 ARM公司 推

    2024年02月11日
    浏览(47)
  • STM32操作系统FreeRTOS学习——基于hal库

    目录 一、基础概念 1、FreeRTOS 2、单片机编程的系统概念 a、裸机系统,包括轮询系统(不包括中断)和前后台系统(中断为前台,轮询为后台) b、多任务系统 3、FreeRTOS编程风格 a、数据类型 b、变量名的定义 c、函数名 d、宏定义 二、Cubemx创建工程 1、创建任务 2、创建队列

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包