任务4-1 消息队列使用(不带复制读写方式)_第1页
任务4-1 消息队列使用(不带复制读写方式)_第2页
任务4-1 消息队列使用(不带复制读写方式)_第3页
任务4-1 消息队列使用(不带复制读写方式)_第4页
任务4-1 消息队列使用(不带复制读写方式)_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务4-1消息队列使用(不带复制读写方式)Task4-1UsingMessageQueue(withoutcopymode)《物联网操作系统技术与应用》制作人张亚军

任务描述

在LiteOS中创建两个任务,一个是写消息任务,另一个是读消息任务。两个任务独立运行。写消息任务检测按键的按下情况,按下KEY1键时向消息队列中写入一条消息,按下KEY2键时向消息队列中写入另一条消息;读消息任务一直等待消息的到来,当读取成功时,将读出的数据通过串口输出。

任务实现1.打开第2章中移植好LiteOS的裸机工程TEST,修改main.c文件,添加头文件。

任务4-1消息队列使用(不带复制读写方式)26

/*USERCODEBEGINIncludes*/27

/*LiteOS头文件*/28#include"los_sys.h"29#include"los_task.ph"30#include"los_queue.h"31

/*USERCODEENDIncludes*/2.定义任务ID变量、消息队列ID变量、消息队列长度、消息节点长度以及全局变量。3.创建和管理读消息任务Receive_Task和写消息任务Send_Task。1)定义任务实现函数Receive_Task()和Send_Task()。

任务4-1消息队列使用(不带复制读写方式)60/*USERCODEBEGIN0*/61/*定义任务ID变量*/62UINT32Receive_Task_Handle;63UINT32Send_Task_Handle;64

/*定义消息队列的ID*/65UINT32Test_Queue_Handle;66

/*定义消息队列长度*/67#defineTEST_QUEUE_LEN1068#defineTEST_QUEUE_SIZE1069

/*写消息队列需要用到的全局变量*/70UINT32send_data1=1;71UINT32send_data2=2;72

/************************************************************73*@函数名:Receive_Task74*@功能说明:Receive_Task任务实现75*@参数:无76*@返回值:无77***********************************************************/

任务4-1消息队列使用(不带复制读写方式)78

static

voidReceive_Task(void)79

{80

/*定义一个返回类型变量,初始化为LOS_OK*/81UINT32uwRet=LOS_OK;82UINT32r_queue;83UINT32buffsize=10;84

/*任务都是一个无限循环,不能返回*/85

while(1)86

{87

/*队列读取(接收),等待时间为一直等待*/88uwRet=LOS_QueueRead(Test_Queue_Handle,

/*读取(接收)队列的ID(句柄)*/89

&r_queue,

/*读取(接收)的数据保存位置*/90buffsize,

/*读取(接收)的数据的长度*/91LOS_WAIT_FOREVER);

/*等待时间:一直等*/92LOS_TaskDelay(500);

93

if(LOS_OK==uwRet)94

{95printf("本次从消息队列中读出的数据是:%d,读出数据的长度是:%d\n",*(UINT32*)r_queue,buffsize);96

}97

else98

{99printf("数据接收出错,错误代码0x%X\n",uwRet);

任务4-1消息队列使用(不带复制读写方式)100

}101

/*20ms扫描一次*/102LOS_TaskDelay(20);

103

}104}105/************************************************************106*@函数名:Send_Task107*@功能说明:Send_Task任务实现108*@参数:无109*@返回值:无110***********************************************************/111static

voidSend_Task(void)112{113

/*定义一个返回类型变量,初始化为LOS_OK*/114UINT32uwRet=LOS_OK;

115

/*任务都是一个无限循环,不能返回*/116

while(1)117

{118

/*KEY1键被按下*/119

if(

!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4))

//读取KEY按键引脚,低电平表示按下120

{

任务4-1消息队列使用(不带复制读写方式)121

/*将数据写入(发送)到队列中,等待时间为0*/122uwRet=LOS_QueueWrite(Test_Queue_Handle,

/*写入(发送)队列的ID(句柄)*/123

&(send_data1),

/*写入(发送)的数据*/124

sizeof(send_data1),

/*数据的长度*/125

0);

/*等待时间为0*/126

if(LOS_OK==uwRet)127

{128printf("本次写入消息队列的数据是:%d\n",send_data1);129

}130

else131

{132printf("数据不能发送到消息队列!错误代码0x%X\n",uwRet);133

}134LOS_TaskDelay(500);

//等待松手,延时防松手抖动135

}

136

/*KEY2键被按下*/137

if(

!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5))

//读取KEY按键引脚,低电平表示按下138

