如何应用条件变量实现eCos字符设备驱动的阻塞读

Linux互斥锁、条件变量和信号量 Linux互斥锁、条件变量和信号量 Linux互斥锁、条件变量和信号量 Linux互斥锁、条件变量和信号量 Linux互斥锁、条件变量和信号量 Linux互斥锁、条件变量和信号量 Linux互斥锁、条件变量和信号量 Linux互斥锁、条件变量和信号量 Linux互斥锁、条件变量和信号量 立即下载
(本文原创,转载请注明出处)

在应用字符接口驱动程序的时候,我们常常需要通过提供阻塞读的这样的接口让等待驱动回应的线程尽快的释放出CPU的资源给其他线程。

eCos在driver层次上提供了条件变量API以满足这个需要

cyg_drv_cond_XXX

同时要应用条件变量还必须创建一个mutex来配合条件变量的工作

cyg_drv_mutex_XXX

那么在具体的驱动程序中该如何实现它呢,下面以MINI2440的touch驱动的阻塞读来举例说明。

具体代码请下载emboslab的ecos代码

1、首先我们必须先创建条件变量和mutex

在ts_lookup中添加条件变量和mutex的初始化代码,ts_lookup会在其他应用程序打开/dev/ts的时候调用


cyg_drv_mutex_init(&res_lock);
cyg_drv_cond_init(&res_wait,&res_lock);

2、在设备读函数中加入条件变量等待函数

static Cyg_ErrNo 
ts_read(cyg_io_handle_t handle, 
        void *buffer, 
        cyg_uint32 *len)
{
	cyg_mutex_lock(&res_lock);
	cyg_cond_wait(&res_wait);
	/*在这里加入你读取数据的代码*/
	cyg_mutex_unlock(&res_lock);
	return ENOERR;
}

3、在中断的DSR中触发条件变量

static void
cyg_mini2440_ts_dsr(cyg_addrword_t param)
{
	cyg_cond_signal(&res_wait);
}

这样一来,当Touch的中断到来的时候touch的中断函数会向驱动读函数发送信号,使得现在因为读不到touch数据而阻塞的线程得以继续运行。

4、通过tests来测试

编译好ecos以后,我们可以进入ecos build的目录去make tests,这样在install/tests/devs/touch/arm/mini2440/current/tests/ 中就会生成touch的测试程序。

通过重新配置mini2440的touch驱动的block read选项,我们可以清楚地观察到两种方式的效果。


浅谈互斥锁为什么还要和条件变量配合使用 mutex体现的是一种竞争,我离开了,通知你进来。 cond体现的是一种协作,我准备好了,通知你开始吧。 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起配合使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线程间的同步。 两个线程操作同一临界区时,通过互斥锁保护,若A线程已经加 立即下载

相关推荐

Qt 5.15.2静态编译避坑实录:MinGW 32位版从源码到Creator配置的全流程踩坑总结

本文详细介绍了Qt 5.15.2 MinGW 32位版本的静态编译全流程,包括环境准备、配置参数优化、编译过程监控及安装后配置。重点解决了静态编译中的常见问题,如参数顺序敏感、路径引号问题等,并提供了性能对比实测数据,帮助开发者高效完成静态编译。

weixin_26749245的博客 271

linux中互斥锁,自旋锁,条件变量,信号量,与freeRTOS中的消息队列,信号量,互斥量,事件的区别

1.条件变量同步机制让进入管程却因资源不足而阻塞的进程暂时放弃管程控制权(开放管程),进入该条件变量的等待队列条件变量只能在管程中通过两个原语操作——wait原语和signal原语。一个进程已进入管程但无法继续执行,便在相应的条件变量x上调用x.wait(),将自己阻塞并移入x的等待队列中,放弃管程控制权(开放管程),另一进程可以通过对同一个条件变量执行x.signal()来唤醒之前在x上等待的进程条件变量仅起到维护等待队列的作用,不存在相关的值,也不能象信号量那样加减累计。

weixin_42224577的博客 1980

APM32F103 配置CAN

摘要: 本文介绍了基于APM32F103RCT6的CAN通信实现,包含GPIO初始化、CAN配置、数据收发功能。通过配置CAN1的GPIO引脚(PB8/PB9)和波特率(500Kbps),实现标准帧格式的数据传输。发送函数支持8字节数据包,接收函数通过FIFO0处理消息,并根据接收ID触发响应发送(如ID 0x1回复0x2)。代码还包含错误状态检测(如总线关闭处理)和过滤器配置(32位掩码模式)。整体实现了基础的CAN通信与错误管理功能。

weixin_43676660的博客 862

