1.临界区
临界区是指必须以互斥的方式执行的代码段,也就是说临界区范围内只能由一个活动的线程。例如:修改共享变量的过程中其他的执行线程可能会访问共享变量,那么修改共享变量的代码就被看成是临界区的一部分。临界区问题指用安全、公平和对称的方式来执行临界区代码的问题
2.管理临界区的三种方法
第一种方法
#if OS_CRITICAL_METHOD == 1 #define OS_ENTER_CRITICAL() __asm__("cli") #define OS_EXIT_CRITICAL() __asm__("sti") #endif
第二种方法
#if OS_CRITICAL_METHOD == 2 #define OS_ENTER_CRITICAL() __asm__("pushf \n\t cli") #define OS_EXIT_CRITICAL() __asm__("popf") #endif
第三种方法
#if OS_CRITICAL_METHOD == 3 #define OS_ENTER_CRITICAL() (cpu_sr = OSCPUSaveSR()) #define OS_EXIT_CRITICAL() (OSCPURestoreSR(cpu_sr)) #endif
#if OS_CRITICAL_METHOD != 3u #error "OS_CPU.H, OS_CRITICAL_METHOD must be type 3 for safety-critical release code" #endif
3、M3第三种临界管理方式及使用。
3.1 函数包装
#define OS_CRITICAL_METHOD 3u #if OS_CRITICAL_METHOD == 3u #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} //进入临界段 #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} //退出临界段 #endif
3.2 OS_CPU_SR_Save和OS_CPU_SR_Restore
OS_CPU_SR_Save MRS R0, PRIMASK ;Set prio int mask to mask all (except faults) CPSID I ; PRIMASK =1 ,关中断 BX LR OS_CPU_SR_Restore MSR PRIMASK, R0 ;把R0的值加载到PRIMASK,R0为调用 ;OS_CPU_SR_Restore的函数的参数 BX LR
其中PRIMASK是M3除能所有中断寄存器。CPSID是M3为了快速地关中断而专门设置的一指令。
void Task (void *p_arg) { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for*/ /*CPU status register */ OS_CPU_SR cpu_sr; #endif OS_ENTER_CRITICAL(); /*cpu_sr = OS_CPU_SaveSR()*/ 。。。 。。。 OS_EXIT_CRITICAL(); /*OS_CPU_RestoreSR(cpu_sr) */ }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222301.html原文链接:https://javaforall.net
