Sunday, June 17, 2018

iar stm8에서 재미있는 트릭.

stm8은 register만 봤을 때, 8086과 같은 CISC구조를 채용하고 있다.
그래서 적은 수의 register(A, X, Y, SP, PC, CC)를 제공하고 있다.

하지만, C기준으로 보다면, 함수 내에서 수개의 variable을 유지하면서 기능을 수행하는 것이 일반적이며 현대의 많은 compiler들은 이러한 부분에 대해서 최적화되어 있다.

이 말은, compiler는 더 나은 성능을 위해서 stm8이 제공하는 register보다 많은 수의 register를 사용하기를 원한다.

이런 간극을 해결하기 위해서 (IAR에 한정된 이야기일 수 있지만) stm8 compiler는 virtual register라는 가상의 register를 채용하고 있다.
이 register는 실제로 register가 아니라 memory상의 영역이다.

IAR stm8의 경우 모두 1byte 16개, 혹은 2 bytes 8개, 4 bytes 4개의 virtual register를 제공하며,
이 virtual register의 위치는 0x0부터 0x10 번지에 위치한다.

그 이름은 ?b0 ~ ?b15 혹은 ?w0 ~ ?w8,  ?i0 ~ ?i4..

이 레지스터는 ARM에서와 같이 용도가 정해져있다.

b0~b7의 경우 scratch register로 caller가 필요시 저장(push)되기 때문에 function내에서는 버려도 상관없다.
b8~b15의 경우, callee가 책임을 지고 유지해야하는 register이며, RTOS에서는 context에 포함되어 저장되어야 한다.

No comments: