사용 보드 정보

Vendor: Nuvoton

Device: M2351KIAAE

 

사용 툴: uVision Keil

 

Stack pointer도 일단은 register이기 때문에 직접 조작하려면 assembly가 필요하다. 따라서 __asm__ __volatile__ 키워드를 통해 arm inline assembly를 사용한다.

 

1. Inline assembly의 literal string에 직접 써서 옮기기

예를 들어 0x20만큼 옮긴다고 하면,

 

__asm__ __volatile__("SUB sp, sp, #0x20");

// ... main firmware routine

__asm__ __volatile__("ADD sp, sp, #0x20");

 

2. Input operand를 사용하여 임의의 offset만큼 옮기기

예를 들어 STACK_OFFSET_MEM에 임의의 offset을 저장했다고 하면,

SUB sp, sp, Rm의 형태는 사용할 수 없으므로 연산 가능한 레지스터에 값을 옮기고 연산하여 다시 stack pointer에 집어넣는 방식을 취한다. Lo register (r0 ~ r7)은 실행 과정에서 자주 사용되므로 잘 안쓰는 레지스터에 값을 백업해두고 복원하였다.

 

__asm__ __volatile__(" \
MOV r11, r3; \
MOV r10, r4; \
MOV r4, sp; \
ADDS r3, r4, %0; \
MOV sp, r3; \
MOV r3, r11; \
MOV r4, r10 \
" \
: \
: "r"(STACK_OFFSET_MEM) \
);

// ... main firmware routine

// (SUBS STACK_OFFSET_MEM)

 

여기서 임의의 값은 M2351KIAAE보드의 TRNG 함수를 사용해서 가져왔다.

thumb모드의 제약과 input operand 문법이 생소해서 고생했다..

 

Inline assembly 참고 링크

https://developer.arm.com/documentation/dui0489/i/arm-and-thumb-instructions/sub

 

http://www.ethernut.de/en/documents/arm-inline-asm.html

 

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

 

https://developer.arm.com/documentation/100748/0617/Using-Assembly-and-Intrinsics-in-C-or-C---Code/Writing-inline-assembly-code?lang=en

 

Arm embedded program flow 참고 링크

http://www.vlsiip.com/c/embedded_c/ec_0002.html

 

http://recipes.egloos.com/5044366

 

https://openmicrolab.com/arm-cortex-m0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98/

 

__scatterload의 역할 참고 링크

https://community.arm.com/support-forums/f/compilers-and-libraries-forum/7240/__scatterload-function-in-arm-c-library/22072

 

 

'프로그래밍 기타' 카테고리의 다른 글

자료형에서의 overflow와 underflow에 대하여  (0) 2021.03.05

오버플로우 관련 이미지를 찾는데 뭔 애니메이션이 있더라.. 이미지가 없으면 허전하니까 히로인만 슥 그려봤다.

우선 overflow는 다들 알거라고 생각한다.

예를 들어 4바이트의 크기를 가지는 정수 자료형인 경우 2^31 - 1 에서 1을 더하면 -(2^31)로 바뀌는 뭐 그런 현상들이다.

 

그러나 한글로 구글링을 좀 해보면 -(2^31) - 1이 2^31 - 1로 변하는 현상을 underflow라고 지칭하는 경우를 매우 많이 보게 된다. 즉 음수값이 절대값 max를 넘기면 양수가 되는 현상을 underflow라고 소개하는 포스팅이 많다. (영문으로 검색하면 제대로 된 정의를 찾을 수 있다)

 

 

이에 아래와 같이 밝혀둔다.

 

1. 정확히는 상한 뿐 아니라 하한을 넘겨서 반대쪽 값이 나오는 경우도 모두 overflow이다. 정수나 unsigned 자료형에서 하한 max값을 넘어서 반대쪽 값이 나오는 현상이라고 해서 underflow가 아니다.

 

2. IEEE 754의 부동소수점 기술표준에 의하면 부동소수점으로 표현할 수 없는 절대값이 매우 작은 값을 표현하려 할 때 -0 혹은 +0으로 표현되는 현상(단, 두 경우 모두 부호 없이 0으로 표기된다)이 underflow이다.

 

3. 그게 그거 아니냐고 생각할 수 있는데, 정수 산술계산중에 캐리가 올라가서 반대쪽 값이 튀어나오는거랑 부동소수점에서 표현할 수 없는 절대값이 아주 작은 값을 0으로 고정해버리는 동작은 절대 같다고 볼 수 없다. 따라서 구분짓는게 옳다.

 

4. 영어로는 arithmetic underflow를 underflow라고 부른다. 하지만 정수나 unsigned 자료형에서 하한 max값을 넘어서 반대쪽 값이 나오는 경우에 underflow라는 명칭을 붙이고 싶은 경우 integer underflow라고 부르기도 하는 것 같다.

 

 

사실 뜻은 통하니까 실제로 잘못 말하는 사람이 있어도 그러려니 하고 넘어가긴 한다. 하지만 용례는 용례고, 정확한 정의는 짚고 넘어가는게 옳으니 대충이나마 설명해서 써둔다. 전공자라면 논리회로 강의 초반에 다뤄지는 내용이니 되새겨보자.

+ Recent posts