【花雕学编程】Arduino RTOS 之使用条件变量和互斥量处理事件

Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。Arduino平台以其简洁的编程接口和丰富的扩展功能,成为了电子爱好者、设计师、工程师和艺术家们的首选工具。它允许开发者在Arduino设备上实现多任务并行处理,提高程序的复杂性和功能,同时保持代码的可读性和可靠性。在示例三中,展示了优先级继承机制。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

雕爷学编程 808

AD创建属于自己的元件库(详细)

我今天开始学习AD2022,但是我想自己创建属于自己的元件库,但是奈何找了好多教程就是随便几句话就把我打发走了,弄了一天都没搞定(也许是我比较菜),所以现在乱懂了,自己写一个属于我们自己小白的教程,希望有用吧哈哈我比较偷懒,直接使用嘉立创上画好的元件导入,和我们自己创建自己画的步骤其实都一样。

qq_33591173的博客 2万+

神经网络学习笔记-波尔兹曼(Boltzmann)机

Boltzmann机是一种反馈随机神经网络 两种输出状态,单极性0或1。输出状态的取值根据概率统计法则决定,这种概率统计法则类似Boltzmann分布,部分反馈 它在神经元状态变化中引入了统计概率,网络的平衡状态服从Boltzmann分布,网络运行机制基于模拟退火算法。 离散Hopfield神经网络+模拟退火+隐单元=Boltzman机 DHNN全反馈,转移函数:符号函数 BM机网络拓扑...

求易学堂的博客 2612

10、FreeRTOS 同步和互斥

经理B必须等同事A完 成报表,AB之间有依赖,B必须放慢脚步,被称为同步。在团队活动中,同事A已经使用会议室了,经 理B也想使用,即使经理B是领导,他也得等着,这就叫互斥。如果A、B同时使用串口,那么打印出来的信息就是A、B混杂,无法分辨。所以使用串口时, 应该是这样:A用完,B再用;B慢了一步,于是就眯一会;在这个过程中,A、B是互斥地访问“厕所”,“厕所”被称之为临界资源。就是:哎哎哎,我正在用厕所,你不能进来。一句话理解同步与互斥:我等你用完厕所,我再用厕所。就是:哎哎哎,我正在用厕所,你等会。

Lim的博客 1130

STM32F4使用CUBEMX ADC定时采样+DMA

STM32、FFT、ADC、TIM

