마이크로 컨트롤러의 모든 주소가 8 비트 크기 인 이유는 무엇입니까?


18

32 비트 마이크로 컨트롤러에서 각 메모리 주소는 8 비트의 데이터 만 보유합니다. 16 비트 MC에서도 동일합니다. 32 비트 데이터의 경우 4 개의 주소 조합을 사용합니다. 주소가 32 비트 데이터를 직접 보유 할 수없는 이유는 무엇입니까 (8이 아닌 32 비트 또는 16 비트로 만드는가)?


2
마이크로 컨트롤러의 데이터 버스에 따라 다릅니다. 바이트 메모리가있는 32 비트 마이크로 컨트롤러는 무엇입니까? 예가 있습니까?
Swanand

4
C와 C ++와 같은 프로그래밍 언어가 바이트가 8 비트보다 클 가능성을 통합하는 이유는 간단하지 않습니다. 대다수가 8 비트 바이트에서 가장 잘 작동하지만 9 비트 또는 18 비트가 있습니다.
PlasmaHH

6
캔디 바 같아요 그들은 같은 가격으로 더 작게 만듭니다.
Olin Lathrop

4
이 질문을 "왜 모든 주소가 8 비트로 정렬되어 있습니까?"
Florian Castellane

2
@FlorianCastellane 이쪽. 주소의 크기는 8 비트가 아닙니다 (256 비트 미만의 메모리가있는 장치를 찾을 수없는 경우에는 해당 될 수 있음).
jayjay

답변:


11

이것은 사실상 디자인 선택이며, 그렇게해야하는 어려운 이유는 없습니다. 예전에는 대량 상용 프로세서가 8 비트 값으로 작동했을 때 매핑이보다 일관되게 1 : 1이었습니다. 디자인이 최신 32 및 64 비트 프로세서로 발전함에 따라 일관성을 유지하기 위해 데이터 버스가 증가하더라도 (임시 구현 비용 절충으로) 바이트 주소 지정에 대한 오래된 매핑을 유지하는 것이 합리적이었습니다. 일부 32 비트 MCU는 여전히 일부 메모리에 16 비트 데이터 버스 만 구현할 수 있으며, 고급 프로세서는 256 비트 이상이며 단일 메모리 트랜잭션에서 여러 코어 레지스터를로드 할 수 있습니다. 넓은 인터페이스는 버스트 또는 스트리밍 작업에 적합합니다.

작은 주소 지정 가능 메모리 크기는 코드에서 바이트 값을 처리 할 때뿐만 아니라 특정 바이트를 읽거나 수정해야하는 이더넷 패킷과 같은 메모리 구조에서 작업하는 데 유용합니다. 종종 이런 종류의 작업은 작은 작업을 수행 할 수 있어야하지만 매우 효율적입니다.

빅 엔디안, 리틀 엔디안 또는 혼합 엔디안 데이터로 작동해야하는 시나리오도 있습니다. 이제는 이에 대한 전용 하드웨어 지원이 종종 있지만 메모리의 바이트 주소 지정은 일부 시나리오에서 이러한 유형의 작업을보다 효율적으로 만듭니다.

레지스터의 주소 비트 수가 주소 공간에 대한 제한 요소가 된 것은 꽤 최근의 일이므로 32 비트 단어가 아닌 2 비트를 주소 바이트에 낭비하는 것은 10-15 년 전에는 큰 문제가되지 않았습니다. 이제 64 비트 포인터를 사용하여 48 비트 또는 56 비트 너비의 바이트 주소를 구현하는 것이 일반적입니다). 입문 컴퓨터 과학 교육은 여전히 ​​포스트 프레임 시대에 조금씩 어긋나고 진화 측면을 항상 명확하게 다루지는 않습니다. 저비용 고비용 아키텍처 (가장 일반적인 의미)가 더 많은 자원 제한과 상품 중심의 프로세서 설계로 보완되기 시작하면서 많은 용어가 사용되었습니다.

