stm32cubemx hal学习记录:FreeRTOS任务管理

一、任务通知

1、FreeRTOS从V8.2.0版本开始提供任务通知功能,每个任务都有一个32位的通知值,在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组,也可以代替长度为1的队列。

2、相较于以前使用FreeRTOS内核通信的资源,必须创建队列、二值信号量、计数信号量或者事件组的情况,使用任务通知更加灵活。

3、但是只有一个任务接收通知,因为必须指定接收通知的任务。且只有等待通知的任务可以被阻塞,发送通知的任务在任何情况下都不会因为发送失败而进入阻塞态。

二、参数配置

1、配置RCC、USART1、时钟84M

2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。

3、初始化LED的两个引脚、两个按键引脚

4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可

5、打开以下功能,系统默认打开

6、创建三个线程,两个接收,一个发送

 三、API

1、向指定的任务发送一个任务通知:osSignalSet

2、等待任务通知:osSignalWait

四、代码解释

①发送

#define KEY1_EVENT (0x01<<0)
#define KEY2_EVENT (0x01<<1)
void Send_thread_entry(void const * argument)
{
  for(;;)
  {
    if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)==0)
		{
			printf("key1 down!\n");
			
			osSignalSet(Receive1_stackHandle,KEY1_EVENT);
		}
		
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==0)
		{
			printf("key2 down!\n");
			
			osSignalSet(Receive2_stackHandle,KEY2_EVENT);
		}
		
		osDelay(1000);
  }
}

②接收1

void Receive1_thread_entry(void const * argument)
{
  for(;;)
  {
    osEvent event=osSignalWait(KEY1_EVENT,osWaitForever);
		
		if(event.status==osEventSignal)
		{
			if(event.value.signals & KEY1_EVENT)
			{
				printf("receive1 task\n");
			}
		}
  }
}

③接收2

void Receive2_thread_entry(void const * argument)
{
  for(;;)
  {
    osEvent event=osSignalWait(KEY2_EVENT,osWaitForever);
		
		if(event.status==osEventSignal)
		{
			if(event.value.signals & KEY2_EVENT)
			{
				printf("receive1 task\n");
			}
		}
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值