8.1-uC/OS-III多任务应用
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多任务应用的更多相关文章
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- uC/OS - III 移植 IAR平台
关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- 关于uC/OS的简单学习(转)
1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...
- 基于μC/OS—III的CC1120驱动程序设计
基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120 嵌入式操作系统 STM32F103ZE ...
- uc/os 任务删除
问题描述: uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注: 如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...
- uc/os任务创建
问题描述: uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...
- uC/OS 的任务调度解析 (转)
uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...
- STM32F40G-EVAL_UC/OS III
micrum官网下载uc/os程序包: 包含文件cotex_M4.h:
- 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理
LES BX, DWORD PTR DS:_OSTCBCur ;OSTCBCur->OSTCBStkPtr = SS:SP!!! ], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务控制 ...
随机推荐
- python进行数据分析
1. python进行数据分析----线性回归 2. python进行数据分析------相关分析 3. python进行数据分析---python3卡方 4. 多重响应分析,多选题二分法思路 5. ...
- Ubuntu安装redis缓存数据库
参考:http://blog.csdn.net/xiangwanpeng/article/details/54586087 1.在下载目录下 sudo wget http://download.red ...
- 文件解压缩 tar zip
zip -e var-log-protected.zip /var/log/* Enter password: Verify password: updating: var/log/acpid (de ...
- win7怎么打开加锁文件夹
在windows 7下,C:\Documents and Settings文件夹是默认锁定的,很多时候要进入进行解除锁定,根据本人实践的经历略作介绍. 1.打计算机,进入c盘文件夹,2.分别点击“组织 ...
- [BOOK] Applied Math and Machine Learning Basics
<Deep Learning> Ian Goodfellow Yoshua Bengio Aaron Courvill 关于此书Part One重难点的个人阅读笔记. 2.7 Eigend ...
- 解决VisualStudio无法调试的问题
方法1 方法2
- 导入日志文件到mysql数据库表
#!/bin/bash #**************************************************************************** #***将/usr/ ...
- Java NIO学习笔记---I/O与NIO概述
文章目录: 1.什么是IO 2.什么是Java NIO 3.I/O常见概念 4.为什么使用NIO 5.IO VS NIO 一.什么是IO I/O 或者输入/输出 , 指的是计算机与外部世界或者一个程序 ...
- Python 读、写、追加csv文件详细以及注意事项
一.利用csv库创建文件 首先导入csv文件 import csv 根据指定的path创建文件: def create_csv(path): with open(path, "w+" ...
- case when then end
当 a>b获取a,否则获取b,当a>c获取a,否则获取c,b大于c获取b否则获取c SELECT id,(CASE WHEN a>b THEN a WHEN a>c THE ...