1.app.c:

( 1) .分别为每个任务分配一个OS_TCB。
(2). 斥信号量( mutex)是一个内核对象(一个结构体),用于保护共享资源。任务要访问共享资源就必须先获得 mutex。 mutex的拥有者使用完这个资源后就必须释放这个mutex。 这个例子示范了这个过程。
(3). 消息队列是一个内核对象, ISR或任务可以直接发送消息到另一个任务。发送者制定一个消息并将其发送到目标任务的消息队列。 目标任务等待消息的到达。 如果消息到达了, 目标任务取得这些消息。 如果消息队列为空, 目标将会被安放在挂起队列中并与消息队列保持联系。
(4). 为每个任务分配堆栈。 {由于是CPU_STK类型, 它是
32位的,所以128个CPU_STK即位512B}。
(5).用户需要申明这些任务。
2.main.

(1).调用OSMutexCreate()创建一个mutex。 指定OS_MUTEX对象的地址。可以为mutex定义一个ASCII名字,对调试会很有用处。
(2).调用OSQCreate()创建消息队列, 并指定OS_Q对象的地址。
为消息队列命名。定义该消息队列可接受消息的个数。 这个值必须大于0。 如果消息者发送消息数超过了消息接收任务的承受能力。那么消息将会被丢失。可以通过增加消息队列的大小或者提供消息接收任务的优先级提升其承受能力
(3).一个应用任务被创建。
3.多任务创建:

(1).通过调用 OSTaskCreate()创建任务#1。如果被创建任务的优先级大于创建它的任务的优先级。 uC/OS-III会转向执行任务#1.如果被创建任务的优先级小于创建它的任务的优先级,OSTaskCreate()将会返回AppTaskStart()继续执行下面的代码。
(2).任务#2被创建,如果其优先级大于AppTaskStart()的优先级 。那么uC/OS-III将会立即去执行任务#2。
4.任务函数1:

(1).该任务在执行前先等待一个时基。 如果uC/OS-III的时基频率为1000HZ。那么这个任务每毫秒被执行一次。
(2).该任务向消息队列AppQ发送一个消息。 为了说明, 在例子中发送的是一个 void* 1。但实际上消息中包含着的是一个地址。内存地址、函数的地址、或者其它需要被传送的地址。
(3).该任务等待一个信号量。 如果它需要访问已被其它任务占用的资源, APPTaskStart1()等待这个mutex被释放。 第二个参数为其等待时限,以时基为单位,若0时就会一直等待下去。
(4).当 OSMutexPend()返回了,就表明该任务占用了这个共享资源。共享资源可能是变量、数组、数据域、 IO等。
(5).如果任务完成对共享资源的使用,它必须调用OSMutexPost()
释放这个mutex。
5.任务函数2:

(1). 任务#2开始执行, 并等待消息队列AppQ中的消息,这个任务会无限等待下去因为第三个参数为0,意味着无限等待。
消息的发送者和接收者都必须知道这个消息中所包含的信息。接收消息的大小存于”msg_size”。”p_msg”是调用该函数后返回的消息地址,指向内存且”msg_size”中包含这这个内存区的大小。
当接收到消息时, “ts”中包含的是消息被发送时的时间戳。 时间戳的值读取于硬件定时器。时间戳是一个32位(或更大)的值。
(2).测得消息是什么时候被发送的,用户就能测得任务接收这个消息所用的时间。读取现在的时间戳并减去消息被发送时的时间戳。 请注意, 消息被发送时, 等待消息的任务可能不会立即接收到消息,因为ISR或更高优先级的任务需要被运行。
(3).处理接收到的消息。

8.1-uC/OS-III多任务应用的更多相关文章

  1. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  2. uC/OS - III 移植 IAR平台

    关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...

  3. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  4. 关于uC/OS的简单学习(转)

    1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...

  5. 基于μC/OS—III的CC1120驱动程序设计

    基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120   嵌入式操作系统   STM32F103ZE   ...

  6. uc/os 任务删除

    问题描述:     uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注:     如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...

  7. uc/os任务创建

    问题描述:      uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...

  8. uC/OS 的任务调度解析 (转)

    uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...

  9. STM32F40G-EVAL_UC/OS III

    micrum官网下载uc/os程序包: 包含文件cotex_M4.h:

  10. 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理

    LES BX, DWORD PTR DS:_OSTCBCur ;OSTCBCur->OSTCBStkPtr = SS:SP!!! ], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务控制 ...

随机推荐

  1. WebRTC 配置环境

    复制文件到指定文件路径 cp -rf /home/leehongee/LeeHonGee/jdk1.7.0_45 /usr/lib/jvm 创建文件夹   mkdir jvm 修改环境变量 sudo ...

  2. 深度学习的batch_size

    知乎讨论: https://www.zhihu.com/question/61607442/answer/204675996 案例一 http://www.myzaker.com/article/5a ...

  3. SFTP编辑linux文件 ——mac sublime text2 sftp

    llinux上编辑文件总是个头疼的事儿.mac上没有nodepad++和editplus,他们都有各自支持的sftp插件,editplus比较好 自然就带了,而notepad++需要另行安装. 下面介 ...

  4. spring与quartz定时器

    参考: http://www.iteye.com/topic/399980 http://www.cnblogs.com/xrab/p/5850186.html

  5. 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字

    思路分析:任何一个数字异或它自己都等于0,根据这一特性,如果从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,所以最终的结果刚好是那些只出现一次的数字. 代码如下: #i ...

  6. 一个手写的 http client

    public class HTTPClient { public static final String GET = "GET"; public static final Stri ...

  7. ios开发之--NSString中substringFromIndex,substringWithRange,substringToIndex方法的使用

    1,substringFromIndex 从索引0开发到到index的后面的字符 2,substringWithRange 取指定range里面的字符,左边为索引index,右边为截取的范围 3,su ...

  8. iOS mac终端下的SQL语句

    本文转载至 http://blog.csdn.net/majiakun1/article/details/41281801 我们都知道数据库的创建可以借助图形化的数据库工具软件,但也可以在Mac终端下 ...

  9. Android打印当前所有线程及对应栈信息

    Map<Thread, StackTraceElement[]> threadMap = Thread.getAllStackTraces(); Log.e("albertThr ...

  10. emmet前端模板

    https://github.com/emmetio/emmet/blob/master/lib/snippets.json "emmet.extensionsPath": &qu ...