FREERTOS学习笔记八-任务通知
1.实验内容
本次实验内容是在实验三工程的基础进行修改,其中任务三和任务四分别监听KEY0和KEY1按键的按下,当按键按下后会给任务二发送标志位。
2.CubeMX的配置
2.1打开任务通知
3.程序编写
3.1定义标志位
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define BIT_1 (1<<1)
#define BIT_2 (1<<2)
/* USER CODE END PD */
3.2编写任务三和任务四——任务通知
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
osDelay(10);//消抖
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
osSignalSet(KEY_TaskHandle,BIT_1);
}
}
while(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
osDelay(10);
}
osDelay(1);
}
/* USER CODE END StartTask03 */
}
/* USER CODE END Header_StartTask04 */
void StartTask04(void const * argument)
{
/* USER CODE BEGIN StartTask04 */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == 0)
{
osDelay(10);//消抖
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == 0)
{
osSignalSet(KEY_TaskHandle,BIT_2);
}
}
while(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == 0)
{
osDelay(10);
}
osDelay(1);
}
/* USER CODE END StartTask04 */
}
3.3编写接收通知任务
/* USER CODE END Header_StartKEY_Task */
void StartKEY_Task(void const * argument)
{
/* USER CODE BEGIN StartKEY_Task */
/* Infinite loop */
osEvent event;
for(;;)
{
event = osSignalWait(BIT_1|BIT_2,osWaitForever);
if(event.value.signals & BIT_1)
{
osThreadSuspendAll();
printf("BIT_1 发生\r\n");
osThreadResumeAll();
}
if(event.value.signals & BIT_2)
{
osThreadSuspendAll();
printf("BIT_2 发生\r\n");
osThreadResumeAll();
}
osDelay(1);
}
/* USER CODE END StartKEY_Task */
}