同步原语

eCos Mbox机制 背景 总结下 ecos mbox这个通信机制。 ecos下面的通信机制真的很少,没有信号、消息队列、信号量、unix域…, 当然,我看到里面不少地方用到了 网络socket,如DHCP客户端的开启和关闭。 mbox我理解上应该就是Linux下消息队列吧,但是BRCM下面的 rc 中,用到的非常简单,仅仅使用这种机制来传递一个整数,哈哈,真是蛋碎。 经过扩展后,能传递字符串了。下面,走进去看下。 m... 阅读详情

http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?ID=2462312

gdtyy 发表于 2007-3-10 11:41 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

*********************
* 第十一讲 同步原语 *
*********************
    2007/03/09  asdjf@163.com  www.armecos.com
    
    ecos是多线程系统,并发执行造成了一些新问题的产生:多线程协同工作、对临界资源的竞争、线程间通信、线程间同步等等。其实,所有的多任务系统都会遇到类似问题,计算机专家们总结了很多抽象模型来应对,方法手段很多,各有特色,每种操作系统可能只实现了某个子集。ecos内核的同步机制提供了许多同步原语,包括:互斥、条件变量、信号量、信箱、事件标志和Spinlock等。
    
    抽象出来的同步原语操作主要包括:创建、删除、等待(阻塞/超时阻塞/非阻塞)、释放、设置、广播、查询数据、查询状态。
    
    虽然操作大同小异,但每种同步原语的含义和适用情况不同,下面详细介绍各种原语的使用方法和注意事项。
    
    ==========
    * 互斥体 *
    ==========
    互斥体用于实现线程对资源的安全共享。适用于线程间或线程与滞后中断服务程序DSR访问同一临界资源时的安全保护。
    考虑下面的例子:
    static volatile int counter = 0;
    void test(void)
    {
        ......
        counter++;
    }
    假设在某个时候counter的值为16,此时有两个同一优先级的线程A和B,它们都调用上面的test函数。线程A读取counter的值,并将其值加1,此时,counter为17。线程B也做同样的操作,counter的值为18。但是如果线程A在读取counter的值为16后,在将其值加1之前调度器调度运行线程B,此时,线程B读取的仍然是counter原来的值16,操作完成后counter变为17。这样,counter的值只增加了1,而不是2,因此最后counter的值只是17,而不是18。这足以说明该应用程序的运行是不可靠的。
    使用互斥体就可以安全地操作counter全局变量:
    static volatile int counter = 0;
    static cyg_mutex_t lock;
    void test(void)
    {
        ......
        cyg_mutex_lock(&lock);
        counter++;
        cyg_mutex_unlock(&lock);
    }
    
    互斥体的使用可能会引起优先级倒置问题的出现。假设有三个不同优先级的线程A、B、C,优先级A>B>C。A和B由于等待事件而处于阻塞状态,C得以运行。线程C在进入临界区时锁定了一个互斥体。当线程A、B被唤醒时,线程A要等待同一个互斥体,但它在线程C离开临界区并释放互斥体之前不得不等待。与此同时,线程B却可以毫无问题地正常运行。由于线程C比线程B优先级低,它在B被阻塞前将没有机会运行。这样线程A就不能运行。其结果就是高优先级的线程A由于优先级比它低的线程B的原因而无法运行,这就发生了优先级倒置。
    
    解决优先级倒置问题普遍使用的技术是:优先级置顶协议(Priority Ceiling Protocol)和优先级继承协议(Priority Inheritance Protocol)。
    优先级置顶意味着占有互斥体的线程在运行时的优先级比任何其他可以获取该互斥体的线程的优先级都要高。ecos组件包通常无法知道系统中各种线程的详细信息,因此无法对组件包内部使用的互斥体设置合适的置顶优先级。设置高了会影响调度操作。
    优先级继承将占有互斥体的线程优先级提升到所有正在等待该互斥体的线程优先级的最高值。当一个线程等待正被另一优先级较低的线程占有的互斥体时,拥有该互斥体的线程优先级被提升到正在等待该互斥体的线程优先级,优先级继承比优先级置顶效率高,不过增加了同步调用开销,而且实现起来比优先级置顶复杂。
    
    初始化          cyg_mutex_init
    删除            cyg_mutex_destroy
    锁定            cyg_mutex_lock
    尝试锁定        cyg_mutex_trylock
    解锁            cyg_mutex_unlock
    释放            cyg_mutex_release
    设置置顶优先级  cyg_mutex_set_ceiling
    设置协议        cyg_mutex_set_protocol
    
    ============
    * 条件变量 *
    ============
    条件变量是允许线程同时给多个线程发信号的一个同步机制。当线程等待一个条件变量时,它在进入等待状态之前将释放互斥体,在被唤醒后又重新拥有互斥体。这种操作是原子操作。
    
    举例说明见例1。
    
    初始化          cyg_cond_init
    删除            cyg_cond_destroy
    等待            cyg_cond_wait
    唤醒            cyg_cond_signal
    广播            cyg_cond_broadcast
    带超时等待      cyg_cond_timed_wait
    
    ==========
    * 信号量 *
    ==========
    信号量是一个允许线程等待直到事件发生的同步原语。每个信号量都有一个整数计数器,如果计数器为0,那么等待该信号量的线程将被阻塞。如果计数器大于0,那么等待的线程将消耗一个事件,即计数器减1。唤醒信号量将对计数器加1。即使事件连续快速发生多次,信号量也不会丢失信息。
    信号量的另一个用途是对资源的管理。计数器的值与当前可用资源的数目相对应。实际上,条件变量更适合于这种操作。
    
    初始化          cyg_semaphore_init
    删除            cyg_semaphore_destroy
    等待            cyg_semaphore_wait
    带超时等待      cyg_semaphore_timed_wait
    非阻塞等待      cyg_semaphore_trywait
    唤醒            cyg_semaphore_post
    获取信息        cyg_semaphore_peek
    
    ========
    * 信箱 *
    ========
    信箱是一个类似于信号量的同步原语,还可以在事件发生时传递一些数据。有些系统称之为消息队列。被称为消息的数据通常是数据结构的指针。信箱只具有有限的容量,缺省配置为10个槽位,有可能溢出。因此,信箱通常不能被DSR用来唤醒线程。
    
    创建            cyg_mbox_create
    删除            cyg_mbox_delete
    获得消息        cyg_mbox_get
    带超时获得消息  cyg_mbox_timed_get
    非阻塞获得消息  cyg_mbox_tryget
    非删除获得消息  cyg_mbox_peek_item
    发送消息        cyg_mbox_put
    带超时发送消息  cyg_mbox_timed_put
    非阻塞发送消息  cyg_mbox_tryput
    读取消息数      cyg_mbox_peek
    判断是否有消息  cyg_mbox_waiting_to_get
    发新消息前判断  cyg_mbox_waiting_to_put
    
    ============
    * 事件标志 *
    ============
    事件标志允许线程等待一个或几个不同类型的事件发生。还可以用于等待某些事件组合的发生。事件标志不存在溢出问题。
    事件标志可以指定函数调用者阻塞(1)直到所有指定事件发生为止;(2)直到至少一个指定事件发生为止;(3)直到所有指定事件发生为止并清除事件标志;(2)直到至少一个指定事件发生为止并清除事件标志。
    
    初始化              cyg_flag_init
    删除                cyg_flag_destroy
    设置标志位          cyg_flag_setbits
    清除标志位          cyg_flag_maskbits
    等待事件发生        cyg_flag_wait
    超时等待事件        cyg_flag_timed_wait
    探查事件是否发生    cyg_flag_poll
    返回事件标志当前值  cyg_flag_peek
    报告是否有线程等待  cyg_flag_waiting
    
    ============
    * Spinlock *
    ============
    Spinlock是为SMP系统中的应用线程提供的一个同步原语。Spinlock运行级别要低于其他同步原语(如互斥体)。特别在对中断进行处理以及线程需要共享硬件资源的情况下需要使用Spinlock。在SMP系统中,内核自身的实现也需要使用Spinlock。
    必须强调的是,对Spinlock的拥有时间必须很短,一般为几十条指令。在单处理器系统中,不应该使用Spinlock。
    
    初始化          cyg_spinlock_init
    删除            cyg_spinlock_destroy
    声称            cyg_spinlock_spin
    释放            cyg_spinlock_clear
    非阻塞声称      cyg_spinlock_try
    检查是否有等待  cyg_spinlock_test
    安全声称        cyg_spinlock_spin_intsave
    安全释放        cyg_spinlock_clear_intsave
 