m0_62379750的博客 4222

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_t thread),挂起指定的线程 void cyg_thread_resume (cyg_handle_t...

老熊的博客 823

专栏三:解析spatialCNV的使用

文章Spatially resolved clonal copy number alterations in benign and malignant tissue发在natur

m0_58549466的博客 1251

GEE案例:Landsat 5、7、8影像构建1985-2023年rsei生态遥感指数详细代码

rsei(Regional Silviculture Ecological Index,地区林业生态指数)是一种生态遥感指标,用于评估森林生态系统的健康状况和生态服务。构建1985-2023年的rsei生态遥感指,主要需要使用Landsat 5、7和8的遥感影像数据。以下是一种可能的构建方法:1. 数据获取:从美国地质调查局(USGS)或其他可靠数据提供商处获取Landsat 5、7和8的遥感影像数据。确保选择的影像具有适当的空间和时间分辨率,以覆盖所需的时间段。

此星光明博客 3402

【花雕学编程】Arduino RTOS 之使用条件变量管理状态

当其他任务改变了条件,使其满足时,可以通过条件变量唤醒等待的任务,从而实现任务间的同步。例如,在一个智能家居系统中,条件变量可以与门窗的开关状态相关联,当门窗状态改变时,相应的任务可以根据条件变量的状态做出反应。例如,任务在持有互斥锁的情况下调用条件变量的等待函数,而其他任务需要获取该互斥锁才能改变条件并唤醒等待的任务,这样就可能形成死锁。例如,任务 A 需要在任务 B 完成某个操作后才能继续执行,任务 A 可以通过条件变量等待任务 B 完成操作的信号,任务 B 完成后通过条件变量唤醒任务 A。

雕爷学编程 1063

蓝牙配对鉴权过程深度剖析:Just Works/Numeric Comparison/Passkey Entry/OOB 协议流程

当你新买的智能手表与手机配对时,是否遇到过这样的情况:有时只需在手机上点击 "确认" 即可完成配对,有时却需要在手表上输入手机显示的 6 位数字,而连接车载蓝牙时可能又需要输入固定密码?这些差异背后,是蓝牙配对鉴权机制在默默工作。蓝牙配对鉴权是设备间建立安全连接的核心环节,直接关系到数据传输的保密性和设备身份的真实性。​

byte轻骑兵的技术小窝 3571

FreeRTOS一些常识笔记之快速上手

一、为啥要用实时多任务操作系统 real-time Operate System 简称有:RTOS,有如下的好处: 用户无需关心时间信息 内核负责计时,并由相关的API完成,从而使得用户的应用程序代码结构更简单。 模块化、可拓展性强 也正是由于第一点的原因,程序性能不易受底层硬件更改的影响。姐,各个任务是独立的模块,每个模块都有明确的目 的,降低了代码的耦合性。 效率高 内核可以让软件完全由事件驱动,因次,轮询未发生的事件是不浪费时间的。相当于用中断来进行任务切换。 中断进程更短 通过把中断的处理推迟到用

小浩的博客 1965

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

RTOS精进(二):FreeRTOS 系统移植

在arm和linux系统上移植Freertos系统

技术容我懒 1585

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【多线程】临界区,互斥量,信号量,条件变量,事件以及区别

1.互斥量(互斥锁)和信号量 多任务间同步的方式包括关中断,调度器上锁, 互斥量(mutex),信号量,消息队列几种, 其中互斥量和信号量使用使用方式相近,连概念和实现都有些近似, 所以没有扎实操作系统背景知识的同学常常分不清出他们的区别,容易混淆, 下面简单分析以下. 1.互斥量(互斥量其实可以理解为一个简化的信号量,它只有两种状态:0和1) 互相斥量是管理临界资源的一种有效手段......

我的笔记本 4764

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

第十三章 设备驱动程序与内核的接口

发信人: Rambo (蓝保)信  区: Free_NJUPT标  题: I/O包(设备驱动程序)(5)设备驱动程序与内核的接口发信站: 紫金飞鸿 (Tue Dec  7 20:23:20 1999)ecos参考手册--------------------------------------------------------------------------------第十三章 设备驱动程序与

aaaaatiger--寻路 2212

信号量与条件变量的区别

注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html   信号量、共享内存,以及消息队列等System V IPC三剑客主要关注进程间通信; 而条件变量、互斥锁,主要关注线程间通信。   下面内容参考:http://blog.chinaunix.net/uid-27164517-id-3282242.html ...

weixin_34138139的博客 749

FreeRTOS高级篇6---FreeRTOS信号量分析

FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。关于它们的区别可以参考《FreeRTOS系列第19篇---FreeRTOS信号量》一文。 信号量API函数实际上都是宏,它使用现有的队列机制。这些宏定义在semphr.h文件中。如果使用信号量或者互斥量,需要包含semphr.h头文件。 二进制信...

朱工的专栏 13万+

线程同步的方式——Mutex(互斥量)、 Condition variable(条件变量)和Semaphore(信号量)

1.不同的同步方式的实现方法 2.相互之间的对比?区别?

见贤思齐 1219

FreeRTOS(18)---FreeRTOS 信号量分析

FreeRTOS 信号量分析FreeRTOS 信号量分析信号量创建创建二进制信号量创建计数信号量创建互斥量创建递归互斥量释放信号量xSemaphoreGive()xSemaphoreGiveFromISR()获取信号量xSemaphoreTakexSemaphoreTakeFromISR()释放递归互斥量获取递归互斥量 FreeRTOS 信号量分析 FreeRTOS的信号量包括二进制信号量、计数信...

InfiniteYuan 2670

(原创)eCos驱动分析 之 ISR是如何与硬件中断联系起来的?

要想知道ecos的中断ISR是怎么与硬件中断向量联系起来的,是怎么被调用的?那就要看下面这两个关键的函数:cyg_drv_interrupt_create()cyg_drv_interrupt_attach()这两个函数都声明在cyg/kernel/kapi.h中,其形式如下:void cyg_interrupt_create(    cyg_vector_t        vector,    ...

gioc的专栏 531

FreeRTOS学习笔记——互斥型信号量

在嵌入式操作系统中互斥型信号量是任务间资源保护的重要手段。

物联网 IoT 经验分享 3万+

flnx 在 mini2440 qemu ecos的nano-x上运行起来了

fltk是一个轻量级的gui,他可以跑在多种窗体管理架构中。 其中flnx就是fltk跑在nano-x上的一个特殊版本, 既然如此,我们就做一次flnx在ecos上的移植,解决ecos的gui问题

嵌入式虚拟系统实验室 1万+

ecos 自带的Microwindows中加入mwin的支持

如何让ecos的Microwindows支持WINAPI和自己内置的一些MWidget呢。 本文粗略的讲述了一下,源码会上传到emboslab

嵌入式虚拟系统实验室 8725
上一篇: 如何编译第一个eCos应用程序
下一篇: eCos可配置性的一点解释
知秋一叶
博客等级 码龄19年 196粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值