16.0-uC/OS-III同步
同步
uC/OS-III中用于同步的两种机制:信号量和事件标志组 。
1.信号量
信号量最初用于控制共享资源的访问。信号量可用于ISR与任
务间、任务与任务间的同步。
“ N”表示信号量可以被累计。初始化时也可以设置为非0值,
表明已经有事件发生。ISR或任务可以提交信号量多次,信号量计数
值会记录该信号量一共可被多少次。
注意的是所有的信号量函数都可以被任务调用,
但是ISR中只能调用OSSemPost()。
函数名 | 功能 |
OSSemCreate() | 创建一个信号量 |
OSSemDel() | 删除一个信号量 |
OSSemPend() | 等待一个信号量 |
OSSemPendAbort() | 取消等待该信号量 |
OSSemPost() | 提交一个信号量 |
OSSemSet() | 设置信号量计数值 |
用于同步时,信号量计数值中记录了它该信号量可被分配的次数。该
计数值在0到25565535, 或0到4294987295之间, 决定于该计数变
量的位数, 8位, 16位, 32位。特别的,信号量计数值的上限为
OS_SEM_CTR(见OS_TYPE.H)。
2.单向同步
任务可以与ISR或任务同步。 通过信号量的传递,这表明了ISR或任务发生了。
使用信号量实现同步叫做单向同步。
当任务要使用I/O端口, 它就需获得信号量而调用OSSemPend()。
当任务完成对I/O端口的访问完成后,就必须调用OSSemPost()释放
这个信号量。这个过程是单向同步的。
( 1)任务H被执行。该任务与ISR同步(也就是等待ISR的发生),然后调用OSSemPend()申请一个信号量。
( 2)转向uC/OS-III函数。
( 3) OSSemPend()的相关操作。
( 4)因为ISR尚未发生, 任务H被放入挂起队列, 并调用调度器。
( 5)任务L被执行。
( 6)中断发生,任务L被保存, CPU转向ISR。
( 7)开始执行ISR。
( 8) ISR中调用OSSemPost()提交了任务H所等待的信号量。
( 9)信号量被发送给任务H。
( 10)任务H被就绪,调度器将CPU的控制权交给任务H。
( 11)任务H获得信号量,并继续执行。
任务等待信号量时是不消耗CPU的执行时间。最后,当任务所等待的信号量出现时,
uC/OS-III能迅速地告知任务,并调用调度器。
3.信号量计数值
信号量计数值中保存了它还能被分配多少次。换句话
说,当ISR提交该信号量n次,那么该信号量计数值就会增加n。
4.多个任务等待一个信号量
多个任务可以同时等待同样的信号量,假设每个任务都被设置了
定时期限。
当该信号量被提交时, uC/OS-III会让挂起队列中优先级最高的任
务就绪。 然而, 也可以让挂起队列中所有的任务被就绪, 这叫做广播
信号量,调用OSSemPost()时选择参数OS_OPT_POST_ALL就能实
现广播的功能。
广播用于多个任务间的同步。然而,若任务还需要与不在信号量
挂起队列中的其它任务同步,可以同时使用信号量和事件标志组实现
同步的功能。
16.0-uC/OS-III同步的更多相关文章
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- uC/OS - III 移植 IAR平台
关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...
- 基于μC/OS—III的CC1120驱动程序设计
基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120 嵌入式操作系统 STM32F103ZE ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理
LES BX, DWORD PTR DS:_OSTCBCur ;OSTCBCur->OSTCBStkPtr = SS:SP!!! ], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务控制 ...
- Greenplum5.16.0 安装教程
Greenplum5.16.0 安装教程 一.环境说明 1.1官方网站 Greenplum官方安装说明:https://gpdb.docs.pivotal.io/5160/install_guide/ ...
- uc/os任务创建
问题描述: uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...
- uC/OS 的任务调度解析 (转)
uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...
- 【原创】uC/OS II 任务切换原理
今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
随机推荐
- [CI]jenkins安装&插件管理&java-helloworld之旅
持续集成概述 没有持续集成时的情况 持续集成最佳实战 维护一个单一的代码库 使构建自动化 执行测试是构建的一部分 集成日志及历史记录 使用统一的依赖包管理库 每天至少集成一次 jenkins实现持续集 ...
- java设计模式三种工厂模式简单介绍
一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...
- 【将门创投】AI 往期技术分享
计算机视觉 1. 嘉宾:商汤科技CEO 徐立 文章回顾:计算机视觉的完整链条,从成像到早期视觉再到识别理解 2. 嘉宾:格灵深瞳CTO 赵勇 文章回顾:计算机视觉在安防.交通.机器人.无人车等领域的应 ...
- centos7修改系统时间、时区
直接用下面命令直接更换时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
- C语言 goto语句
/* goto语句 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* goto语句也 ...
- 利用TortoiseGit(小乌龟)将项目上传至GitHub网站
准备 1.拥有一个GitHub账户 2.安装了TortoiseGit(小乌龟) 具体过程 一.在GitHub上建立新的仓库 起好仓库名,填好描述,在Add .gitgnore中选择Java(根据你自己 ...
- mysql like 查不到结果 中文 查询优化
[参考]mysql like %keyword%不走索引替代方法 在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万 ...
- [转]SASS用法指南
[转]SASS用法指南 转自阮一峰 SASS用法指南 一.什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了 ...
- tensorflow中一种融合多个模型的方法
1.使用场景 假设我们有训练好的模型A,B,C,我们希望使用A,B,C中的部分或者全部变量,合成为一个模型D,用于初始化或其他目的,就需要融合多个模型的方法 2.如何实现 我们可以先声明模型D,再创建 ...
- 【Clojure 基本知识】 ns宏的 指令(关键字) requrie的用法
指令(:require)用在(ns)之中,下面是实践中总结的几种用法(下文中省略ns宏,只是给出:require的代码): 一.导入完整名称空间. 1,最简单的形式: (:require clojur ...