Go-同步原语 一、同步原语 - Sync 这些基本原语提高了较为基础的同步功能,但是它们是一种相对原始的同步机制,在多数情况下,我们都应该使用抽象层级的更高的 Channel 实现同步。 1-1 并发状态下的资源冲突 由于引用传递,在并发状态下的数据资源获取无序,导致最终结果重复或者错误。 package main import ( "fmt" "sync" "time" ) fun... 阅读详情

相关推荐

eCos Native C API

ecos 的API接口函数,可以快速查询

前后台系统的低功耗编程思想——STM8平台

1.前言 工作之后接触了“低功耗”,开始搜索各种各样的低功耗MCU。网络是一个非常自由的地方,你总可以看到各种关于哪个MCU功耗更低的论战,在这些论战中我查阅了几乎所有低功耗MCU的特性,例如MSP430、EFM32还有STM32L等,网络论战的核心便是哪款MCU的休眠电流更低。看多了资料我便发现,这些低功耗的MCU如何使用,低功耗MCU的程序编写和普通MCU编程有什么区...

ba_wang_mao的专栏 353

GN算法边介数计算优化指南:如何提升大规模社交网络分析效率

本文深入探讨了GN算法在大规模社交网络分析中的核心瓶颈——边介数计算,并提供了从算法优化到工程部署的完整性能提升方案。通过引入Brandes算法、并行计算、增量更新及分布式处理等策略,有效解决了传统GN算法在处理百万级网络时效率低下的问题,为社交网络社区划分等实际应用提供了高效解决方案。

weixin_29196613的博客 486

ecos内存管理

    在嵌入式系统中,为了对内存资源进行很好地控制,避免发生不可预测的后果,一般建议使用静态内存分配。ecos是专门为实时嵌入式系统量身定做的操作系统,它的大多数系统调用在被使用时都要求将预先指定的由系统调用所产生的目标对象的内存地址传递给该系统调用(即对其进行静态内存分配)。如第一讲cyg_thread_create系统调用函数就要求传入句柄指针和线程数据结构体指针及堆栈起址,而这三个指针对应

aaaaatiger--寻路 4152

易灵思FPGA-软件Efinity和Modelsim联仿设置

文章目录前言一、modelsim破解过程二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智

qq_35221855的博客 5362

DAZ STUDIO 快速渲染技巧

DAZ STUDIO 快速渲染技巧: 本文将向您展示几个快速渲染技巧。您将学习如何使您的Daz Iray渲染和照明在Daz工作室内更快。 当你有一个大场景,这可能需要很多小时进行渲染。 但是如果你想大幅度降低渲染时间呢?这篇文章的提示应该能让你达到这个目标。 首先,我们需要弄清楚一件事——没有“完美的环境或设置”这样的东西。是因为渲染设置是高度个性化和主观性的东西,这主要取决于场景和硬件。如果你有一个功能强大的计算机,你可以允许更多的低渲染时间,反之亦然。因此,一切都取决于您尝试渲染的对象和机器。

DAZSTUDIO的博客 9646

eCos中的线程与同步

1.线程的创建 void cyg_thread_create(...),创建一个线程,处于挂起状态   2.线程的控制 void cyg_thread_yield (),使线程放弃对处理器的控制 void cyg_thread_delay (cyg_tick_count_t    delay),使线程挂起一定的时间 void cyg_thread_suspend (cyg_handle

4766

Android 12 HAL开发避坑实录:手把手教你用AIDL在Native层实现一个可开机自启动的Service

本文详细介绍了在Android 12 HAL开发中,如何通过AIDL在Native层实现一个可开机自启动的Service。从环境准备、AIDL接口定义、服务实现到VINTF集成与SELinux策略配置,提供了完整的实战指南,帮助开发者避开常见陷阱,提升开发效率。

weixin_28314575的博客 321

内核随记(三)--同步(2)

2.2、睡眠与唤醒 在操作系统中,睡眠和唤醒原语实际上是操作系统的基本原语,也是实现同步的一种方式,而且它还是实现信号量的基础。当进程请求的资源(如内存、文件等)不能得到满足时,就会主动放弃CPU,进入等待状态(可中断等待或者不可中断等待)。当资源满足时,就会由别的进程唤醒,从而投入运行。 2.2.1、等待队列 等待队列表示一组睡眠的进程,这些进程正在等待特定的事件发生(或者说条件为真),比

wxie的Linux人生 1718

Windows如何使用Anaconda 3进行keras环境的配置

** Windows如何使用Anaconda 3进行keras环境的配置 搭建Keras环境* Anaconda3如何安装keras,主要包括下面三步: 1.安装mingw libpython 2.安装theano 3.安装keras 若你还没有按装anaconda,赶紧下载安装吧! 下载途径有两个 (1)Anaconda版本为Anaconda 4.4.0,对应的python版本为3.6,附上An...

Lance_liangliang的博客 1601

详解Agent Skills:让AI拥有更多专业能力(什么是Agent Skills?如何创建?如何使用?如何获取?)

本文分享如何将零散指令沉淀为可复用的 AI 能力模块🧩,介绍什么是Agent Skills?如何创建?如何获取?📚

XiaoqiangClub的博客 1270

C++ 同步原语

同步原语(Synchronization Primitives)是操作系统和编程语言提供的基本工具,用于在多线程或并发环境中协调线程(或进程)之间的执行顺序,管理共享资源的访问,以避免数据竞争(data race)、死锁(deadlock)等问题。(C++11):RAII 封装,构造时加锁,析构时解锁,不支持手动解锁。(C++11):允许同一线程多次锁定(递归加锁),但其他线程仍被阻塞,适合需要递归调用的场景。作用:提供无锁(lock-free)的线程安全的原子操作,适合简单变量(如计数器)的并发访问。

说码解字 1339

基于uniapp实现自定义日历页面、年份月份选择、动态日历渲染、日期标记及备忘录、无组件依赖、多端兼容

基于UniApp框架下自定义日历组件的完整实现方案,涵盖基础日历渲染、年月选择器集成、动态数据标记等核心功能。提供完整代码段,帮助开发者快速构建高性能、高定制化的日历模块,适用于日程管理、预订系统等场景。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

操作系统—同步原语

同步原语 原来我们都用的是单核的CPU,但是单核的性能现在已经很难有突破了,所以开始在一个CPU中添加多个物理核。 但是原来的应用程序都是为单核设计的,在多核运行无法体现多核的性能,为了更充分的使用多核,应用程序需要将待处理的数据进行划分,从而能够在同一时间分配任务到多个核心上并行处理,利用更短的时间完成计算。 然而并行处理同一任务意味着对共享资源的并发访问,为了保证共享资源状态的正确性,需要正确地在这些子任务之间进行同步。看下面这个例子 生产者不断生成数据放到共享缓冲区中,消费者从缓冲区拿数据,但是他需

weixin_38849460的博客 3935

《多模态融合改进》支持目标检测、目标分割、OBB、姿态估计,配置教程

本文以为例,讲解如何配置,支持替换专栏里所有的改进方式。

Limiiiing的博客 796

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

go语言进阶之同步原语

在Go语言中,资源竞争指多个goroutine同时访问共享资源,导致程序的行为不可预测或者不一致。资源竞争通常发生在对同一变量进行读写操作时,如果没有正确的同步机制来控制访问可能会引发资源竞争!可以运行后看到发生了资源竞争,导致不为1000。

2301_80148821的博客 3889

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

聊聊 Python 中的同步原语,为什么有了 GIL 还需要同步原语

在前面的文章中我们介绍了 Python 中的全局解释器锁 GIL,我们知道 GIL 可以保证在多线程场景下同一时刻只有一个线程运行,但是并不能保证线程安全

Lorin 洛林的后端技术小站 1029

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

同步原语(Synchronization Primitives)

同步原语(Synchronization Primitives)是用于控制并发编程中多个线程或进程之间的访问顺序,确保共享资源的安全访问的一组机制或工具。它们解决了竞争条件(Race Condition)、死锁(Deadlock)等并发问题,帮助程序员管理线程之间的协作。

宋发元 1358

go: 同步原语详解

同步原语是计算机科学中用于实现进程或线程之间同步的机制。它提供了一种方法来控制多个进程或线程的执行顺序,确保它们以一致的方式访问共享资源。

十年运维开发经验的王义杰在此分享自己的知识和经验 1320

go 同步原语详解

同步原语是计算机科学中用于实现进程或线程之间同步的机制。它提供了一种方法来控制多个进程或线程的执行顺序,确保它们以一致的方式访问共享资源。

2401_87021182的博客 1040

Python编程:为什么使用同步原语

简单互斥→Lock嵌套锁需求→RLock资源池限制→Semaphore线程间通知→Event或Condition复杂协调逻辑→Condition。

林十一npc的博客 1313

Python的同步原语

在多线程编程中,同步原语(synchronization primitives)是确保线程安全和正确执行的关键。Python 提供了一些基础的同步原语,用于协调线程之间的访问和操作。Python的同步原语包括 Lock、RLock、Semaphore、Event 和 Condition,接下来简单介绍一下他们的使用Python 和其他语言哟杨,同步原语为多线程编程提供了强大的工具,以确保线程安全和正确执行。

GoProLin的博客 1394

如何用硬件同步原语(CAS)替代锁?

为什么硬件同步原语可以替代锁呢?要理解这个问题,你要首先知道硬件同步原语是什么。硬件同步原语(Atomic Hardware Primitives)是由计算机硬件提供的一组原子操作,我们比较常用的原语主要是CAS和FAA这两种。CAS(Compare and Swap),它的字面意思是:先比较,再交换。*p ← newp: 要修改的变量的指针。old: 旧值。new: 新值。返回的是一个布尔值,标识是否赋值成功。

qq_33240556的博客 709

C++ 编程 该怎么选用同步原语?

同步原语选型指南:从正确性到性能优化的决策路径 本文系统性地总结了多线程编程中同步原语的选择策略。核心观点是:优先保证正确性,再考虑性能优化。文章提供了从默认选型(mutex优先)、决策树、性能对照表到常见模式的全方位指导,强调先用强约束(如seq_cst)确保正确,再逐步降级验证。关键建议包括:多字段不变式用mutex,单变量状态用原子操作,发布-订阅模式用release/acquire配对,资源配额用信号量。特别提醒避免常见误区,如volatile误用、栅栏滥用等,并提供了性能基准测试方法论。最终建议是

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1256
上一篇: ecos 讲意
下一篇: 计数器(Counter)、时钟(Clock)、告警器(Alarm)、定时器(Timer)
aaaaatiger
博客等级 码龄20年 535粉丝 627原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值