目录
2.1 AUTOSAR Spinlock和OPTIMIZED的共有属性
一、Spinlock的概念
Spinlock,自旋锁,是一种跨核心同步机制,其中,TASK/二类ISR在循环中等待(即“自旋”),反复检查共享变量是否变为某个值。该值指示锁是否空闲。
在多核系统中,有些变量被TASK/二类中断共享使用。这些变量的比较和更改通常需要原子操作。 由于在自旋过程中的TASK /二类中断保持活动状态但没有做任何有用的事情,所以,自旋锁是一种繁忙的等待机制。
请读者思考,为什么在单核系统的TASK/二类ISR中不能使用Spinlock?
二、Spinlock的属性
AUTOSAR规范《AUTOSAR_SWS_OS.pdf》7.9.28章节提出了Spinlock的设计需求。在Vector Microsar中,为优化Spinlock的设计,减少程序执行时间,将Spinlock细分为AUTOSAR Spinlock和OPTIMIZED Spinlock两类。
2.1 AUTOSAR Spinlock和OPTIMIZED的共有属性
(1) [SWS_Os_00648]OS提供Spinlock是用于多核系统的相互排斥机制,防止多核系统中的TASK/ISR2跨核访问特定共享数据时产生冲突。
(2) [SWS_Os_00649]OS提供GetSpinlock()用于占有特定Spinlock。如果该Spinlock已经被其它Core的Task/ISR2占有,那么,GetSpinlock()将一直尝试占有直到成功为止。
(3) [SWS_Os_00652]OS提供TryToGetSpinlock()用于占有特定Spinlock。如果该Spinlock已经被其它Core的Task/ISR2占有,那么,TryToGetSpinlock()将立即返回。
(4) [SWS_Os_00655]OS提供ReleaseSpinlock()用于释放特定Spinlock。如果该Spinlock已经没有被占有,那么,ReleaseSpinlock()将产生错误。
2.2 AUTOSAR Spinlock的属性
(1) [SWS_Os_00658]如果TASK尝试占有某Spinlock,但是,其它TASK/ISR2已经占有此Spinlock,且此TASK与其它TASK/ISR属于相同的Core,那么,OS产生OS_STATUS_INTERFERENCE_DEADLOCK的错误。
(2) [SWS_Os_00659]如果ISR2尝试占有某Spinlock,但是,其它TASK/ISR2已经占有此Spinlock,且此ISR2与其它TASK/ISR属于相同的Core,那么,OS产生OS_STATUS_INTERFERENCE_DEADLOCK的错误。
(3) [SWS_Os_00660][SWS_Os_00661]每个Spinlock都有各自的Successor(也就是Order)。在相同的Core上,不同的TASK/ISR2可以占有不同的Spinlock。为了防止TASK/ISR2占有这些Spinlock的顺序不当而产生”交叉死锁“,那么,这些Spinlock被TASK/ISR2占有的顺序是特定的:必须是从Order数字较小的Spinlock开始占用,逐渐往Order数字较大的Spinlock方向占用。如果这些Spinlock被Task/ISR2占有的Order顺序出现”逆流“,那么,OS产生OS_STATUS_NESTING_DEADLOCK的错误。
图1. 嵌套导致死锁的情况(独特注释被屏蔽,欢迎私下交流)
图2. 合理配置Successor可以防止死锁的情况(独特注释被屏蔽,欢迎私下交流)
(4) [SWS_Os_00650][SWS_Os_00651]GetSpinlock()只能在TASK/ISR2中执行。
(5) [SWS_Os_00653][SWS_Os_00654]TryToGetSpinlock()只能在TASK/ISR2中执行。
(6) [SWS_Os_00656][SWS_Os_00657]ReleaseSpinlock()只能在TASK/ISR2中执行。
(7) 在Spinlock的属性中,需要明确指定能够访问Application。如果Spinlock被不具有访问权限的Application中的TASK/ISR2占有,那么,OS将产生OS_STATUS_ACCESSRIGHTS_1的错误。
2.3 OPTIMIZED Spinlock的属性
(1) OPTIMIZED Spinlock类型的Mode和Type属性是由Killing和LockMethod选项决定。
(2) 当Killing的值是disable,且LockMethod的值是NOTHING时,执行“占有、尝试占有和释放Spinlock”程序的内核模式处于普通用户(USER)权限,且不用执行Trace功能。
(3) 当Killing的值是disable,且LockMethod的值是NOT NOTHING时,执行“占有、尝试占有和释放Spinlock”程序的内核模式处于超级管理员(SUPER.)权限,且无需执行Trace功能(由于不能执行Killing功能,所以Trace数据无法保留)。
(4) 当Killing的值是enable时,则不管LockMethod的值是什么,执行“占有、尝试占有和释放Spinlock”程序的内核模式处于超级管理员(SUPER.)权限,且执行Trace功能。
(5) OPTIMIZED Spinlock的Check属性为Disable,即不执行AUTOSAR Spinlock的任何检查。
三、Spinlock的数据结构
3.1 结构体
struct Os_SpinlockType
{
Os_LockType Lock;
P2CONST(Os_ThreadConfigType, TYPEDEF, OS_CONST) OwnerThread;
P2CONST(Os_SpinlockConfigType, TYPEDEF, OS_CONST) PreviousSpinlock;
volatile Os_Hal_SpinlockType Spinlock;
Os_TaskPrioType PreviousPriority;
}
此处,隐晦表述Os_SpinlockType的作用:结构体的内部成员变量在函数运行过程中获取具体值和输出具体值。详细使用方法,欢迎私下交流。
struct Os_SpinlockConfigType
{
Os_LockConfigType Lock;
Os_SpinlockMethodType Method;
Os_TaskPrioType CeilingPriority;
Os_SpinlockModeType Mode;
Os_SpinlockTraceType Trace;
Os_SpinlockCheckType Checks;
Os_SpinlockOrderType Order;
P2CONST(Os_TraceSpinlockConfigType, TYPEDEF, OS_CONST) TimingHookTrace;
}
此处,隐晦表述Os_SpinlockConfigType的作用:此结构体的变量在Os_Spinlock_Lcfg.c中定义初始值。详细使用方法,欢迎私下交流。
3.2 枚举变量
enum Os_SpinlockMethodType
{
OS_SPINLOCKMETHOD_ALL_INT,
OS_SPINLOCKMETHOD_CAT2,
OS_SPINLOCKMETHOD_SCHEDULER,
OS_SPINLOCKMETHOD_NOTHING
}
- SpinlockMethodType的值是由Os/Spinlock的Lock Type选项确定。不同的枚举值表示是在执行GetSpinlock()/TryToGetSpinlock()/ReleaseSpinlock()过程中对操作系统OS的不同影响,其中,OS_SPINLOCKMETHOD_ALL_INT表示关闭OS的全部中断,而OS_SPINLOCKMETHOD_CAT2表示关闭OS的二类中断。
enum Os_SpinlockModeType
{
OS_SPINLOCKMODE_USER,
OS_SPINLOCKMODE_SUPERVISOR
}
- Os_SpinlockModeType的值是由Lock Method 和forcible Termination(Killing)确定。不同的枚举值是表示芯片内核不同的状态,其中,OS_SPINLOCKMODE_USER表示芯片内核处于用户态,OS_SPINLOCKMODE_SUPERVISOR表示芯片内核处于SUPERVISOR态。不同的枚举值,在执行GetSpinlock()/TryToGetSpinlock()/ReleaseSpinlock()过程中会执行不同的函数。
enum Os_SpinlockTraceType
{
OS_SPINLOCKTRACE_DISABLED,
OS_SPINLOCKTRACE_ENABLED
}
- Os_SpinlockTraceType的值是由Lock Method 和forcible Termination(Killing)确定。Trace功能开启时,在执行GetSpinlock()/TryToGetSpinlock()/ReleaseSpinlock()过程中,有Locks链表和spinlocks链表记录和删除当前的spinlock。
enum Os_SpinlockCheckType
{
OS_SPINLOCKCHECK_DISABLED,
OS_SPINLOCKCHECK_ENABLED
}
- Os_SpinlockCheckType的值由Spinlock的类型选择。当Spinlock是AUTOSAR类型时,CheckType是Enable,当Spinlock是OPTIMIZED类型时,CheckType是Disable。
3.3 数据结构一张图
当将结构体和枚举变量等标注在一张图上时,就能清晰看到Spinlock的全貌,从而轻易理解很多复杂的现象,比如Spinlock内不同类型函数的内在逻辑关系。
图3. Spinlock的数据结构一张图(独特注释被屏蔽,欢迎私下交流)
四、Spinlock的函数设计
隐晦的说,Spinlock的函数种类主要分为四种,第一种是公共的Static Inline函数,负责属性操作;第二种是公共的Static Inline函数,负责成员函数;第三种是公用的函数,负责成员函数;第四种是公共的接口,主要对外提供接口。
在此,展示几张新颖独特的函数流程图,供读者参考和赐教。
至于详细的函数设计方法学,欢迎私下交流。
4.1 Os_Api_GetSpinlock
4.2 Os_SpinlockInternalGet
4.3 Os_SpinlockInternalTryGet
4.4 Os_SpinlockGet
五、服务内容
欢迎汽车零部件企业和MCU企业的领导和同仁垂询。
六、参考链接
Vector Microsar解析、国产Mcu适配和自研CP - 哔哩哔哩 (bilibili.com)
(9条消息) Vector Microsar解析、国产Mcu适配和自研CP AUTOSAR_chenchaocai的博客-CSDN博客