MCU에 대해 구체적으로 대답하지는 않았지만 아키텍처 경계는 생각보다 명확하지 않습니다. 최신 접지 형 MCU 설계조차도 많은 코어 서버 프로세서와 통합 될 가능성이 높거나 확장 가능한 제품 세트에서 한 지점으로 존재합니다. 메모리 액세스에 대한 일관된 접근 방식은 코드를 작성하거나 포트해야하는 최종 사용자에게 유리합니다.

이 질문의 역사적 측면을 추적하기 위해 레지스터 크기 에 대한 역 컴퓨팅 SE 에 대한 질문을했습니다.


2
워드 크기가 긴 프로세서는 8 비트 프로세서보다 우선합니다. 8 비트 프로세서는 두 개의 멀티 바이트 숫자를 추가 할 수있는 효율적인 수단 없이는 쓸모가 없으며 초기 프로세서는 단일 기계어보다 큰 숫자를 효율적으로 처리 할 수 ​​없습니다.
supercat

1
8 비트 프로세서를 사용하여 멀티 바이트 숫자를 쉽게 추가 할 수 있지만 단일 CPU 명령어로는 불가능하다는 것을 알았습니다. 먼저 두 개의 가장 낮은 바이트를 추가하고 가장 낮은 결과 바이트와 별도의 캐리 비트를 가져옵니다. 다른 많은 바이트가 존재하는 경우 이전 단계에서 다음 입력 바이트와 캐리 비트를 추가하여 다음 출력 바이트와 다음 캐리 비트를 제공하십시오. 입력 바이트가 남아 있지 않으면 마지막 캐리 비트를 하나 이상의 출력 바이트로 변환하십시오.
user6030

@ user6030 : ADC 명령이 일반적이지 않습니까? AVR은 (8 비트 RISC 마이크로 컨트롤러 이므로 gcc는 int및에 ADC를 사용해야 함long ) x86도, ARM도 마찬가지입니다. 나는 reg가 더 넓은 시스템보다 더 많은 수요가 있기 때문에 대부분의 8 비트 CPU를 사용한다고 가정합니다. 오, 슈퍼 캣은 초기 프로세서에 효율적인 ADC가 없다고 말하는가?
Peter Cordes

레지스터 크기의 진화와 관련하여 유효한 포인트라고 생각합니다 (데이터는 없지만)
숀 Houlihane

25

16 비트보다 작은 값을 처리 할 수없는 몇 가지 DSP (예 : TI C54x)가 있으며 일부 오디오 DSP는 24 비트를 사용합니다. 그러나 8 비트 값은 거의 모든 범용 코드에서 사용되므로 모든 범용 CPU가이를 지원합니다.

그리고 메모리 주소에 사용 된 작은 단위가 8 비트 바이트라고해서 이것이 실제로 버스에서 사용되는 가장 큰 단위가되는 것은 아닙니다 . 대부분의 CPU는 기본 워드 크기 (16/32 비트) 또는 더 큰 크기를 사용하여 메모리를 처리하고 바이트 액세스를 사용할 때 더 큰 워드에서 바이트를 자동으로 추출합니다.

예를 들어, PCI 버스는 항상 32 비트 트랜잭션을 사용하지만 액세스해야하는 바이트 활성화 신호 는 더 작아야합니다.


감사합니다. 메모리에 바이트 대신 니블 너비의 MC가 있습니까?
Arun Joe Cheriyan

4
아마 인텔 4004?
pjc50

6
@ArunCheriyan 가장 작은 어 드레서 블 단어로 니블과 함께 작동하는 CPU의 예는 토성입니다 . HP가 설계하고 지난 세기에 하이 엔드 계산기 (특히 잘 알려진 HP48)에서 사용 된 CPU입니다. 매우 특이한 아키텍처 (64 비트 레지스터, 4 비트 ALU, 20 비트 주소 등)를 가지고있었습니다.
흐리게

다른 예 : TI의 TMS320C3x에 대한 가장 작은 주소 지정 가능 단위는 32 비트입니다.
kkrambo

