历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2020年10月12日 | ucos-ii示例5:消息队列测试

发布者:大伊山人 来源: eefocus关键字:ucos-ii  消息队列测试  stm32f103VE 手机看文章 扫描二维码
随时随地手机看文章

环境:

主机:WIN8

开发环境:MDK4.72

ucgui版本:3.90

ucos版本:ucos-ii

mcu: stm32f103VE


说明:

本示例中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);

}

}


关键字:ucos-ii  消息队列测试  stm32f103VE 引用地址:ucos-ii示例5:消息队列测试

上一篇:ucos-ii示例7:内存管理测试
下一篇:ucos-ii示例3:互斥型信号量测试

推荐阅读

通过引导式测试设置和自动化驱动测量,提供可靠、可重复性测试结果,有效简化复杂的电机驱动故障诊断。 全新Fluke MDA 510 和 MDA 550电机驱动分析仪不仅显著节省时间,而且还简化了复杂的测量设置和故障排查。只需简单选择一个测试任务,然后测量向导即可逐步提示如何完成电压和电流连接;预设测量配置文件则可确保采集所有电机驱动数据,包括...
自来水流量计的安装安装需要注意以下要求:(1)保证设备安装的地点没有剧烈的温差,保证有良好的通风环境,避免与强烈的腐蚀气体接触。(2)不可以安装在容易引起电磁干扰的环境下,否则会引起测量精度误差。(3)安装时被测液体的流向一定要与自来水流量计箭头标记一致,如果发现流量与标记不一致,主要是180度方向相反,此时则需要修改流量计参数设置反...
  台式万用表如何修理  1、通过外部的设备情况判断台式万用表是否出现故障,比如外观检查,观察有没有脱线。断线、脱焊、烧坏元件等,或者是机械损伤或是断裂等一些情况进行判断。这时候可以戴上绝缘手套,直接用手检查元件,勘察有诶有出现松动,之后再转换开关,判断是否卡带。  2、通过测量各个部位的用电参数,例如电压、电流、电阻等参数,因为...
外部复位由外加于RESET 引脚的低电平产生。当复位低电平持续时间大于最小脉冲宽度时( 参见Table 15) 即触发复位过程,即使此时并没有时钟信号在运行。当外加信号达到复位门限电压VRST( 上升沿) 时, tTOUT 延时周期开始。延时结束后MCU 即启动。

史海拾趣

问答坊 | AI 解惑

从零开始学电子测量技术

电子测量是电子技术工作者必须掌握的一项基本技术,本书是为使初学者从零开始,快速掌握电子测量技术而编写的。本书以应用与实战为出发点,首先介绍了电子测量的基础知识,然后介绍了许多常用电子测量仪器的基本原理、使用方法与使用技巧,最后介绍 ...…

查看全部问答∨

关于PWM驱动的一点问题

在PWM初始化函数中,有这样一段定义,请问在整个函数中的作用是什么呢? PUBLIC DWORD PWM_Init(DWORD dwContext) {         PROCESSOR_INFO procInfo;         DWORD dwBytesReturned;     ...…

查看全部问答∨

请大家指点指点我,谢谢

    本人大二,电子信息工程专业,大一基础不好,想在想学好,我该怎么做,看什么书?电路分析这学期才学,但很难,有什么学习方法没有?我想成为计算机全能,请问可能吗?…

查看全部问答∨

急求wince5.0 中如何生成 Catalog的.cec文件???

刚买到一款带有驱动的USB无线网卡(CE下的驱动,我用的是ce5.0版本的), 里面的带有很多文件 RT2501USB.dll  RT2501USB.map RT2501USB.rel  rt2501USB.pdb  rt73.bin以及注册表修改文件和BIB的修改文件 我曾尝试 ...…

查看全部问答∨

第一次用DS

我装了个xp.ddk和一个driver stdio后. 编译VdxLibs.dsw不通过. 怎么改都不行. 没办法只好装了个2k.ddk和driver stdio后.编译VdxLibx.dsw通过了. 报错误和警告为0. 但还是有几十条如下提示: c:\\program files\\numega\\driverstudio\\driverworks\ ...…

查看全部问答∨

ArmV6 编译问题

有哪位大虾知道 那个编译器可以编译Armv6的GNU asm代码。目前cegcc看来是不行的,只能编译Armv4 …

查看全部问答∨

platform builder 6.0可以开发wince5.0吗

电脑上没有安装PB5.0,想用6.0来开发wince5.0不知道可以没。…

查看全部问答∨

有关GPRS开发的问题,请教下各位高手

将手机里的图片通过GPRS传回PC端,请教下怎么做?是在手机端和PC端都得写程序吧? 手机端写程序有什么要注意的? 还有,程序中如何调用手机的摄像功能? 谢谢了,本人新手.…

查看全部问答∨

DC的一个小问题提问

老语法:set_scan_configuration -methodology full_scan新的DC已经不识别这句命令了。请问新命令是什么?查set_scan_configuration 的帮助信息查不到。并且综合报告里有个错误,请问是否和上面的语法错误有关:Information: Starting test design ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved