ucos消息队列通信

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式实时操作系统实验报告《实验三消息队列与任务间通信》

班级嵌入式11002班

姓名朱杰

学号1004681224

指导教师谢治平

一实验要求

本次通过设计两个实验任务,了解嵌入式实时操作系统µC/OS-II中消息队列机制的基本原理和使用方法。

二实验目的

掌握嵌入式实时操作系统µC/OS-II中消息队列机制的基本原理和使用方法。

三操作系统配置

#define OS_MAX_TASKS 3

/*最多可以创建3个任务*/

#define OS_LOWEST_PRIO 16

/*任务优先级不可以大于14*/

#define OS_TASK_CREATE_EN 1

/*允许使用OSTaskCreate()*/

#define OS_TASK_SUSPEND_EN 1

/*允许使用OSTaskSuspend() and OSTaskResume()*/

四.µC/OS-II相关函数

OSTaskCreate():建立一个新任务

OSQCreate():建立一个消息队列

OSQPend():等待消息

OSQPostFront() :向消息队列发送消息

OSQPost():向消息队列发送消息

五相关系统调用

·OSTaskCreate():建立一个新任务

·OSTaskSuspend():无条件挂起一个任务

·OSTaskResume():唤醒一个挂起的任务

·OSTimeDly():将一个任务延时若干个时钟节拍

六应用任务

实验设计I

(1)设计I要求

●通过消息队列在任务间传递数据:

任务TA1以随机(或固定)时间间隔依次将数据1、2、3、...发送至消息队列q1,每次发送一个数据。

TA2以随机(或固定)时间间隔将随机数据发送至q1。

TA3从消息队列q1中每次接收一个数据:

如果数据来自TA1,则计算出所有已接收的来自TA1的数据之和,然后延时;

如果数据来自TA2,则将数据输出到屏幕,然后延时(模拟处理数据所需的时间);

●调整发送数据和处理数据的速度,观察发送速度大于处理速度的结果

(2)实验代码

#include "../ucos-ii/includes.h" /* uC/OS interface */

#include "string.h"

//#include "includes.h"

#define TASK_STK_SIZE 512

#define N_MESSAGES 128

OS_STK TaskStartStk[TASK_STK_SIZE]; /* TaskStart任务堆栈*/ OS_STK TA1Stk[TASK_STK_SIZE];

OS_STK TA2Stk[TASK_STK_SIZE];

OS_STK TA3Stk[TASK_STK_SIZE];

OS_EVENT *Str_Q;

void TaskStart(void *data);

void TA1(void *pdata);

void TA2(void *pdata);

void TA3(void *pdata);

INT8U err;

INT8U total=0;

charbuf[128];

void * ql[N_MESSAGES] ;

typedefstruct{

int list;

intnum;

}Mess;

void Main(void)

{

//Target_Init();

ARMTargetInit();

OSInit();

Str_Q=OSQCreate(&ql[0],N_MESSAGES);

OSTaskCreate(TaskStart,(void*)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);

ARMTargetStart();

OSStart();

while(1);

}

voidTaskStart(void *pdata){

OSTaskCreate(TA1,(void*)0, &TA1Stk[TASK_STK_SIZE - 1],1); /* 创建任务TA1 */ OSTaskCreate(TA2,(void*)0, &TA2Stk[TASK_STK_SIZE - 1],2); /* 创建任务TA2 */ OSTaskCreate(TA3,(void*)0, &TA3Stk[TASK_STK_SIZE - 1],3); /* 创建任务TA3 */

while(1)

OSTimeDly(1000);

}

void TA1(void *pdata){

INT8U err;

for(;;){

INT32U t;

INT32U r;

Mess mess;

t = OSTime;

r = srand(t);

mess.list=1;

mess.num=3;

OSQPostFront(Str_Q,&mess);

sprintf(buf, "TA1 post\n");

armulPrintf(buf);

OSTimeDlyHMSM(0,0,2,0);

}

}

void TA2(void *pdata){

for(;;){

INT32U t;

INT32U r;

Mess mess;

t = OSTime;

r = srand( t );

mess.list=2;

mess.num=2;

相关文档
最新文档