1
@davidcary 오, 글쎄 ... 날짜와 시간은 어쨌든 내 강력한 소송이 아니었다. 아내에게 생일 선물과 마감 시간에 대해 문의하십시오.
dim

18

16 비트 또는 32 비트 마이크로 컨트롤러는 종종 폭이 8 비트 (바이트) 인 데이터를 조작해야합니다. 예를 들어, 텍스트 문자열은 일반적으로 바이트 당 단일 문자로 저장됩니다. 각각의 개별 바이트가 어드레싱 될 수있는 메모리 어드레싱 체계를 가짐으로써 마이크로 컨트롤러는 8 비트 폭의 데이터를 효율적으로 처리 할 수있다. 이는 32 비트 데이터가 일반적으로 04, 08, 0C 등 4 바이트의 배수 인 주소에 상주한다는 것을 의미합니다. 그러나 메모리가 32 비트 인 경우 마이크로 컨트롤러는 한 번의 읽기 주기로 32 비트를 읽을 수 있습니다 . Micro는 종종 다른 길이의 데이터에서 작동 할 수있는 기계 명령어를 가지고 있으므로 MOV (move data instruction)는 MOV.B, MOV.W 및 MOV.L의 3 가지 형식으로 8 비트, 16 비트 및 32 비트를 이동할 수 있습니다. 하나의 명령으로 데이터.


7

기본적인 대답은 "바이트가 얼마나 길기 때문"입니다. 그 가정을 만드는 코드가 많이 확립되어 있으면 그것을 깨는 것이 모든 종류의 문제를 일으킬 것입니다.

초기에는 확립 된 코드 본문이 없었습니다. 프로세서는 종종 다른 답변에서 볼 수 있듯이 모든 방식의 이상한 아키텍처를 사용합니다. 16 비트 프로세서가 출시 될 무렵에는 8 비트 데이터의 가용성을 가정하여이를 쉽게 구현하지 못하는 코드가 충분했습니다.

주소 당 하나의 32 비트 워드가 있다고해서 메모리 속도에 불리한 점은 없습니다. 32 비트 시스템에서 하위 2 주소 비트는 종종 메모리로 이동하지 않습니다. 프로세서는 일반적으로 전체 32 비트 워드를 읽고 해당 워드 내에서 필요한 8 비트 바이트를 선택 (또는 마스크 해제)합니다. 주소 공간이 충분한 데이터를 저장할 수있는 한 (32 비트 시스템에서 2 ^ 32 바이트로 제한됨) 걱정할 필요가 없습니다. 실제로 많은 16 비트 / 32 비트 프로세서에서 기본 단어 길이 값보다 바이트 값으로 처리하는 데 시간이 더 오래 걸립니다. 32 비트 단어를 읽고 해당 단어의 일부를 삭제하면 추가 작업이 필요합니다. 32 비트 단어를 읽는 것과 비교할 때

당신이 시스템이있는 경우 반대로, 필요한 메모리를 효율적으로 사용하기를, 당신은 액세스 개별 바이트 수 있어야합니다. 당신이 할 수 없다면, 당신은 메모리가 부족합니다. 이를 염두에두고 개별 바이트를 참조 할 수 있어야합니다. 따라서 바이트 단위로 메모리를 청크하는 것이 좋습니다.


3
과연. 그리고 프로세서가 정렬되지 않은 32 비트 값을 하드웨어에 자동으로 로드하거나 저장하는 데 필요한 두 가지 개별 액세스를 처리 할 수 있는지 또는 소프트웨어에서 명시 적으로 처리해야하는지에 대한 추가 질문 이 있습니다.
Chris Stratton

5

이것이 바이트 주소 지정 가능 메모리를 갖는 것 입니다. 주소 공간이 부족하지 않는 한 일반적으로 좋은 방법입니다 (예 : 모든 주소가 별도의 32 비트 워드 인 32 비트 포인터가있는 16GB 대신 32 비트 포인터가있는 4GB).


