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. windows下MySQL免安装版配置教程mysql-5.7.24-winx64.zip版本

    一. 以管理员身份运行cmd,进入mysql的bin目录 执行以下代码. #初始化数据库 mysqld --initialize #初始化不会显示密码mysqld --initialize --con ...

  2. 3 saltstack高可用

    高可用 如果我们依赖于saltmaster管理服务器,那么就需要对saltmaster做好高可用.那么saltstack-master怎么做高可用呢? 可以参考官网1,官网2 机器配置: 我们有两台机 ...

  3. [Unity3D] 04 - Event Manager

    message消息管理 脚本与GameObject的关系 被显式添加到 Hierarchy 中的 GameObject 会被最先实例化,GameObject 被实例化的顺序是从下往上. GameObj ...

  4. [Laravel] 01 - Love beautiful code? We do too.

    前言 一.良心资料 英文 Laravel 框架:https://laravel.com/ 教程:https://laracasts.com/series/ laravel-from-scratch-2 ...

  5. 【代码审计】大米CMS_V5.5.3 后台多处存储型XSS漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  6. 【本周面试题】第2周 - js单线程和异步相关问题

    硬性知识点考察: 为什么js是单线程的? 因为js设计最初是为了操作dom而生,如果是多线程的,当多个线程同时修改一个dom时就会产生冲突,所以设计成单线程,一次只能做一件事. 既然是单线程为什么要有 ...

  7. C#WinForm应用程序中嵌入ECharts图表

    C#WinForm应用程序中嵌入ECharts图表 程序运行效果: 下载ECharts: 官网下载ECharts :http://echarts.baidu.com/download.html 或者直 ...

  8. springboot之thymeleaf学习

    这是springboot的view层不建议使用jsp,而是thymeleaf,虽然我也不知道为什么,但是后来可能会明白一些.学springBoot也遇到很多bug,导致脱累了进度.有点类似于jsp,但 ...

  9. Linux关闭IPV6

    Linux关闭IPV6的方法 修改配置文件/etc/sysctl.conf添加以下1行 net.ipv6.conf.all.disable_ipv6 = 1 设置生效 sysctl -p 查看没有IP ...

  10. CCPC-Wannafly Winter Camp Day3 Div1 - 排列

    题目链接:https://zhixincode.com/contest/14/problem/A?problem_id=203 time limit per test: 1 secondmemory ...