728x90
반응형
MSP430의 nesting 관련 내용을 찾다보니 다시 정리할 것이 생긴다.
오늘은 정리의 날인가.
중첩 인터럽트 관련,
인터럽트가 실행되는 경우,
GIE bit 설정 여부에 따라 중첩 실행 시의 조건이 달라짐에 대한 정보를 확인하였다.
그럼 GIE 비트가 무엇인지에 대하여 살펴보도록 한다.
GIE란 CSR(Control Status Register)의 0번째 비트로 이 값의 셋팅 여부를 통하여 Status Register의 값이
변경가능해지며, MSP430에서의 Status Register는 r2 레지스터를 사용하고 있다.
이를 이용하여 중첩 기능을 사용코자 하는 경우 아래의 명령을 사용할 수 있다.
#define _BIS_SR(x) __asm__ __volatile__("bis %0, r2" : : "i" ((uint16_t) x))
ISR()
{
tmp_sr = _BIS_SR(GIE);
}
흠 ... ... 인라인 어셈이라 ㅡ,.ㅡ;;;
위의 내용은 간략히 표현하는 경우 아래와 같다.
asm("bis %src,%res": [res] "=r" (result): [src] "m" (source));
이를 다시 간략히 표현하면 아래와 같아진다.
"bis %src, %res"
결과적으로는 아래와 같이 표현할 수 있다고 생각한다.
"bis %0, r2"
r2 레지스터에 대하여 bis 명령으로 %0라는 인자를 처리해준다고 보면 될 것인데, bis명령이 무엇인지만 안다면 문제는 쉽다.
bis : bit set
bic : bit clear
위와 같이 스스로 판단하였다. 물론 틀릴 가능성도 높지만, 댓글로 지적해주신다면 정말 감사하겠다.
그런고로,
_BIS_SR(GIE)를 실행하는 것은 r2 레지스터에 GIE 값을 넣어주는 것이 되는 데,
참고로 GIE는 0x0008로 정의되어 있으며, 이는 r2 레지스터를 "1"로 셋팅 함을 의미한다.
위에 bis와 관련하여 bic를 언급하였다. 물론 아래를 작성하기 위해서이다.
_BIC_SR(GIE) 또한 사용가능한데,
이는 SR(Status Register : r2 register in MSP430)을 GIE 값만큼 클리어 해주는 기능을 한다.
그러므로 r2 레지스터는 "0"로 셋팅 될 것이다.
정작 중요한 r2 레지스터 값에 따른 실행 상태를 설명하지 않았다.
자세히 알지도 못하지만 간략히 정리해보자.
r2 레지스터의 값이 0인경우 : 인터럽트가 중첩으로 발생될 경우 우선순위와 관계없이 pending처리하여 순차적 처리를 실행
r2 레지스터의 값이 1인경우 : 인터럽트가 중첩으로 발생될 경우 우선순위와 관계없이 nesting처리하여 nested interrupt 실행
결국엔 위의 두 줄을 쓰고 싶어 주저리 주저리 된 상황이다. ㅡ,.ㅡ;;
오늘은 정리의 날인가.
중첩 인터럽트 관련,
인터럽트가 실행되는 경우,
GIE bit 설정 여부에 따라 중첩 실행 시의 조건이 달라짐에 대한 정보를 확인하였다.
그럼 GIE 비트가 무엇인지에 대하여 살펴보도록 한다.
GIE란 CSR(Control Status Register)의 0번째 비트로 이 값의 셋팅 여부를 통하여 Status Register의 값이
변경가능해지며, MSP430에서의 Status Register는 r2 레지스터를 사용하고 있다.
이를 이용하여 중첩 기능을 사용코자 하는 경우 아래의 명령을 사용할 수 있다.
#define _BIS_SR(x) __asm__ __volatile__("bis %0, r2" : : "i" ((uint16_t) x))
ISR()
{
tmp_sr = _BIS_SR(GIE);
}
흠 ... ... 인라인 어셈이라 ㅡ,.ㅡ;;;
위의 내용은 간략히 표현하는 경우 아래와 같다.
asm("bis %src,%res": [res] "=r" (result): [src] "m" (source));
이를 다시 간략히 표현하면 아래와 같아진다.
"bis %src, %res"
결과적으로는 아래와 같이 표현할 수 있다고 생각한다.
"bis %0, r2"
r2 레지스터에 대하여 bis 명령으로 %0라는 인자를 처리해준다고 보면 될 것인데, bis명령이 무엇인지만 안다면 문제는 쉽다.
bis : bit set
bic : bit clear
위와 같이 스스로 판단하였다. 물론 틀릴 가능성도 높지만, 댓글로 지적해주신다면 정말 감사하겠다.
그런고로,
_BIS_SR(GIE)를 실행하는 것은 r2 레지스터에 GIE 값을 넣어주는 것이 되는 데,
참고로 GIE는 0x0008로 정의되어 있으며, 이는 r2 레지스터를 "1"로 셋팅 함을 의미한다.
위에 bis와 관련하여 bic를 언급하였다. 물론 아래를 작성하기 위해서이다.
_BIC_SR(GIE) 또한 사용가능한데,
이는 SR(Status Register : r2 register in MSP430)을 GIE 값만큼 클리어 해주는 기능을 한다.
그러므로 r2 레지스터는 "0"로 셋팅 될 것이다.
정작 중요한 r2 레지스터 값에 따른 실행 상태를 설명하지 않았다.
자세히 알지도 못하지만 간략히 정리해보자.
r2 레지스터의 값이 0인경우 : 인터럽트가 중첩으로 발생될 경우 우선순위와 관계없이 pending처리하여 순차적 처리를 실행
r2 레지스터의 값이 1인경우 : 인터럽트가 중첩으로 발생될 경우 우선순위와 관계없이 nesting처리하여 nested interrupt 실행
결국엔 위의 두 줄을 쓰고 싶어 주저리 주저리 된 상황이다. ㅡ,.ㅡ;;
728x90
반응형
댓글