UCOSII使用之消息队列

摘要:
1消息队列描述:在本例中,task1的时间片是1s,task2的时间片为8s。任务1每秒向消息队列写入1个数据,任务2读取所有数据。
1消息队列

说明:

本示例中task1时间片为1s,task2时间片为8s。task1每秒往消息队列写入1个数据,task2全部读取出来。所以task2每次能读到8个数据。

 注意:

1.消息队列需要一个指针数组指向消息

2.应该有一个固定的消息数组存储消息,不应将局部变量填入发送消息函数

3.QSQPost为先进先出函数(FIFO),QSQPostFornt为后进先出函数(LIFO)

#define TASK_STK_SIZE        512
                
/*********************************************************************
*                            静态函数
**********************************************************************/

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

/*********************************************************************
*                            静态变量
**********************************************************************/

/*********************************************************************
*                            任务堆栈空间
**********************************************************************/

static OS_STK Task_Start_Stk[TASK_STK_SIZE];
static OS_STK Task1_Stk[TASK_STK_SIZE];
static OS_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);
    }
}
 2信号量集

本示例中task2设置信号量集的最后2位为1,task1读取最后2位,发现是1则显示

来源

#define TASK_STK_SIZE        512
                
/*********************************************************************
*                            静态函数
**********************************************************************/

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

/*********************************************************************
*                            静态变量
**********************************************************************/

/*********************************************************************
*                            任务堆栈空间
**********************************************************************/

static OS_STK Task_Start_Stk[TASK_STK_SIZE];
static OS_STK Task1_Stk[TASK_STK_SIZE];
static OS_STK Task2_Stk[TASK_STK_SIZE];

/*********************************************************************
*                            信号量集
**********************************************************************/

OS_FLAG_GRP *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)
{    
    uint8_t err = 0;
    
    //载入世界
    world_load();
    
    //设置背景色
    GUI_SetBkColor(0xb07c17);
    GUI_Clear();
    GUI_SetColor(GUI_BLACK);
    
    //信号量集初始化为0
    Semaphore = OSFlagCreate((OS_FLAGS)0,&err);
    
    //新建任务
    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;

    while(1)
    {
        //等待信号集满足条件
        OSFlagPend(Semaphore,(OS_FLAGS)0x3,OS_FLAG_WAIT_SET_ALL | OS_FLAG_CONSUME,0,&err);
        
        //显示
        sprintf(str,"task1 time:%ds",OSTimeGet());
        GUI_DispStringHCenterAt(str, 120, 5);
        WM_Exec();
        OSTimeDlyHMSM(0,0,1,0);
    }
}

static void task2(void *pdata)
{
    char str[30] = {0};
    uint8_t err = 0;

    while(1)
    {
        //将末两位置1
        OSFlagPost(Semaphore,(OS_FLAGS)0x3,OS_FLAG_SET,&err);
        
        //将最后1位置1
        //OSFlagPost(Semaphore,(OS_FLAGS)0x1,OS_FLAG_SET,&err);
        
        //显示
        sprintf(str,"task2 time:%ds",OSTimeGet());
        GUI_DispStringHCenterAt(str, 120, 20);
        WM_Exec();
        OSTimeDlyHMSM(0,0,3,0);
    }
}

免责声明:文章转载自《UCOSII使用之消息队列》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇开源分布式任务调度平台Cuckoo-Schedule一个Tomcat 如何部署多个项目?附多种解决方案及详细步骤!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java动手实验及课后程序

课后作业 一、编写程序,消息框显示计算结果 设计思想:导入Scanner包,使用JOptionPane类来实现消息框的输入和结果的显示。 程序代码: package com; import java.util.Scanner; //导入Scanner包 import javax.swing.JOptionPane; public class Manner ...

RocketMQ的消息发送及消费

RocketMQ消息支持的模式: 消息支持的模式分为三种:NormalProducer(普通同步),消息异步发送,OneWay。 消息同步发送: 普通消息的发送和接收在前面已经演示过了,在前面的案例中是基于同步消息发送模式。也就是说消息发送出去后,producer会等到broker回应后才能继续发送下一个消息. 消息异步发送: 异步发送是指发送方发出数据后...

玩转ptrace

下面是转帖的内容,写的很详细。但是不同的linux发行版中头文件的路径和名称并不相同。如在某些发行版中<linux/user.h>就不存在,其中定义的变量出现在<asm/ptrace-abi.h>和<sys/user.h>中。关于调试器技术的资料在网上是很少,即便是UNIX编程巨著《UNIX环境高级编程》中,相关内容也不...

Kafka入门学习(一)

用简单的话来说,你可以把Kafka当作可顺序写入的一大卷磁带, 可以随时倒带,快进到某个时间点重放。 ====常用开源分布式消息系统 *集群:多台机器组成的系统叫集群。 *ActiveMQ还是支持JMS的一种消息中间件。 *阿里巴巴metaq,rocketmq都有kafka的影子。 *kafka的动态扩容目前是通过zookeeper来完成的。 ====...

[Android Security] 静态分析Android程序——smali文件解析

cp : https://blog.csdn.net/hp910315/article/details/51823236 cp : http://www.jb51.net/softjc/119036.html 静态分析Android程序的两种方法: 一、阅读反编译生成的Dalvik字节码。 1、使用文本编辑器阅读baksmali反编译生成的smali文件...

持续集成 TeamCity 的配置与使用

环境:实现自动编译与自动化测试,发布到远程服务器,环境 VS2015 +WIN2008R2 什么是TeamCityTeamCity是由Jetbrains开发的一款功能强大的持续集成(Continue Integration)工具,包括服务器端和客户端,目前支持Java,.Net 等项目开发。 TeamCity提供一系列特性可以让团队快速实现持续继承:IDE...