环境:
主机: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示例7:内存管理测试
下一篇:ucos-ii示例3:互斥型信号量测试
推荐阅读
史海拾趣
面对全球化的市场竞争,Elpakco Inc公司积极实施全球化战略。公司先后在欧美、亚洲等地设立了分支机构,与当地企业开展合作,共同开拓市场。同时,公司还积极参加国际电子展会,展示公司的最新技术和产品,提升了公司的国际知名度和影响力。
近年来,随着数字化技术的快速发展,DAYLIGHT公司也积极拥抱数字化转型。公司加强了与互联网、大数据、人工智能等技术的融合,推出了一系列智能化、数字化的电子产品和服务。这些新产品和服务的推出不仅提升了DAYLIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。同时,DAYLIGHT还积极关注未来电子行业的发展趋势和技术创新,为公司的长期发展制定了明确的战略规划。
请注意,这些故事是基于假设和一般行业趋势虚构的,并不代表DAYLIGHT公司的实际发展历程。如果您需要更具体的信息,建议直接联系DAYLIGHT公司或查阅相关的行业资料。
在电子行业中,产品质量是企业生存和发展的关键。DDK公司深知这一点,因此始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测的每一个环节都严格把控,确保每一件产品都符合高标准、严要求。这种对品质的执着追求,让DDK公司的产品在市场上赢得了良好的声誉,赢得了消费者的信任和忠诚。
DDK公司自创立之初,便以技术创新为核心竞争力。公司投入大量研发资源,不断探索新的电子技术和材料,力求在激烈的市场竞争中脱颖而出。在经历了数次技术突破后,DDK公司成功研发出了一款高性能、低能耗的芯片产品,这一产品迅速在市场上获得了广泛认可,为DDK公司赢得了良好的口碑和市场份额。
自1979年成立以来,E-Switch公司始终将创新作为发展的核心动力。在公司成立初期,面对激烈的市场竞争,E-Switch决定走差异化路线,专注于开发和生产高品质的开关产品。通过不断的技术创新和产品优化,E-Switch逐渐在电子行业中树立了自己的品牌形象。
随着公司的发展,E-Switch不断推出新产品,以满足不同客户的需求。从最初的轻触开关,到后来的防破坏按钮、摇杆开关、滑动开关等多种类型,E-Switch的产品线逐渐丰富起来。同时,公司也积极拓展市场,将产品销往全球各地,进一步提升了品牌影响力。
电子测量是电子技术工作者必须掌握的一项基本技术,本书是为使初学者从零开始,快速掌握电子测量技术而编写的。本书以应用与实战为出发点,首先介绍了电子测量的基础知识,然后介绍了许多常用电子测量仪器的基本原理、使用方法与使用技巧,最后介绍 ...… 查看全部问答∨ |
在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的修改文件 我曾尝试 ...… 查看全部问答∨ |
|
将手机里的图片通过GPRS传回PC端,请教下怎么做?是在手机端和PC端都得写程序吧? 手机端写程序有什么要注意的? 还有,程序中如何调用手机的摄像功能? 谢谢了,本人新手.… 查看全部问答∨ |
老语法:set_scan_configuration -methodology full_scan新的DC已经不识别这句命令了。请问新命令是什么?查set_scan_configuration 的帮助信息查不到。并且综合报告里有个错误,请问是否和上面的语法错误有关:Information: Starting test design ...… 查看全部问答∨ |