FW 심화 과정/[2] STM32심화실습

0808 netsted(중첩) / priority(우선순위) Interrupt

천숭이 2022. 8. 8. 16:13

우선순위 설정 방법. stm32에서는 하위 4비트 사용 x

 

 


     /*  -> NON ATOMIC OPERATION
     __set_PRIMASK(1);
        rGPIOD->ODR = rGPIOD -> ODR ^ (0X1 << 13);
     __set_PRIMASK(0);
     */


     // -> ATOMIC OPERATION
     bGPIOD_ODR_13 = 1;
     bGPIOD_ODR_13 = 0;

위 코드는 main문에서 실행되는 코드

non alias 메모리를 통해서 작동하기 위해서는 __set_PRIMASK 로 임계영역을 설정해줘야 함

alias 메모리를 사용하면, 임계영역 설정해주지 않아도 됨

 

 

 

 

 


   // priority of irq6
	 *(char *) 0xE000E406 = 0x30;
   
   // priority of irq23
	 *(char *) 0xE000E417 = 0x40;	
   
   // priority of irq15
	 *(char *) 0xE000E428 = 0x50;	 
   
	 __set_BASEPRI(0x40);

위 코드에서 시스템 우선순위의 값이 4로 설정 되어있기 때문에 (하위 네비트는 사용안하므로 4번쨰 인덱스부터 값 할당)

우선순위가 3인 irq6만 실행되고 나머지 두 동작은 pending됨.

 

 

 

 

 

 


 

main 에서의 sfr접근 동작을 PRIMASK 조정을 통해 제어

systic interrupt 동작을 못하도록 막아줘 문제를 해결하는 방법