ucossii队列_UCOSII使用之消息队列

本文通过一个示例详细介绍了如何在UCOSII操作系统中使用消息队列。首先,初始化内核并创建任务,然后创建信号量和消息队列。任务task1不断接收并显示来自消息队列的任务2发送的时间戳信息。任务task2每隔一定时间向消息队列发送当前时间戳,并更新消息数组。整个过程展示了UCOSII中任务间的通信和同步机制。
摘要由CSDN通过智能技术生成

#define TASK_STK_SIZE 512

/*********************************************************************

* 静态函数

**********************************************************************/

static void task_start(void *pdata);static void task1(void *pdata);static void task2(void *pdata);/*********************************************************************

* 静态变量

**********************************************************************/

/*********************************************************************

* 任务堆栈空间

**********************************************************************/

staticOS_STK Task_Start_Stk[TASK_STK_SIZE];staticOS_STK Task1_Stk[TASK_STK_SIZE];staticOS_STK Task2_Stk[TASK_STK_SIZE];/*********************************************************************

* 信号量

**********************************************************************/OS_EVENT*Semaphore;/*********************************************************************

* 消息队列数组

**********************************************************************/

void *Msg_Group[10];char Msg_Arr[10][30];

uint8_t Index_Msg_Arr= 0;/*********************************************************************

* 函数

**********************************************************************/

int main(void)

{//初始化内核

OSInit();//创建任务

OSTaskCreate(task_start,(void *)0,Task_Start_Stk + TASK_STK_SIZE - 1,10);//启动任务

OSStart();

}/*********************************************************************

* 任务函数

**********************************************************************/

static void task_start(void *pdata)

{//载入世界

world_load();//设置背景色

GUI_SetBkColor(0xb07c17);

GUI_Clear();

GUI_SetColor(GUI_BLACK);

Semaphore= OSQCreate(Msg_Group,10);//新建任务

OSTaskCreate(task1,(void *)0,Task1_Stk + TASK_STK_SIZE - 1,11);

OSTaskCreate(task2,(void *)0,Task2_Stk + TASK_STK_SIZE - 1,12);while(1)

{

OSTimeDlyHMSM(0,0,3,0);

}

}static void task1(void *pdata)

{char str[30] = {0};

uint8_t err= 0;char *mail;

uint8_t i= 0;

OS_Q_DATA query;while(1)

{//打印接收的消息

OSQQuery(Semaphore,&query);for (i = 0;i < query.OSNMsgs;i++)

{//请求信号量

mail = OSQPend(Semaphore,0,&err);//显示

sprintf(str,"task1 receive:%s",mail);

GUI_DispStringHCenterAt(str,120, 40 + i * 20);

}//显示

sprintf(str,"task1 time:%ds",OSTimeGet());

GUI_DispStringHCenterAt(str,120, 5);

WM_Exec();

OSTimeDlyHMSM(0,0,8,0);

}

}static void task2(void *pdata)

{char str[30] = {0};while(1)

{//显示

sprintf(*(Msg_Arr + Index_Msg_Arr),"task2 send:%ds",OSTimeGet());//发送信号量

OSQPost(Semaphore,*(Msg_Arr +Index_Msg_Arr));

Index_Msg_Arr++;if (Index_Msg_Arr >= 10)

{

Index_Msg_Arr= 0;

}//显示

sprintf(str,"task2 time:%ds",OSTimeGet());

GUI_DispStringHCenterAt(str,120, 20);

WM_Exec();

OSTimeDlyHMSM(0,0,1,0);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值