임계영역 처리(인터럽트 금지)
한 태스크내의 작업에서 공유될 수 없는 시스템 자원에 접근하여 연산을 하고자할 때
이 연산이 종료될 때 까지 어떠한 다른 태스크가 이 시스템 자원에 접근을 할 수 없어야 한다.
현재 공유 불가능한 자원에 대해서 연산하고 있는 하나의 태스크는 해당 자원과 관계된 임계영역에
있다고 말한다.
따라서 임계영역을 실행하기 전에는 인터럽트를 비활성화 하고 임계영역의 작업이 모두 끝난 후에
인터럽트를 다시 활성화 해야한다.
ARM에서의 인터럽트 비활성/활성화 방법
///////////////////////////////////////////////////////////
// 원 형 : unsigned int arm_int_lock(void)
// 기 능 : ARM 내의 FIQ / IRQ 익셉션을 비활성화 한다.
// 리턴값 : 비활성화 하기전의 상태레지스터 32bit
// 인 자 : 없음
///////////////////////////////////////////////////////////
.global arm_int_lock
arm_int_lock:
mrs r0, cpsr // 현재 상태 레지스터 r0복사
orr r1, r0, #I_BIT | F_BIT // r1 = r0 or IBIT or FBIT (cpsr의 I/F 비트를 세트시켜 비활성화)
msr cpsr_c, r1 // cpsr = r1 (실제 인터럽트 금지 명령수행)
mrs r1, cpsr // r1 = cpsr (현재 상태 레지스터 r1복사)
cmp r0, r1 // r0, r1 비교
beq arm_int_lock // r0, r1값이 같으면 다시 수행(인터럽트가 금지되지 않았단말)
bx lr // 복귀 및 r0 리턴
///////////////////////////////////////////////////////////
// 원 형 : void arm_int_unlock(unsigned int)
// 기 능 : ARM 내의 FIQ / IRQ 익셉션을 활성화 한다.
// 리턴값 : 없음
// 인 자 : 비활성화 하기전의 상태레지스터 32bit
///////////////////////////////////////////////////////////
.global arm_int_unlock
arm_int_unlock:
msr cpsr_c, r0 // 인자로 받아온 인터럽트가 비활성화 되기 전의
// 상태레지스터값을 형재 상태레지스터에 넣는다
bx lr // 복귀