Xenomai ipipe spinlock

2023-10-10 06:18
文章标签 xenomai ipipe spinlock

本文主要是介绍Xenomai ipipe spinlock,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

I-pipe spinlocks

有时需要在实时域和Linux域之间共享spinlocks. 我们在"Hardware timer", "Interrupt controller" 和 "GPIOs" section有谈到.
但是, 注意, 这不是一剂灵丹妙药, 必须注意在保持自旋锁时不能调用任何Linux服务,或其他任何可能导致极大时间的处理, 不然,你将冒打破实时性的风险.
Xenomai提供了一些宏来将spinlock转换成一个I-pipe spinlock.

Linux codeShould be replaced with
extern raw_spinlock_t fooIPIPE_DECLARE_RAW_SPINLOCK(foo)
DEFINE_RAW_SPINLOCK(foo)IPIPE_DEFINE_RAW_SPINLOCK(foo)
extern spinlock_t fooIPIPE_DECLARE_SPINLOCK(foo)
DEFINE_SPINLOCK(foo)IPIPE_DEFINE_SPINLOCK(foo)


例如, 在 arch/arm/common/gic.c

static DEFINE_SPINLOCK(irq_controller_lock);

替换成:

static IPIPE_DEFINE_SPINLOCK(irq_controller_lock);

同时, 除了通常的 spin_lock, spin_unlock,spin_lock_irqsave, spin_unlock_irqrestore之外, I-pipe 核也提供了 spin_lock_irqsave_cond, spin_unlock_irqrestore_cond. 这两个宏会在I-pipe核使能的情况下被替换成spin_lock_irqsave/spin_unlock_irqrestore, 在I-pipe无效的情况下,会被替换成spin_lock/spin_unlock.

当spin_lock/spin_unlock被用于Linux代码段访问和中断服务例程共享的资源, 这就会发挥作用. 当运行I-pipe核时, 中断服务例程可能运行在实时Domain, 这时该代码段除了Xenomai Domain的中断外,不能受Linux中断影响,  所以spin_lock/spin_unlock需要改成spin_lock_irqsave_cond/spin_unlock_irqrestore_cond.

一个例子就是arch/arm/common/gic.c, "structirq_chip", "irq_hold", "irq_release" 函数会被实时上下文调用, 这里使用 "irq_controller_lock" spinlock, 所以对该spinlock的调用应该改成spin_lock_irqsave_cond/spin_unlock_irqrestore_cond. 

原文 : http://www.xenomai.org/index.php/I-pipe-core:ArmPorting#I-pipe_spinlocks

这篇关于Xenomai ipipe spinlock的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/178536

相关文章

nginx学习之自旋锁nginx_spinlock

nginx中自旋锁简介: 基于原子操作,Nginx实现了一个自旋锁。自旋锁是一种非睡眠锁,也就是说,某进程如果试图获得自旋锁,当发现锁已经被其他进程获得时,那么不会使得当前进程进入睡眠状态,而是始终保持进程在可执行状态,每当内核调度到这个进程执行时就持续检查是否可以获取到锁。在拿不到锁时,这个进程的代码将会一直在自旋锁代码处执行(下面的源码会分析到),知道其他进程释放了锁且当前进程获取

五、自旋锁(spinlock)

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。   由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。   信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(_

【讯为Linux驱动开发】6.自旋锁spinlock

【自旋锁】 线程A获取自旋锁后,B假如想获取自旋锁则只能原地等待,仍占用CPU,不会休眠,直到获取自旋锁为止。 【函数】 DEFINE SÃINLOCK(spinlock t lock)   定义并初始化一个变量int spin lock init(spinlock t*lock)   初始化自旋锁void spin lock(spinlock t *lock)    获取自旋锁。也叫做加

JOS中 spinlock 的实现

JOS中  "spinlock" 的实现 In software engineering, a spinlock is a lock which causes a thread trying to acquire it to simply wait in a loop ("spin") while repeatedly checking if the lock is availa

spinlock_t

头文件: #include <linux/spinlock.h> 定义: typedef struct spinlock {union {struct raw_spinlock rlock;#ifdef CONFIG_DEBUG_LOCK_ALLOC# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))struct

Spinlock kernel lock mechanism

一、概述 spinlock是kernel的一种锁机制 kernle的锁机制有三种: spinlock mutex semaphore 在设备驱动开发中,spinlock与mutex比较常用 一个thread去获取spinlock的时候是会不断的去轮询的,比较耗用cpu资源。(在mutex的时候,是进入sleep,所以不耗cpu资源)。所以spinlock用在很短的lock任务下。

spinlock原理

代码路径 arch/arm/include/asm/spinlock.h 锁数据结构如下: 注意sllock和下面的ticket互为union 基本原理: spinlock 叫号机制,先拿到一个号, 即为先在slock基础上给next++ unspinlock放锁时给owner++。 放锁后正好使next== owner

菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock

分类: Server - 菜鸟nginx源码剖析 2014-11-11 20:48 15080人阅读 评论(0) 收藏 举报 nginx 源码 自旋锁 spinlock 剖析 目录(?)[+]   菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock   Author:Echo Chen(陈斌) Email:chenb19870707@g

迅为iTOP-3568开发板助力实时系统,Preemption与Xenomai

iTOP-RK3568开发板使用手册上新,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。 iTOP-RK3568开发板支持了Preemption和Xenomai实时系统。 实时系统以其卓越的实时性能,为用户提供出色的体验,《iTOP-3568开发板实时系统使用手册》将对实时系统的选择、编译烧写、测试等方面进行详细讲解。 第1章 实时系统简介

nginx自旋锁ngx_spinlock分析

以前也看过linux内核自旋锁的实现代码,现在工作主要是应用程序开发,对应用程序开发不是太了解,我喜欢通过看优秀的开源软件学习软件开发,之前对linux kernel感兴趣就是看内核代码,现在工作需要http,数据库,网络编程这方面的只是,我想学习http和网络编程看完nginx我想也差不多了。 void ngx_spinlock函数代码: voidngx_spinlock(ngx_a