FREERTOS学习笔记九-邮件
1.实验内容
邮件和消息队列类似,不过邮箱可以发送更多类型的数据,如结构体。
本次实验是在实验三的基础上进行修改,其中任务三负责检测按键并发送结构体,任务四负责接收邮件。
2.CubeMX的配置
FREERTOS已经有相关的封装函数,无需增加配置。
3.程序编写
3.1定义测试结构体
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef struct
{
uint32_t var1;
uint32_t var2;
uint8_t var3;
}Amail_TypeDef;
/* USER CODE END PTD */
3.2创建邮件
/* USER CODE BEGIN Init */
osMailQDef(mail,16,Amail_TypeDef);
osMailQId myosMailQid = osMailCreate(osMailQ(mail),NULL);
/* USER CODE END Init */
3.3发送邮件
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
Amail_TypeDef *pTMail;
uint16_t value1 = 1,value2 = 2;
uint8_t value3 = 3;
for(;;)
{
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
osDelay(10);//消抖
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
pTMail = osMailAlloc(myosMailQid,osWaitForever);//获取邮件地址
pTMail->var1=value1;
pTMail->var2=value2;
pTMail->var3=value3;
if(osMailPut(myosMailQid,pTMail) == osOK)//发送邮件
{
value1+=1;
value2+=2;
value3+=3;
osThreadSuspendAll();
printf("Send Sucessfully\r\n");
osThreadResumeAll();
}
}
}
while(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
osDelay(10);
}
osDelay(1);
}
/* USER CODE END StartTask03 */
}
3.4接收邮件
/* USER CODE END Header_StartTask04 */
void StartTask04(void const * argument)
{
/* USER CODE BEGIN StartTask04 */
/* Infinite loop */
osEvent event;
Amail_TypeDef *pTMail;
for(;;)
{
event = osMailGet(myosMailQid,osWaitForever);
if(event.status == osEventMail)
{
pTMail = event.value.p;
osThreadSuspendAll();
printf("Receive Sucessfully\r\n");
printf("var1:%d var2:%d var3:%d\r\n",pTMail->var1,pTMail->var2,pTMail->var3);
osThreadResumeAll();
}
osDelay(1);
}
/* USER CODE END StartTask04 */
}