주소를 각각 하나의 레지스터에 맞는 부분으로 분할하면 주소 공간이 이러한 제한을 초과 할 수 있습니다. 한 번은 주소를 별도의 레지스터에 보관 된 두 부분으로 분할하여 64KB의 메모리에 도달하는 일부 8 비트 컴퓨터를 사용했으며 주소를 3으로 분할하여 1MB의 메모리에 도달 할 수있는 8 비트 프로세서가있는 컴퓨터에 대한 광고도 보았습니다. 부속.
user6030

AVR (8 비트 RISC 마이크로 컨트롤러) 은 다음을 수행합니다. 32 개의 범용 8 비트 레지스터 3 쌍을 16 비트 포인터로 역 참조 할 수 있습니다. 24 비트 주소를 얻기 위해 다른 8 비트 세그먼트와 결합 할 수있는 기능도 있습니다.
Peter Cordes

4

Analog Devices Shark 32 비트 DSP는 주소 지정 가능한 메모리의 가장 작은 단위로 32 비트를 가지므로 sizeof (int) == sizeof (short) == sizeof (char) == 1 (예 : 32 비트 문자가 있으며 C 표준).

int_8, int_16 등과 같은 것들도에 정의되어 있지 않으므로 다른 플랫폼에서 코드를 포팅 할 때 놀랍습니다.


1

주소 지정 가능한 메모리 장치의 크기는 본질적으로 처리 할 수있는 메모리 양과 낭비되는 메모리 양 사이의 절충안입니다.

주소 지정 가능한 메모리 . 32 비트 CPU를 고려하십시오. 바이트를 지정하면 최대 4GB의 메모리를 지정할 수 있습니다. 개별 비트를 처리하면 그 양이 512MB로 줄어들고 32 비트 단어를 처리하면 16GB가됩니다. (귀하의 질문은 후자를 제안하는 것으로 보입니다).

낭비 된 메모리 . X 비트로 표현할 수있는 변수가 있고 N 비트 단위 만 할당 할 수있는 경우 X> N을 가정하여 평균적으로 (N-1) / 2 비트를 낭비합니다. 개별 비트를 처리하는 경우 (어드레싱 관점에서) 100 % 효율로 메모리를 사용합니다. 바이트를 사용하면 변수 당 3.5 비트를 낭비하고 (56 % 효율) 32 비트 단어를 사용하면 15.5 비트 (52 % 효율성)를 낭비하게됩니다. 그러나 더 나빠집니다 : 대부분의 변수가 작 으면 (문자, 부울, 상태 플래그 생각) 주소 지정 가능한 단위가 너무 크면 대부분의 메모리를 낭비하게됩니다.

예를 들어, 변수의 평균 크기가 8 비트라고 가정 해 봅시다.

  • 비트 주소 지정이 가능한 컴퓨터에서는 100 % 효율로 할당 할 수 있으며, 이로 인해 512*1024*1024*100%= 0.54 십억 개의 변수 가 제공됩니다 .
  • 바이트 주소 지정이 가능한 컴퓨터에서는 56 %의 효율로 할당하여 4096*1024*1024*56%24 억 개의 변수를 제공합니다. 비트 어드레싱 가능한 컴퓨터에 비해 거의 5 배나 많습니다! 물론 8 배 더 많은 메모리를 구매해야합니다.
  • 32 비트 주소 지정이 가능한 컴퓨터에서는 변수의 절반 이상이 8 비트 미만을 차지하므로 7 % 미만의 효율로 할당됩니다 (32 개 중 4.5 비트 사용). 어쨌든, 당신은 45 억 개의 변수를 가지지 않을 것입니다 (따라서 많은 고유 한 주소를 가지고 있기 때문에). 실제로는 그보다 적습니다. 복잡한 계산을 피하면 바이트 주소 지정 컴퓨터에 비해 20-30 % 더 유용한 저장 공간을 얻을 수 있으며 RAM 가격의 4 배를 지불합니다.

1

