Engineering Agit

[Embedded engineering study 01] - Endianness? 본문

Personal Study/Embedded engineering

[Embedded engineering study 01] - Endianness?

Sean_Kim95 2020. 10. 10. 17:18

◈ 여는 글

 IDE에서 debugging시에 memory browsing을 하면 다음과 같이 'TI-32bit format'으로 볼 때와 'TI-8bit format'으로 볼 때 순서가 바뀌어있다. 동일한 register에 동일한 값을 넣었는데 이와 같이 나타나는 이유를 알아보고자 한다.

<Fig. 1-1> 32bit로 보았을 때
<Fig. 1-2> 8bit로 보았을 때


1. TM4C123GH6PM의 memory structure

<Fig. 2-1> Memory map of the TM4C123 (http://users.ece.utexas.edu/~valvano/Volume1/E-Book/)

 TM4C123GH6PM의 경우에는 위의 그림과 같은 memory structure를 갖는다. 각각의 address 값이 32bit값이므로 이 MCU를 32bit MCU라고 칭하며, 각각의 address에는 1byte(8bit) 크기의 값이 담길 수 있다. TM4C123은 각각의 register의 크기를 32bit로 가지므로 하나의 register는 4개의 주소를 차지한다고 말할 수 있다. 그러면 위의 <Fig. 1-2>는 다음과 같이 0xC1004000의 값이 memory address에 각각 1byte씩 0x400FE070번지에는 '00', 0x400FE071번지에는 '40', 0x400FE072번지에는 '00', 그리고 0x400FE073번지에는 'C1'이 담겨있다는 의미가 된다. 그러나 기분 상, 앞번지에 Most Significant Byte(C1)를 담고 마지막 번지에 Least Significant Byte(00)를 담는 것이 좋을 것 같은 데 이렇게 담는 것을 무엇이라 하며 왜 이렇게 하는지에 관해서는 'endianness'를 알아봐야 한다.


2. Endianness

<Fig. 3-1> Simply explained endianness (https://thebittheories.com/little-endian-vs-big-endian-b4046c63e1f2)

 위의 그림은 endianness를 설명하는 아주 좋은 그림이다. Endian은 두 가지 종류가 있고 그 정의는 다음과 같다.

Endianness Definition
Big-endian (BE) MSB(Byte)를 가장 낮은 주소값에 넣고 LSB(Byte)를 가장 높은 주소값에 넣는 방식
Little-endian (LE) LSB를 가장 낮은 주소값에 넣고 MSB를 가장 높은 주소값에 넣는 방식

위키피디아를 보면(en.wikipedia.org/wiki/Endianness) BE는 주로 TCP/IP와 같은 네트워킹 프로토콜에 사용되며, LE는 x86, 대부분의 ARM processor, 기본 RISC-V 등 processor architecture에 사용된다. 어떤 경우에는 위의 두 가지 방식을 혼합하여 사용한다고 한다.

 그러면 어떠한 장점이 각각 있길래 방식을 구분하여 사용하는 것 일까?

  • Pros of Little-endian:

다양한 type size들의 값을 읽기에 용이하다. 예를 들어, 어떤 변수에 0x04라는 값을 넣으면 32bit 기준 0x04.00.00.00으로 각 address에 저장이되는데 이는 type size가 어떻게 되는 항상 값을 0x04로 읽을 수 있게 된다. Big-endian의 경우에는 type size를 정확히 알아야 값을 알 수 있다.

② 값을 작은 type으로 cast하기에 용이하다(예를 들어 int16_t의 값을 int8_t로). 이는 int16_t의 시작 byte가 int8_t이기 때문이다.

③ 수학적 연산에 용이하다. 이는 address offset과 byte number(offset 0은 byte 0)가 1:1의 관계를 갖기 때문이다.

  • Pros of Big-endian:

 값이 양수냐 음수냐를 체크하기 위해 offset 0에서의 byte를 본다. 따라서 이는 데이터를 전송 받는 상황에서는 가장 먼저 확인해볼 수 있기에 비교하기 용이하다.

② 값이 저장된 순서가 출력되는 순서와 같으므로 binary값을 decimal값으로 변환하는 routine이 효율적으로 진행된다.


1. https://en.wikipedia.org/wiki/Endianness
2. https://uynguyen.github.io/2018/04/30/Big-Endian-vs-Little-Endian/
Comments