답변:
코드 밀도는 요청 된 작업을 수행하는 데 필요한 마이크로 프로세서 명령 수와 각 명령이 차지하는 공간의 양을 느슨하게 나타냅니다. 일반적으로 말하면, 명령이 차지하는 공간이 적고, 마이크로 프로세서가 수행 할 수있는 명령 당 작업이 많을수록 코드의 밀도가 높아집니다.
질문에 'arm'태그로 태그를 추가했습니다. ARM 명령어를 사용하여 코드 밀도를 설명 할 수 있습니다.
메모리의 한 곳에서 다른 곳으로 데이터 블록을 복사한다고 가정 해 봅시다. 개념적으로 고급 코드는 다음과 같습니다.
void memcpy(void *dest, void *source, int count_bytes)
{
char *s, *d;
s = source; d = dest;
while(count_bytes--) { *d++ = *s++; }
}
이제 간단한 마이크로 프로세서를위한 간단한 컴파일러는 이것을 다음과 같은 것으로 변환 할 수 있습니다 :
movl r0, count_bytes
movl r1, s
movl r2, d
loop: ldrb r3, [r1]
strb [r2], r3
movl r3, 1
add r1, r3
add r2, r3
sub r0, r3
cmp r0, 0
bne loop
(내 ARM은 조금 녹슬지 만 아이디어를 얻습니다)
이제 이것은 매우 간단한 컴파일러와 매우 간단한 마이크로 프로세서이지만 루프 반복마다 8 개의 명령어를보고 있음을 알 수 있습니다 ( '1'을 다른 레지스터로 이동하고로드를 이동하는 경우 7) 루프 외부). 그것은 전혀 조밀하지 않습니다. 코드 밀도도 성능에 영향을줍니다. 코드가 밀도가 높지 않아 루프가 길면 루프를 유지하기 위해 더 많은 명령어 캐시가 필요할 수 있습니다. 더 많은 캐시는 더 비싼 프로세서를 의미하지만 복잡한 명령 디코딩은 요청 된 명령을 해독하기 위해 더 많은 트랜지스터를 의미하므로 고전적인 엔지니어링 문제입니다.
ARM은 이런 점에서 꽤 좋습니다. 모든 명령어는 조건부 일 수 있으며 대부분의 명령어는 레지스터 값을 늘리거나 줄일 수 있으며 대부분의 명령어는 프로세서 플래그를 선택적으로 업데이트 할 수 있습니다. ARM에서 적당히 유용한 컴파일러를 사용하면 동일한 루프가 다음과 같이 보일 수 있습니다.
movl r0, count_bytes
movl r1, s
movl r2, d
loop: ldrb r3, [r1++]
strb [r2++], r3
subs r0, r0, 1
bne loop
보다시피, 메인 루프는 이제 4 가지 명령입니다. 메인 루프의 각 명령어가 더 많은 역할을하므로 코드가 더 조밀합니다. 이는 일반적으로 주어진 메모리 양으로 더 많은 작업을 수행 할 수 있음을 의미합니다. 적은 메모리가 작업 수행 방법을 설명하는 데 사용되기 때문입니다.
이제 원시 ARM 코드는 종종 밀도가 높지 않다는 불만이있었습니다. 이것은 두 가지 주요 이유 때문입니다. 첫째, 32 비트는 엄청나게 "긴"명령어이므로 더 간단한 명령어를 위해 많은 비트가 낭비되고 두 번째는 ARM의 특성으로 인해 코드가 부풀어 오른 것입니다. 각 명령어는 32 개입니다 예외없이 긴 비트. 이는 레지스터에로드 할 수없는 많은 32 비트 리터럴 값이 있음을 의미합니다. "0x12345678"을 r0에로드하려면 0x12345678을 포함 할뿐만 아니라 "r0에 리터럴로드"를 설명하는 명령어를 어떻게 코딩합니까? 실제 작업을 코딩하기 위해 남은 비트가 없습니다. ARM로드 리터럴 명령어는 흥미로운 작은 짐승이며 ARM 어셈블러는 "캐치"해야하기 때문에 일반 어셈블러보다 조금 더 똑똑해야합니다.
어쨌든 이러한 불만에 답하기 위해 ARM은 Thumb 모드를 고안했습니다. 명령어 당 32 비트 대신 명령어 길이는 이제 거의 모든 명령어의 경우 16 비트이고 분기의 경우 32 비트입니다. Thumb 모드에서는 몇 가지 희생이 있었지만 Thumb은 명령 길이를 줄임으로써 코드 밀도를 40 % 향상시키는 것과 같은 이유로 이러한 희생을 쉽게 만들 수있었습니다.
명령어 세트의 "코드 밀도"는 주어진 양의 프로그램 메모리에 들어갈 수있는 양 또는 주어진 양의 기능을 저장하는 데 필요한 바이트 수의 프로그램 메모리를 측정 한 것입니다.
Andrew Kohlsmith가 지적한 것처럼 동일한 MCU에서도 다른 컴파일러는 다른 코드 밀도를 얻을 수 있습니다.
다양한 MCU를 비교하는 Miro Samek의 "컴퓨터 세계의 곤충"을 읽는 것이 좋습니다.