아마 다른 답변에서 다양한 방법을 말했을 것입니다. 일반적으로 반드시 역사적 일 필요는 없지만 오늘날 바이트는 8 비트입니다. 대부분의 경우 "바이트 주소 지정 가능 메모리"를 처리 할 때 단일 주소로 액세스 할 수있는 가장 작은 것은 바이트입니다. 그러나 이것이 우리가 해결할 수있는 유일한 것임을 의미하지는 않습니다. 플랫폼에 따라 단일 주소를 사용하여 바이트, 하프 워드 / 워드 (16 비트), 워드 / 더블 워드 (32 비트) 등 64 비트에 액세스 할 수 있습니다. 이 명령은 기본적으로 해당 액세스 단위 (8, 16, 32, 64 등)의 크기 (8, 16, 32, 64 등)가 일반적으로 8, 16, 32, 64 단위로 결정합니다.

또한 프로세서 및 / 또는 시스템의 설계에 따라 액세스 크기가 메모리 크기 또는 가장 작은 액세스 크기라고 가정 할 이유가 없습니다. 시간이 지남에 따라 가장 작은 크기를 사용하여 메모리 시스템을 실제로 구현하는 것이 점점 더 큰 요구 사항으로 인해,이 컴퓨터를 읽고있는 컴퓨터는 모든 액세스에 32 비트 너비 데이터 버스 또는 64 비트 너비 데이터 버스를 사용할 가능성이 높습니다. 1 바이트를 읽으려면 64 비트 읽기를 수행하고 나머지 비트를 던지기 때문에 프로세서 코어 근처에 버스를 넓게 유지하고 프로세서가 올바른 바이트 레인을 선택하는 데 추가 비용이 들지 않습니다. 버스를 더 좁히거나 바이트 레인에서 바이트를 이동시키기 위해 더 많은 로직 및 클럭이 필요합니다 (때로는 수행됨). 따라서 마이크로 컨트롤러의 내부 램은 예를 들어 시스템에 적합한 경우 32 비트 폭일 수 있습니다. 쓰기 횟수가 많을수록 더 많은주기를 태우려면 줄을 따라 어딘가에 읽기-수정-쓰기해야합니다. 64 비트 읽기가 발생하는 곳에서 PC에 단일 바이트를 작성하고 64 비트의 1 바이트가 수정 된 후 64 비트가 8 비트로 만 드램으로 돌아갈 수 있습니다. 캐싱과 코드는 이전과 다른 점이 있지만 일반적인 규칙은 아닙니다. 쓰기는 발생하지만 잊어 버립니다. 메모리 컨트롤러는 프로세서에서 주소와 데이터를 수집하여 쓰기 저장 클럭을 수행하는 동안 프로세서가 계속 실행되도록 할 수 있습니다. 아마도 읽기-수정-쓰기로 레코딩 된 더 많은 클럭 이미 캐시에 있음),

