English

커널구조-크리티컬 섹션구현 #3

2008.02.26 10:45

권오용 Views:3672 Recommend:50

OS_CRITICAL_METHOD  == 3을 이용해 OS_ENTER_CRITICAL()과 OS_EXIT_CRITICAL()을 구현한 소스는 다음과같이

void Critical_Section(argument)

{

    OS_CPU_SR cpu_sr;--------------(1)

    cpu_sr=get_processor_psw()------(2)

    disable_interrupts();-------------- (3)

   /*크리티컬 섹션(=임계영역)*/

    set_processor_psw(cpu_sr)-------(4)

}

(1) : OS_ENTER_CRITICAL()과 OS_EXIT_CRITICAL()의 내부에 CPU_SR변수가 있다고 가정하며

        반드시 내부에 CPU_SR변수가 존재해야 한다.



(2) : 크리티컬섹션(=임계영역)으로 들어가려면 psw(Arm에선 cpsr이라함)의 현재상태를 읽기위해

        컴파일러가 제공하는 함수를 호출함. (함수이름은 구현하기에따라 틀릴수도 있음.)



(3) : 인터럽트 비활성화



(4) : 인터럽트 활성화 psw(cpsr)의 이전상태를 복구한다.





위에 글은 OS_CRITICAL_METHOD  == 3에 대한 의사코드이고 아랫부분은 이를 구현한 코드이다.

코드는 어셈블러코드로 정의되어있다.

-------------------------------------OS_ENTER_CRITICAL()----------------------------------------------------

CPU_SR_Save:
        MRS     R0, CPSR

CPU_SR_Save_Loop:                                                                // Set IRQ & FIQ bits in CPSR to DISABLE all interrupts
        ORR     R1, R0, #CPU_ARM_CTRL_INT_DIS
        MSR     CPSR_c, R1
        MRS     R1, CPSR                                        // Confirm that CPSR contains the proper interrupt disable flags
        AND     R1, R1, #CPU_ARM_CTRL_INT_DIS
        CMP     R1,     #CPU_ARM_CTRL_INT_DIS
        BNE     CPU_SR_Save_Loop                                // NOT properly DISABLED (try again)
        BX      LR                                              // DISABLED, return the original CPSR contents in R0

-------------------------------------OS_ENTER_CRITICAL() END-----------------------------------------------

윗부분이 (2),(3)에 해당하는 부분이며
아랫부분이 (4)내용에 해당하는 부분이다.

-------------------------------------OS_EXIT_CRITICAL()------------------------------------------------------

CPU_SR_Restore:                                                  // See Note #2
        MSR   CPSR_c, R0
        BX      LR

-------------------------------------OS_EXIT_CRITICAL() END-------------------------------------------------