消息队列原理ucos源码_消息队列底层原理

hacker|
118

文章目录:

嵌入式ucos ii 消息队列设计,我的代码出了些问题,求指点 ,只有20财富都给了

就如你老是所说,乱!

像任务的优先级没给出来,Sem的初始值也没给出来,系统多少ticks每秒也没给

random等这些依赖于平台的函数注释也不给个,靠别人猜么,OSSemPend这种大家都懂的函数写个注释不是多余么,不知道OSTimeDlyHMSM(0, 0, 2, 200)延时2.2s干啥?

我的想法:

(1)写成2个任务,task1优先级高于task2,task1 OSQPend(MsgQueue, 0, err)或者pend消息邮箱,然后打印数据

(2)task2生成随机数据,并周期性(比如20ms)检查按键输入,如果有那么打印数据;然后每隔250个周期往消息队列或者邮箱扔数据

uCOS-II中提供了哪些有关消息队列的操作函数,这些操作函数分别有什么作用

下面这段程序是任务一如何从任务二,和三来接收传来的数组,任务二传的是2,4两个数,任务三传的是3,5两个数,还是稍微有些疑问,请马老师点评并提出意见指点,#define MSG1 0

#define MSG2 1

char MsgBuf[3]={0};

static void AppTask1(void *p_arg)

{

char *msg;

char a,b,c,d;

INT8U err;

p_arg = p_arg;

while (TRUE) {

msg=OSQPend(QSem,0,err);

if(msg[0] (1 MSG1))

{

a=msg[1];

b=msg[2];

}

if(msg[0] (1 MSG2))

{

b= msg[1];

d=msg[2];

}

OSTimeDly(100);

static void AppTask2(void *p_arg)

{

char *msg1= MsgBuf;

INT8U err;

p_arg = p_arg;

while (TRUE){

msg1[0] |= (1 MSG1);

msg1[1]=2;

msg1[2]=4;

OSQPost(QSem,msg1);

OSTimeDly(3);

}

}

static void AppTask3(void *p_arg)

{

char *msg2=MsgBuf;

INT8U err;

p_arg = p_arg;

while (TRUE){

msg2[0] |= (1 MSG2);

msg2[1]=3;

msg2[2]=5;

OSQPost(QSem, msg2);

OSTimeDly(3);

}

}

现在还有个疑问就是在任务一中我的a,b,c,d,是不是任务二,三发来的2,4;3,5;

什么是UCOS操作系统?

u C / O S 是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。

μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。

μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。

严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。

uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。

任务管理

uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。

uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。

系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,改任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,改任务负责统计当前cpu的利用率。

时间管理

uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。

uC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。

内存管理

在ANSI C中是使用malloc和free两个函数来动态分配和释放内存。但在嵌入式实时系统中,多次这样的错作会导致内存碎片,且由于内存管理算法的原因,malloc和free的执行时间也是不确定。

uC/OS-II中把连续的大快内存按分区管理。每个分区中包含整数个大小相同的内存块,但不同分区之间的内存快大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。

任务间通信与同步

对一个多任务的操作系统来说,任务间的通信和同步是必不可少的。uC/OS-II中提供了4中同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,发送,查询的接口用于实现进程间的通信和同步。

任务调度

uC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。

uC/os-II的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,uC/OS-II规定所有任务的优先级不同,因为任务的优先级也同时唯一标志了该任务本身。

任务调度将在以下情况下发生:

1) 高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。

2) 高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。

这两种调度方式在uC/OS-II的执行过程中非常普遍,一般来说前者发生在系统服务中,后者发生在时钟中断的服务程序中。

调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。其最高优先级任务的寻找是通过建立就绪任务表来实现的。u C / O S 中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块TCB(Task Control Block)的数据结构,其中第一个成员变量就是保存的任务堆栈指针。任务调度模块首先用变量OSTCBHighRdy 记录当前最高级就绪任务的TCB 地址,然后调用OS_TASK_SW()函数来进行任务切换。

μC/OS-II的组成部分

μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。

1) 核心部分(OSCore.c)

是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。

2) 任务处理部分(OSTask.c)

任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。

3) 时钟部分(OSTime.c)

μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。

4) 任务同步和通信部分

为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。

5) 与CPU的接口部分

是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。

ucos-ii消息队列

通过指针获得该结构体,通过“地址”发送结构体

1、发送消息如下:

addr = pMsg;

OSQPost(xxxxxxxxxxxx, addr);

其中,addr——INT32U类型变量;pMsg——是你的结构体变量;xxxxxxxxxx——你的消息队列

2、接收消息方法如下:

STRU_MSG * msgRcvd; // 创建一个结构体类型的指针

msgRcvd = (STRU_MSG *)OSQPend(xxxxxxxxxxxx,m_Com_usTaskTimeOutTicks,ucOSError);

//强制转换成结构体类型

然后,*msgRcvd 就是刚才过来的结构体了

ucos和linux区别,联系。学了ucos再学linux会不会有帮助。。。(嵌入式初学者)

区别:ucos有执行效率高、占用空间小、实时性和可扩展性强等特点,linux有稳定性、强大网络功能和出色的文件系统等优点。

联系:是两种性能优良源码公开且被广泛应用的的免费嵌入式操作系统,可以作为研究实时操作系统和非实时操作系统的典范。

μC/OS II(Micro-Controller Operating System Two)是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,适合很多商业操作系统性能相当的实时操作系统(RTOS)。

μC/OS II可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。

内核属于抢占式,最多可以管理60个任务。从1992年开始,由于高度可靠性、鲁棒性和安全性,μC/OS II已经广泛使用在从照相机到航空电子产品的各种应用中。

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。

3条大神的评论

  • avatar
    访客 2022-07-03 下午 04:12:21

    理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。这两种调度方式在uC/OS-II的执行过程中非常普遍,一般来说前

  • avatar
    访客 2022-07-03 下午 03:37:53

    主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。2) 高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优

  • avatar
    访客 2022-07-03 下午 08:51:42

    体变量;xxxxxxxxxx——你的消息队列2、接收消息方法如下:STRU_MSG * msgRcvd; // 创建一个结构体类型的指针msgRcvd = (STRU_MSG *)OSQPend(xxxxxxxxxxxx,m_Com_usTaskTimeOutTicks,ucOSError

发表评论