오늘날에도이 모든 것에는 예외가 있습니다. 비트 주소를 지정할 수있는 일부 시스템에는 명령어 또는 액세스 유형이있을 수 있으며, 주소가 바이트 이외의 단위 인 일부 시스템이 있습니다. 바이트가 항상 8 비트는 아니었을 수도 있고 여전히 실행중인 시스템이있을 수 있습니다 (우리는 8 진수를 사용하고 9 비트 바이트 18 또는 36 비트 워드는 8 진수를 생각하는 인간 프로그래머 및 칩 설계자에게 많은 의미가 있습니다. 8 비트는 16 진 사상가에게 의미가 있습니다.

이제 여러분이 읽고있는 컴퓨터는 비록 그 드람 컨트롤러의 데이터 버스의 폭이 32 비트 또는 64 비트 일지라도 실제 드람 모듈 자체는 여러 개의 8 비트 폭의 부분으로 구성되어있어 쉽게 볼 수 있습니다. 한쪽에 8 또는 9 개의 칩이있는 경우 8 비트 폭의 부품으로 구현 된 64 비트 또는 72 비트 (64 비트 + 8 비트 ECC) 너비의 버스 일 수 있습니다. 모듈의 한쪽면에 4 또는 5 개의 칩이 있지만 여전히 많은 핀이있는 경우 32 비트 폭 (요즘과 다름) 또는 4 비트 칩의 폭은 16 비트이며 5 번째 칩이있을 경우 너비가 16 비트이고 8 만 사용되거나 너비가 8 비트입니다. 32 비트 폭의 부품도 있지만 8 비트 폭이 가장 일반적입니다. 거슬러 올라가는 매우 일반적인 관행.

우리는 어떤 마이크로 컨트롤러를 알아야합니다. 32 비트를 언급했기 때문에 (우리가 알 수는 없지만 자세한 정보는 없지만) 해당 부분의 메모리가 32 비트 너비이고 모든 액세스가 32 비트 너비 일 가능성이 큽니다. 이 명령은 프로그램이 원하는 것을 결정하고 아마도 8 비트, 16 비트 및 32 비트 액세스 유형을 제공 할 것입니다. 쓰기시 더 작은 것은 읽기-수정-쓰기가 필요할 것입니다. 플래시 쓰기도 또 다른 주제이지만 플래시도 마찬가지입니다. 그러나 내부 플래시는 32 비트 너비 일 가능성이 높으며 모든 읽기는 32 비트 단위입니다. spi 부품이 때때로 1, 2 또는 4 비트를 지원할 수 있지만 외부 핀은 1 비트 (spi 또는 i2c) 일 가능성이 가장 높지만 하나의 미소 핀이 가장 일반적입니다. 내부적으로는 바이트 단위로 구성되며 너비가 8 비트 또는 16 또는 32 일 수 있거나 아는 사람은 바이트 단위로 이동하여 처리합니다. spi를 사용하면 플래시 파트 디자인에 따라 단일 트랜잭션에서 1 바이트와 전체 메모리 사이를 이동할 수 있습니다.


0

1 비트 프로세서도 얻을 수 있습니다!

데이터 폭은 레지스터 (누적 기) 폭을 따릅니다. 이것은 일반적으로 '프로세서 폭'이지만 주소 버스는 다를 수 있지만 (보통 더 넓지 만) 사용에 따라 기술적으로 더 좁을 수 있습니다.

물론 8은 2의 거듭 제곱입니다. 우리는 8 비트의 유비쿼터스 사용과 기술의 비용 / 비용에 대해 감사 한 역사를 가지고 있습니다. 오랫동안 8 비트가 지배되는 이유는 버스 폭과 레지스터 (및 RAM)를 8 비트 이상으로 만드는 데 어려움이 있기 때문입니다 (레지스터가 모두 8 비트 인 경우 16 비트 데이터의 포인트 없음). 8 비트는 다소 깔끔하며 16 진수에서 의미가 있습니다. 8 비트는 알파벳, 숫자, 그림 및 제어 문자 (ASCII) 또는 0-255 또는 + -127을 보유 할 수 있습니다. 페이징으로 256 바이트 이상의 데이터 (8 비트 주소 버스)에 쉽게 액세스 할 수 있습니다. 페이지를 선택한 다음 바이트를 입력하십시오. 256의 256 페이지는 64K (65536)입니다. 일반적으로 페이지 0은 스크래치 패드가되므로 페이지를 설정할 필요가 없으므로 액세스하는 것이 더 빠릅니다. 내 첫 컴퓨터에는 1k x 8 비트의 정적 램이있었습니다! (동적 RAM이 더 저렴했습니다. 새로 고침하려면 더 많은 하드웨어가 필요했습니다). 몇 가지 플래그 (c, nc, z, nz)를 사용하여 더하기, 빼기, 왼쪽 및 오른쪽으로 회전하면 8 비트 시스템에서 매우 복잡한 수학을 수행 할 수 있습니다. 부동 소수점 산술 단위가 필요하지 않습니다! 빠르지는 않지만 실행 가능합니다! 많은 초기 프로세서는 단일 단계로 구성 할 수 있으며 간단한 정적 RAM과 함께 사용하면 디버깅이 매우 쉬워졌습니다. 8 진 버퍼와 초기 적색 LED를 추가하면 주소 및 데이터 버스가 변경되는 것을 볼 수 있습니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.