前言
从《【OS】AUTOSAR OS Resource实现原理》一文可知,Resources用于实现核内临界区数据的一致性保护,Spinlock用于实现核间(多核)临界区数据的一致性保护。从《RH850U2A芯片平台Spinlock的底层实现》一文可知在RH850芯片上“自旋”的含义就是While()循环中执行SNOOZE指令。。但是站在开发者的角度来讲,Os Spinlock这个概念还是很抽象,Spinlock到底是个在代码中具体是个什么了?本文就来就详细介绍Os Spinlock的具体实现原理,希望能理解以下问题:
问题1:Spinlock为什么只能用于多核之间的数据一致性保护?
问题2:Spinlock在Tricore上“自旋”的具体含义?
问题3:Spinlock在Tricore和RH850芯片上实现原理的异同?
OS相关文章
符合AUTOSAR标准的RTAOS--Counters详解
符合AUTOSAR标准的RTAOS--Event详解
符合AUTOSAR标准的RTA-OS --Resources详解
符合AUTOSAR标准的RTA-OS --Interrupts详解
符合AUTOSAR标准的RTA-OS --Task详解
符合AUTOSAR标准的RTA-OS --功能简介
符合AUTOSAR标准的RTAOS-Alarms详解
【OS】AUTOSAR架构下的中断和异常向量表
【OS】AUTOSAR Os是如何启动第一个Task的
【OS】AUTOSAR OS如何实现Task抢占
【OS】AUTOSAR OS系统调用产生Trap的过程详解
【OS】AUTOSAR OS调度器实现原理
【OS】AUTOSAR OS Resource实现原理
【OS】AUTOSAR OS Counter实现原理(上篇)
【OS】AUTOSAR OS Counter实现原理(下篇)
【OS】AUTOSAR OS Event实现原理
AUTOSAR架构下的OS错误处理
AUTOSAR架构下QM Application如何访问ASIL Application
AUTOSAR架构下多核启动
AUTOSAR架构下多核Shutdown
AUTOSAR架构下多核通信
环境
AUTOSAR工具链:Vector
Hardware Platform: Infineon Tricore
Build Tools: GHS
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
自旋锁用于支持AUTOSAR系统中不同内核上任务的互斥。它们只能跨内核使用,因为它们在同一个内核上没有意义。
Spinlocks实现了一种繁忙(busy waiting)等待机制,该机制轮询锁变量,直到它可用为止(GetSpinlock())。一旦一个锁被一个核心上的任务或ISR占用,其他核心的任务和ISR就无法占用该锁,直到它被释放为止(ReleaseSpinlock())。
通过改用TryToGetSpinlock(),可以避免GetSpinblock()的“愚蠢, dumb”忙碌等待。如果可用,此API将获取锁,但如果不可用,则不会忙于等待。它返回一个成功标志,指示是否已获得锁。如果没有,用户可以自由地做一些工作,稍后再试。
忙于等待锁的任务可能会被更高优先级的任务和ISR抢占。用户应该注意确保抢占代码不会试图获得已被较低优先级代码占用的锁。如果锁定持续时间较短,用户可以考虑锁定资源或禁用锁定部分周围的中断。
示例1:一旦一个锁变量被TASK/ISR2占用,其他Core上的其他TASK/ISR2s将无法占用该锁变量。自旋锁机制在轮询锁变量时不会取消这些其他TASK的调度。然而,在轮询锁变量时,可能会出现具有更高优先级的任务/ISR准备就绪的情况。在这种情况下,旋转任务将受到干扰。
用户可以通过使用SuspendAllInterrupts来保护任务免受这种情况的影响,这样它就不会受到其他任务的干扰。操作系统可以为调用者自动执行此操作,请参阅配置参数OsSpinlockLockMethod.
由于自旋锁的嵌套不正确,很容易进入死锁状态。AUTOSAR试图通过要求在配置中指定唯一的顺序来防止这种情况。自旋锁只能按照指定的顺序锁定/解锁(尽管允许跳过单个自旋锁)。
示例2:第二种死锁情况可以通过嵌套的自旋锁调用来产生。
为了避免死锁,不允许嵌套不同的自旋锁。如果自旋锁应嵌套,则必须定义一个唯一的顺序。只能按此顺序获取自旋锁,但允许跳过单个自旋锁。在定义的顺序内不允许循环。
自旋锁机制本身并不是无死锁的。配置述中必须提到请求Tasks/ISR的自旋锁的顺序。如果任务占用自旋锁,则应限制调度。
自旋锁的配置方式类似于Resources。它们在运行时相对不耗内存,因此使用几个短自旋锁可能比使用几个多用途自旋锁更有效。
Spinlock配置参数如下图所示。
Short Name: 定义Spinlock的名字,生成的代码会引用这个名字。
Spinlock Lock Method: 获取到Spinlock后同步进行的操作,有以下4个选项
LOCK_ALL_INTERRUPTS , 获取Spinlock时挂起所有中断。
LOCK_CAT2_INTERRUPTS , 获取Spinlock时挂起二类中断。
LOCK_WITH_RES_SCHEDULER , 获取Spinlock时提高当前的Task优先级到最高优先级。
LOCK_NOTHING , 获取Spinlock时没有Lock操作。
默认是LOCK_NOTHING值。
注意:Spinlock Lock Method配置为哪个参数,取决于实际的工程需求。
1.如果在中断中抢占当前Task后可能去获取Spinlock,从而可能产生死锁(dead lock),就将Spinlock Lock Method配置为LOCK_ALL_INTERRUPTS,从而在Task获取Spinlcok的时候挂起所有中断,避免该问题的产生。
2.如果在二类中断中抢占当前Task后可能去获取Spinlock,从而可能产生死锁(dead lock),就将Spinlock Lock Method配置为LOCK_CAT2_INTERRUPTS,从而在Task获取Spinlcok的时候挂起二类中断,避免该问题的产生。
3.如果高优先级Task抢占当前Task后可能去获取Spinlock,从而可能产生死锁(dead lock),就将Spinlock Lock Method配置为LOCK_WITH_RES_SCHEDULER,从而在Task获取Spinlcok的时候将本身优先级提高到最高优先级,避免该问题的产生。
4.如果以上场景都不可能出现,就配置为LOCK_NOTHING.
Spinlock Type: 配置Spinlock的类型,提供以下的两个配置参数。
STANDARD: 标准Autosar实现方式。
OPTIMIZED: MICROSAR OS优化后的实现方式。
对于多核系统中的数据一致性保护,MICROSAR Classic OS提供了(在AUTOSAR指定的操作系统自旋锁之下)额外的优化自旋锁。它们能够减少Spinlock API的运行时间。
AUTOSAR指定的操作系统自旋锁不会导致内核之间的任何死锁(请参阅AUTOSAR操作系统标准中嵌套操作系统自旋锁定的唯一顺序)。因此,有必要对操作系统配置数据进行一些错误检查。优化后的自旋锁不会执行这些错误检查。
Standard Spinlock和Optimized Spinlock的区别如下表所示:
Standard Spinlocks | Optimized Spinlocks | |
死锁 | 不可能产生死锁 | 可能产生死锁 |
执行时间 | 由于有错误检查,会产生更多的执行时间 | 没有错误检查,执行时间更少 |
配置 | 如果Spinlock必须被嵌套使用,则必须配置OsSpinlockSuccessor | 如果Spinlock必须被嵌套使用,不需要OsSpinlockSuccessor |
嵌套 | 可以被其他Os Spinlocks嵌套使用 | 应避免嵌套优化的自旋锁,或至少谨慎使用 |
Spinlock Successor: 引用下一个被嵌套使用的Spinlock. 需要嵌套使用Spinlock时才需要配置此参数。
示例:有如下的Spinlock使用场景时,就需要配置Spinlock Successor参数了。
GetSpinlock(OsSpinlock_Test)
/* Spinlock_Test protection context operations */
GetSpinlock(OsSpinlock_3)
/* Spinlock_3 protection context operations */
ReleaseSpinlock(OsSpinlock_Test)
ReleaseSpinlock(OsSpinlock_Test)
用户调用Os的标准接口后,都会产生Os Trap最后调用到Os的内部实现函数Os_Api_xxx(). 具体可以参考《【OS】AUTOSAR OS系统调用产生Trap的过程详解》。
也就是说:
GetSpinlock-> Os_Api_ GetSpinlock -> Os_TrapSpinlockGet -> Os_SpinlockGet
ReleaseSpinlock-> Os_Api_WaitEvent -> Os_TrapSpinlockRelease -> Os_SpinlockRelease
TryToGetSpinlock-> Os_Api_TryToGetSpinlock -> Os_TrapSpinlockTryGet -> Os_TrapSpinlockTryGet
感兴趣的可以阅读下篇 !
End
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;
注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
汽车电子嵌入式精彩文章汇总第2期
汽车电子嵌入式精彩文章汇总第3期
【OS】AUTOSAR OS Event实现原理
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号