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

下载本文档

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

文档简介

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

任务描述

在LiteOS中创建两个任务,一个是写消息任务,另一个是读消息任务。两个任务独立运行,按下KEY1键时向消息队列中写入消息,按下KEY2键时从消息队列中读出消息。

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

任务4-2消息队列使用(带复制读写方式)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-2消息队列使用(带复制读写方式)60/*USERCODEBEGIN0*/61/*定义任务ID变量*/62UINT32Receive_Task_Handle;63UINT32Send_Task_Handle;64

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

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

/*写消息队列需要用到的全局变量*/70UINT32send_data,i=1;71

/************************************************************72*@函数名:Receive_Task73*@功能说明:Receive_Task任务实现74*@参数:无75*@返回值:无76***********************************************************/

任务4-2消息队列使用(带复制读写方式)77

static

voidReceive_Task(void)78

{79

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

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

while(1)85

{86buffsize=10;87

/*KEY2键被按下*/88

if(

!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5))

89

{90

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

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

&r_queue,

/*读取(接收)的数据保存位置*/93

&buffsize,

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

/*等待时间:一直等*/

任务4-2消息队列使用(带复制读写方式)95LOS_TaskDelay(500);

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

if(LOS_OK==uwRet)97

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

}100

else101

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

}104

}105

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

107

}108}109/***********************************************************110*@函数名:Send_Task111*@功能说明:Send_Task任务实现112*@参数:无113*@返回值:无114***********************************************************/

任务4-2消息队列使用(带复制读写方式)115static

voidSend_Task(void)116{117

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

119

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

while(1)121

{122

/*KEY1键被按下*/123

if(

!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4))

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

{125send_data=i;126

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

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

&(send_data),

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

sizeof(send_data),

/*数据的长度*/130

0);

/*等待时间为0*/131

if(LOS_OK==uwRet)132

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

}135

else

任务4-2消息队列使用(带复制读写方式)136

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

}139LOS_TaskDelay(500);

//等待松手,延时防松手抖动140i++;141

}

142

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

144

}145}2)定义任务创建函数Creat_Receive_Task()和Creat_Send_Task()。146/**********************************************************147*@函数名:Creat_Receive_Task148*@功能说明:创建Receive_Task任务149*@参数:

150*@返回值:无151**********************************************************/152staticUINT32Creat_Receive_Task()

任务4-2消息队列使用(带复制读写方式)153{154

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

156

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

158task_init_param.usTaskPrio=

5;

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

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

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

1024;

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

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

returnuwRet;164}165/************************************************************166*@函数名:Creat_Send_Task167*@功能说明:创建Send_Task任务168*@参数:无169*@返回值:无170***********************************************************/

任务4-2消息队列使用(带复制读写方式)171staticUINT32Creat_Send_Task()172{173

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

175TSK_INIT_PARAM_Stask_init_param;176task_init_param.usTaskPrio=

4;

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

"Send_Task";

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

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

1024;

/*堆栈大小*/

180uwRet=LOS_TaskCreate(&Send_Task_Handle,

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

returnuwRet;182}

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

任务4-2消息队列使用(带复制读写方式)183/*************************************************************184*@函数名:AppTaskCreate185*@功能说明:任务创建,为了方便管理,所有的任务创建函数都可以放在这个函数里面186*@参数:无187*@返回值:无188************************************************************/189staticUINT32AppTaskCreate(void)190{191

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

193

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

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

/*队列的长度*/196

&Test_Queue_Handle,

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

0,

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

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

if

(uwRet!=LOS_OK)200

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

returnuwRet;203

}

任务4-2消息队列使用(带复制读写方式)204uwRet=Creat_Receive_Task();205

if

(uwRet!=LOS_OK)206

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

returnuwRet;209

}210uwRet=Creat_Send_Task();211

if

(uwRet!=LOS_OK)212

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

returnuwRet;215

}216

returnLOS_OK;217}218/*USERCODEEND0*/

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

任务4-2消息队列使用(带复制读写方式)224intmain(void)225{226

/*USERCODEBEGIN1*/227

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

229

/*USERCODEEND1*/230

/*MCUConfiguration---------------------------------------*/231

/*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/232HAL_Init();233

/*Configurethesystemclock*/234SystemClock_Config();235

/*Initializeallconfiguredperipherals*/236MX_GPIO_Init();237MX_USART1_UART_Init();238MX_USART2_UART_Init();239MX_USART3_UART_Init();240

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

任务4-2消息队列使用(带复制读写方式)242

if

(uwRet!=LOS_OK)243

{244printf("LiteOS内核初始化失败!失败代码0x%X\n",uwRet);

温馨提示

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

评论

0/150

提交评论