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(栈的基地址)寄存器值存放至当前任务控制 ...
随机推荐
- C#基础回顾:正则表达式-转
写在前面:本文根据笔者的学习体会结合相关书籍资料对正则表达式的语法和使用(C#)进行基本的介绍.适用于初学者. 摘要:正则表达式(Regular Expressions),相信做软件开发的朋友或多或少 ...
- Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面
目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...
- [IR] Huffman Coding
为了保证:Block中,所有的叶子在所有的中间结点的前面.Static: Huffman coding Dynamic: Adaptive Huffman 一些概念 压缩指标 • Compress a ...
- asp.net mvc 3.0 知识点整理 ----- (2).Controller中几种Action返回类型对比
通过学习,我们可以发现,在Controller中提供了很多不同的Action返回类型.那么具体他们是有什么作用呢?它们的用法和区别是什么呢?通过资料书上的介绍和网上资料的查询,这里就来给大家列举和大致 ...
- 使用命令行模式启动VMWare虚拟机
工作中使用到在centos中安装vmware Workstation部署虚拟机,以前都是使用图形界面启动虚拟机,由此要调整VNC的分辨率大小,重启VNC Server后所有虚拟机都关闭了.事后分析可能 ...
- ElasticSearch(一)-- 简介
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- TSPL学习笔记(2):过程和变量绑定
变量的引用 语法: variable 返回: variable的值 如果在某个范围内存在对某个标识符的变量绑定,那么当这个标识符以表达式的形式出现的时候被认为是其所绑定变量的值. 在引用一个标识符的时 ...
- 利用media query让背景图适应不同分辨率的设备
随着上网方式的多样化,用户选择上网的工具不再仅是PC,而可以是手机,或者平板电脑.随之而来的问题是如何让网页适应不同分辨率,这给前端工程师们带来了新的挑战,其中重要的一点是如何让图片能在不同的分辨率下 ...
- 在WPS中删除整行的快捷键是什么?
选中需要删除的行,(方法:点击最左侧的行号):按快捷键Ctrl+-(按着Ctrl不放,再按小键盘的减号“-”),“-”是删除,“+”是插入,选中行,是对行操作,选中列就是对列操作,选中单元格,就是单元 ...
- 6 CLR静态构造器
CLR保证一个类型构造器在每个AppDomain中只执行一次,而且这种执行是线程安全的. 作用: 就是初始化静态成员 比如有几个静态成员需要初始化那你把初始化代码放到哪呢? 放到普通构造函数里,那肯定 ...