{139

/*将数据写入(发送)到队列中,等待时间为0*/

任务4-1消息队列使用(不带复制读写方式)140uwRet=LOS_QueueWrite(Test_Queue_Handle,

/*写入(发送)队列的ID(句柄)*/141

&(send_data2),

/*写入(发送)的数据*/142

sizeof(send_data2),

/*数据的长度*/143

0);

/*等待时间为0*/144

if(LOS_OK==uwRet)145

{146printf("本次写入消息队列的数据是:%d\n",send_data2);147

}148

else149

{150printf("数据不能发送到消息队列!错误代码0x%X\n",uwRet);151

}152LOS_TaskDelay(500);

//等待松手,延时防松手抖动153

}

154

/*20ms扫描一次*/155LOS_TaskDelay(20);

156

}157}2)定义任务创建函数Creat_Receive_Task()和Creat_Send_Task()。

任务4-1消息队列使用(不带复制读写方式)158/***********************************************************159*@函数名:Creat_Receive_Task160*@功能说明:创建Receive_Task任务161*@参数:

162*@返回值:无163**********************************************************/164staticUINT32Creat_Receive_Task()165{166

//定义一个返回类型变量,初始化为LOS_OK167UINT32uwRet=LOS_OK;

168

//定义一个用于创建任务的参数结构体169TSK_INIT_PARAM_Stask_init_param;

170task_init_param.usTaskPrio=

5;

/*任务优先级,数值越小,优先级越高*/171task_init_param.pcName=

"Receive_Task";/*任务名*/172task_init_param.pfnTaskEntry=

(TSK_ENTRY_FUNC)Receive_Task;/*任务函数入口*/173task_init_param.uwStackSize=

1024;

/*堆栈大小*/174uwRet=LOS_TaskCreate(&Receive_Task_Handle,

&task_init_param);/*创建任务*/175

returnuwRet;176}

任务4-1消息队列使用(不带复制读写方式)177/************************************************************178*@函数名:Creat_Send_Task179*@功能说明:创建Send_Task任务180*@参数:

181*@返回值:无182**********************************************************/183staticUINT32Creat_Send_Task()184{185

//定义一个返回类型变量,初始化为LOS_OK186UINT32uwRet=LOS_OK;

187TSK_INIT_PARAM_Stask_init_param;188task_init_param.usTaskPrio=

4;

/*任务优先级,数值越小,优先级越高*/189task_init_param.pcName=

"Send_Task";

/*任务名*/190task_init_param.pfnTaskEntry=

(TSK_ENTRY_FUNC)Send_Task;/*任务函数入口*/191task_init_param.uwStackSize=

1024;

/*堆栈大小*/

192uwRet=LOS_TaskCreate(&Send_Task_Handle,

&task_init_param);/*创建任务*/193

returnuwRet;194}

3)定义任务管理函数AppTaskCreate()。

任务4-1消息队列使用(不带复制读写方式)195/***********************************************************196*@函数名:AppTaskCreate197*@功能说明:任务创建,为了方便管理,所有的任务创建函数都可以放在这个函数里面198*@参数:无199*@返回值:无200***********************************************************/201staticUINT32AppTaskCreate(void)202{203

/*定义一个返回类型变量,初始化为LOS_OK*/204UINT32uwRet=LOS_OK;

205

/*创建一个测试队列*/206uwRet=LOS_QueueCreate("Test_Queue",

/*队列的名称*/207TEST_QUEUE_LEN,

/*队列的长度*/208

&Test_Queue_Handle,

/*队列的ID(句柄)*/209

0,

/*队列模式,官方暂时未使用*/210TEST_QUEUE_SIZE);

/*节点大小,单位为字节*/211

if

(uwRet!=LOS_OK)212

{213printf("Test_Queue队列创建失败!失败代码0x%X\n",uwRet);214

returnuwRet;215

}

任务4-1消息队列使用(不带复制读写方式)216uwRet=Creat_Receive_Task();217

if

(uwRet!=LOS_OK)218

{219printf("Receive_Task任务创建失败!失败代码0x%X\n",uwRet);220

returnuwRet;221

}222uwRet=Creat_Send_Task();223

if

(uwRet!=LOS_OK)224

{225printf("Send_Task任务创建失败!失败代码0x%X\n",uwRet);226

returnuwRet;227

}228

returnLOS_OK;229}230/*USERCODEEND0*/

4.在主函数中修改代码。

任务4-1消息队列使用(不带复制读写方式)236intmain(void)237{238

/*USERCODEBEGIN1*/239

//定义一个返回类型变量,初始化为LOS_OK240UINT32uwRet=LOS_OK;

241

/*USERCODEEND1*/242

/*MCUConfiguration---------------------------------------*/243

/*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/244HAL_Init();245

/*Configurethesystemclock*/246SystemClock_Config();247

/*Initializeallconfiguredperipherals*/248MX_GPIO_Init();249MX_USART1_UART_Init();250MX_USART2_UART_Init();251MX_USART3_UART_Init();

任务4-1消息队列使用(不带复制读写方式)252

/*LiteOS内核初始化*/253uwRet=LOS_KernelInit();

254

if

(uwRet!=LOS_OK)255

{256printf("L

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论