C/OS-III 学习笔记(8)

多值信号量和和互斥信号量主要用来标志事件是否发生和协调资源的访问。如果要给资源赋予内容进行传递,信号量就力有所不及了。这时候就需要用到uC/OS操作系统的另一个内核机制了,那就是消息队列。

一则消息包含几个部分:指向数据的指针,表明数据长度的变量和记录消息发布时刻的时间戳。指针指向的可以是一块数据区或者甚至是一个函数。显然,发布方和接收方需要对数据的内容和含义达成约定。

举个例子,一个以太网控制器收到一个数据包并将指向数据包的指针发布给一个任务,那么该任务就需要知道如何来处理数据包。

消息队列相关API函数

任务内建的消息队列API函数

消息队列

多个任务在等待一个消息队列

在μC/OS-III中每一个任务都有其内建的消息队列,用户可以不用通过外部的消息队列而直接向任务发布消息。

双向同步

利用任务内建进行双向同步

流量控制

任务内建的流量控制

下面我们使用消息队列来确定飞轮转速的范例学习使用

(1)程序的目的是测量一个转动飞轮的转速。

(2)通过使用传感器探测转轮上的一个小孔来获得转速

(3)程序使用一个32位的输入捕获寄存器和一个自由运行的计数器,每当赚到小孔的位置,计数器的值就会被记录到输入捕获寄存器中

(4)当检测到小孔会产生一个中断。中断服务程序读取输入捕获寄存器的当前值时,并减去上一次捕获的值,结果便是飞轮转一圈的时间。

(5)

(6)计数增量被发到消息队列。但实际是传递了指针。

(7)当消息发布后,转速测量任务会被唤醒,转速的计算方式如下:

RPM=60*Reference Frequency / Delta Counts

我们可以给转速测量任务指定一个等待超时,如果在这段时间内没有收到消息任务,也会被唤醒。这样就可以知道飞轮是否停止了转动。

(8)除了计算转速外,任务还可以计算平均转速、最高转速等,还可以检测转速是否高于或低于设定的阈值。

关于消息队列,我们常用的函数有三个。创建消息队列OSQCreate()、向消息队列发送消息函数OSQPost(),和等待消息队列函数OSQPend()。下面我们将逐个讲解。

先定义一个消息队列,并定义消息队列的最大消息数目。

接着创建一个消息队列

该函数的使用说明如下所示

创建发送消息函数

该函数的使用说明如下

创建等待消息队列函数

该函数的使用说明如下所示

任务内建消息队列发送信息

该函数的使用如下:

内建消息队列请求信息

该队列请求函数的使用如下:

马上写完了哈哈哈哈

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180827G0ZEHQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券