32 비트 마이크로 컨트롤러와 8 비트 마이크로 컨트롤러의 차이점은 무엇입니까?


19

현재이 세상에는 8 비트, 16 비트 및 32 비트 마이크로 컨트롤러가 있습니다. 그들 모두가 종종 사용됩니다. 8 비트 및 16 비트 마이크로 컨트롤러를 프로그래밍하는 것이 어떻게 다른가요? 다른 기술이나 기술이 필요합니까? 예를 들어 마이크로 칩을 생각해 봅시다. 8 비트 마이크로 컨트롤러에서 32 비트 마이크로 컨트롤러로 전환하려면 어떤 새로운 것들을 배워야합니까?


아닙니다. 확실히 다른 문제가 있지만, 대부분 장치 별 세부 사항 수준에 있습니다. 예를 들어 정렬되지 않은 단어 액세스가 허용됩니까? (ARM에서는 아직 x86에서는 그렇지 않습니다). 이 질문은 실제로 구체적이지 않습니다.
Chris Stratton

와우, 답변 감사합니다. 따라서 실제로 32 비트 프로세서와 8 비트 프로세서를 프로그래밍 할 때 고려해야 할 중요한 차이점이 있습니다. 여기서 나는 대부분의 사람들이 우리 모두를 잘 알고 있기 때문에 프로그래밍을 위해 어셈블리를 탐구하지 않는다고 생각하면서 C를 언급했다. 자세한 답변을 보내 주셔서 감사합니다. 정말 감사합니다.
quantum231

32 비트 uc에는 더 많은 옵션과 더 많은 레지스터가있어서 올바르게 얻을 수 있습니다. 나는 그것이 당신이하는 일에 달려 있다고 생각합니다. 즉, 요즘 개발 보드, 컴파일러, 디버거, IDE를 약 $ 50에 구입할 수 있습니다. 그 당시에는 1000 달러에 가까운 비용이 들었습니다.

답변:


33

일반적으로 8 ~ 16 비트에서 32 비트 마이크로 컨트롤러로 전환하면 리소스, 특히 메모리에 대한 제약이 적고 산술 및 논리 연산을 수행하는 데 사용되는 레지스터의 폭이 줄어 듭니다. 8, 16 및 32 비트 모니 커는 일반적으로 내부 및 외부 데이터 버스의 크기와 산술 및 논리 연산에 사용되는 내부 레지스터 (들)의 크기를 나타냅니다 (단 하나 또는 두 개의 누산기라고도 함) 이제 보통 16 또는 32의 등록 뱅크가 있습니다).

I / O 포트 포트 크기도 일반적으로 데이터 버스 크기를 따르므로 8 비트 마이크로에는 8 비트 포트가 있고 16 비트에는 16 비트 포트가 있습니다.

8 비트 데이터 버스가 있음에도 불구하고 많은 8 비트 마이크로 컨트롤러에는 16 비트 주소 버스가 있으며 2 ^ 16 또는 64K 바이트의 메모리 주소를 지정할 수 있습니다 (즉, 구현 된 곳 근처에 있다는 의미는 아닙니다). 그러나 저급 PIC와 같은 일부 8 비트 마이크로는 RAM 공간이 매우 제한적일 수 있습니다 (예 : PIC16의 96 바이트).

제한된 주소 지정 체계를 극복하기 위해 일부 8 비트 마이크로는 페이징을 사용하는데, 여기서 페이지 레지스터의 내용이 사용할 메모리 뱅크 중 하나를 결정합니다. 일반적으로 페이지 레지스터 설정에 관계없이 사용 가능한 공통 RAM이 있습니다.

16 비트 마이크로 컨트롤러는 일반적으로 64K의 메모리로 제한되지만 페이징 기술을 사용하여이 문제를 해결할 수도 있습니다. 물론 32 비트 마이크로 컨트롤러에는 그러한 제한이 없으며 최대 4GB의 메모리를 처리 할 수 ​​있습니다.

다른 메모리 크기와 함께 스택 크기가 있습니다. 로우 엔드 마이크로에서, 이것은 메모리의 특수 영역에서 구현 될 수 있으며 매우 작습니다 (많은 PIC16은 8- 레벨 딥 콜 스택을 가짐). 16 비트 및 32 비트 마이크로에서 스택은 일반적으로 RAM이며 RAM 크기에 의해서만 제한됩니다.

또한 다양한 장치에서 구현되는 메모리 양 (프로그램 및 RAM 모두)에는 큰 차이가 있습니다. 8 비트 마이크로는 단지 수백 바이트의 RAM과 수천 바이트의 프로그램 메모리를 가질 수있다 (예를 들어, PIC10F320은 256 개의 14 비트 워드의 플래시와 64 바이트의 RAM을 갖는다). 16 비트 마이크로는 수천 바이트의 RAM과 수만 바이트의 프로그램 메모리를 가질 수있다. 32 비트 마이크로는 종종 64K 바이트 이상의 RAM과 1/2 MB 이상의 프로그램 메모리를 가지고 있습니다 (PIC32MZ2048에는 2MB의 플래시와 512KB의 RAM이 있으며 그래픽에 최적화 된 새로 출시 된 PIC32MZ2064DAH176은 2MB의 플래시와 32MB의 온칩 RAM.

어셈블리 언어로 프로그래밍하는 경우 레지스터 크기 제한이 매우 분명합니다. 예를 들어, 두 개의 32 비트 숫자를 추가하는 것은 8 비트 마이크로 컨트롤러의 작업이지만 32 비트의 컨트롤러에서는 사소한 일입니다. C로 프로그래밍하는 경우에는 이것이 투명하지만 물론 기본 컴파일 된 코드는 8 비트의 경우 훨씬 큽니다.

다양한 C 데이터 유형의 크기가 마이크로 크기마다 다를 수 있기 때문에 크게 투명하다고 말했습니다. 예를 들어, 8 비트 또는 16 비트 마이크로를 대상으로하는 컴파일러는 "int"를 사용하여 16 비트 부호있는 변수를 의미 할 수 있으며 32 비트 마이크로에서는 32 비트 변수가됩니다. 따라서 많은 프로그램은 #defines를 사용하여 부호없는 16 비트 변수에 대해 "UINT16"과 같이 원하는 크기를 명시 적으로 말합니다.

C로 프로그래밍하는 경우 가장 큰 영향은 변수의 크기입니다. 예를 들어 변수가 항상 256보다 작거나 부호가있는 경우 -128에서 127 사이의 범위에 있음을 알고 있다면 8 비트 마이크로 (예 : PIC16)에서 8 비트 (부호없는 char 또는 char)를 사용해야합니다. ) 더 큰 크기를 사용하면 매우 비효율적입니다. 마찬가지로 16 비트 마이크로 (예 : PIC24)에서 16 비트 변수를 다시 설정하십시오. 32 비트 마이크로 (PIC32)를 사용하는 경우 MIPS 명령어 세트에 바이트, 워드 및 더블 워드 명령어가 있으므로 실제로 차이가 없습니다. 그러나 일부 32 비트 마이크로에서 이러한 명령이없는 경우 8 비트 변수를 조작하는 것이 마스킹으로 인해 32 비트보다 덜 효율적일 수 있습니다.

포럼 회원 vsz가 지적했듯이 기본 레지스터 크기보다 큰 변수가있는 시스템 (예 : 8 비트 마이크로의 16 비트 변수)에서 해당 변수는 두 스레드 간 또는 기본 스레드간에 공유됩니다 그리고 인터럽트 핸들러- 변수 atomic 에서 모든 작업 (읽기 포함)을 수행해야합니다. 즉, 하나의 명령으로 수행되는 것처럼 보입니다. 이것을 중요 섹션이라고합니다. 이를 완화하는 표준 방법은 중요 섹션을 비활성화 / 활성화 인터럽트 쌍으로 둘러싸는 것입니다.

따라서 32 비트 시스템에서 16 비트 또는 16 비트에서 8 비트로 이동하면 현재 기본 레지스터 크기보다 크지 만 이전에는 없었던이 유형의 변수에 대한 모든 조작이 중요한 것으로 간주되어야합니다. 부분.

한 PIC 프로세서에서 다른 PIC 프로세서로가는 또 다른 주요 차이점은 주변 장치의 처리입니다. 이것은 워드 크기와 관련이 없으며 각 칩에 할당 된 리소스의 유형과 수와 관련이 있습니다. 일반적으로 Microchip은 서로 다른 칩에서 동일한 주변 장치를 가능한 한 유사하게 프로그래밍하려고 시도했지만 (예 : timer0) 항상 차이가 있습니다. 주변 장치 라이브러리를 사용하면 이러한 차이점을 크게 숨길 수 있습니다. 마지막 차이점은 인터럽트 처리입니다. 여기에도 Microchip 라이브러리의 도움이 있습니다.


어셈블리 언어 수준에서 8 비트 프로세서는 레지스터 수가 적고 직교 명령어가 적으며 (AVR은 RISCy 예외 임) 개발시 설계 제약의 결과라는 점에 주목할 필요가 있습니다. 32 비트 프로세서는 RISC 자손 인 경향이 있습니다 (현대 CISC 인 Renesas RX는 예외이며 Freescale의 ColdFire는 m68k에서 내려옴).
Paul A. Clayton

9
이 추가에 대해서만 새로운 대답을 시작하지 않으려면 32 비트에서 16에서 16에서 8 로의 전환이 산술 연산이 원자 적이기 때문에 엄청난 놀라움을 일으킬 수 있다고 덧붙이는 것이 중요하다고 생각합니다. 8 비트 마이크로 컨트롤러에 2 개의 16 비트 숫자를 추가하고 인터럽트에서 사용하는 경우 스레드 안전을 처리해야합니다. 그렇지 않으면 인터럽트가 트리거되기 전에 절반 만 추가하여 결과적으로 발생할 수 있습니다. 인터럽트 서비스 루틴에서 유효하지 않은 값.
vsz

2
@vsz-좋은 점, 잊어 버렸습니다. 일반적으로 기본 레지스터 크기보다 큰 휘발성 변수에 대한 액세스 (읽기만 포함)에 대한 인터럽트를 비활성화해야합니다.
tcrosley

1
32 비트 uC에 일반적으로 32 비트 I / O 인터페이스가 있다는 것이 사실입니까? 어쨌든 그것은 일반적으로 직렬 통신이라고 생각합니다.
clabacchio

1
@clabacchio 내 경험에 따르면 모든 I / O 포트 레지스터 는 32 비트로 정의되지만 때때로 상위 16 비트 16-31은 사용되지 않으므로 병렬 포트는 여전히 16 개의 물리적 핀입니다. 다른 경우에는 RTCC 레지스터와 같이 32 비트가 모두 사용됩니다.
tcrosley

8

8 비트와 32 비트 마이크로 컨트롤러의 공통적 인 차이점 중 하나는 8 비트 마이크로 컨트롤러는 종종 실행 컨텍스트에 관계없이 단일 명령으로 액세스 할 수있는 메모리 및 I / O 공간 범위를 갖는 반면 32 비트 마이크로 컨트롤러는 종종 다중 명령 시퀀스가 ​​필요합니다. 예를 들어, 일반적인 8 비트 마이크로 컨트롤러 (HC05, 8051, PIC-18F 등)에서는 단일 명령을 사용하여 포트 비트의 상태를 변경할 수 있습니다. 일반적인 ARM (32 비트)에서 레지스터 내용을 처음 알 수없는 경우 4 개의 명령어 시퀀스가 ​​필요합니다.

    ldr  r0,=GPIOA
    ldrh r1,[r0+GPIO_DDR]
    ior  r1,#64
    strh r1,[r0+GPIO_DDR]

대부분의 프로젝트에서 컨트롤러는 개별 I / O 비트를 설정하거나 지우는 것 이외의 작업을 수행하는 데 대부분의 시간을 소비하므로 포트 핀 지우기와 같은 작업에 더 많은 명령이 필요하다는 사실은 중요하지 않습니다. 다른 한편으로, 코드가 많은 포트 조작을 "빅뱅"해야 할 때가 있으며, 단일 명령으로 그러한 작업을 수행하는 능력은 상당히 가치가 있습니다.

반면에 32 비트 컨트롤러는 메모리에 저장할 수있는 많은 종류의 데이터 구조에 효율적으로 액세스 할 수 있도록 설계되었습니다. 이에 비해 많은 8 비트 컨트롤러는 정적으로 할당되지 않은 데이터 구조에 액세스하는 데 매우 비효율적입니다. 32 비트 컨트롤러는 일반적인 8 비트 컨트롤러에서 24 개 이상의 명령어를 사용하는 어레이 액세스를 하나의 명령어로 수행 할 수 있습니다.


나는 당신이 "비트 뱅"을 의미한다고 가정합니다. ARM이 비트 연산 영역 (워드 연산이 단일 비트 연산 인 경우)을 지원하고 MIPS 용 MCU 애플리케이션 특정 확장 기능은 ASET / ACLR (바이트 명령어 내 원자 적으로 설정 / 지우기 비트)을 제공합니다.
Paul A. Clayton

@ PaulA.Clayton : 지난 20 년 동안 MIPS를 실제로 보지 못했습니다. 비트 밴드 영역의 경우 합리적인 모양의 코드에서 사용할 수있는 방법을 찾지 못했습니다.이를 사용할 수 있어도 미친 프로그래밍 속임수를 사용하지 않는 한 하나의 명령 만 저장합니다. 두 비트를 절약 할 수 있습니다 [비트를 설정 또는 해제해야하는지 여부에 따라 짝수 또는 홀수 주소로로드 R0을 저장하고 적절하게 보상하기 위해 저장 명령의 오프셋을 조정하십시오]. BTW, 비트 밴드 영역이 왜 워드 주소를 사용하는지 아십니까?
supercat

@supercat : 단어 주소 지정을 사용하면 포인터 첨자 ( region_base[offset]) 를 통해 C 또는 C ++에서 비트 밴드 영역에 액세스 할 수 있습니다.
Ben Voigt

@BenVoigt 그리고 바이트 주소 지정으로 왜 그렇게 할 수 없습니까? (아마도 가능한 한 가지 이유는 2 비트 및 4 비트 연산이 지원 될 것이라는 기대 / 희망을 없애기위한 것일 수 있습니다.)
Paul A. Clayton

@ BenVoigt : 비트 수를 4 배로 스케일링하는 데 종종 추가 명령이 필요합니다. 실제로 비트 밴드 영역이 아니라 내가보고 싶었던 것은 "정상적인"메모리 액세스와 관련하여 고정 된 오프셋에 앉아 있지만 한 영역에 쓰도록 지정하는 두 개의 영역 세트입니다. 가능한 경우 "세트"비트 만 작성하고 다른 비트에 쓰면 "클리어"비트 만 작성됩니다. 버스에 별도의 "write-ones-enable"및 "write-zeroes-enable"제어 비트가있는 경우 비트 밴딩이 허용하는 것을 달성 할 수 있지만 대부분의 경우 읽기-수정-쓰기를 피하십시오.
supercat

6

가장 큰 실제 차이점은 실제로 전체 칩을 완전히 이해하는 문서의 양입니다. 거의 1000 페이지의 문서와 함께 제공되는 8 비트 마이크로 컨트롤러가 있습니다. 1980 년대 8 비트 CPU와 함께 사용되는 인기있는 주변기기 칩의 가치가 대략 200-300 페이지 인 것을 비교해보십시오. 주변 장치가 풍부한 32 비트 장치를 사용하려면 부품을 이해하기 위해 2000-10,000 페이지의 설명서를 거쳐야합니다. 최신 3D 그래픽이있는 부품은 20k 페이지의 문서에 사용됩니다.

내 경험상, 현대식 8 비트 부품과 마찬가지로 주어진 현대식 32 비트 컨트롤러에 대해 알려진 모든 것을 아는 데 약 10 배가 걸립니다. "모든 것"은 모든 주변 장치를 기존 방식으로 사용하는 방법을 알고 기계 언어, 플랫폼이 사용하는 어셈블러 및 기타 도구, ABI 등을 알고 있음을 의미합니다.

많은, 많은 디자인들이 부분적으로 이해되어 완성되는 것은 전혀 상상할 수 없다. 때로는 중요하지 않은 경우도 있고 그렇지 않은 경우도 있습니다. 스위칭 플랫폼은보다 강력한 아키텍처를 통해 인식되는 생산성 향상에 대한 대가로 단기 및 중기의 생산성 비용이 발생한다는 점을 이해해야합니다. 부지런히 행동하십시오.


3

나는 개인적으로 같은 제품군의 (8bit-> 32bit) uC를 업그레이드하는 것에 대해 너무 걱정하지 않고 보드 전체에서 사양을 높이고 있습니다. 일반적으로 데이터 유형에 대해서는 표준에서 벗어나지 않는 것이 어렵습니다.

장치 코드를 다운 그레이드하는 것은 다른 이야기입니다.


3
데이터 유형의 크기는 프로세서 아키텍처가 아니라 컴파일러에 의해 결정됩니다. 8 비트 프로세서는 32 비트 정수를 가질 수 있지만,이를 조작하기 위해 여러 명령이 필요합니다.
Joe Hass

좋은 의견-수정으로 인해 첫 번째 줄을 제거했습니다.
Nick Tullos

@JoeHass는 : 8 비트 프로세서 용 컴파일러 정의 int32 비트 또는 그 문제에 대해, 심지어 64 수 있지만 실제로 기존 8 비트 컴파일러 모르고있어 않는 정의 int초과 16 비트, 또는 홍보 16 비트 값을 더 큰 값으로 설정하십시오.
supercat

-1

32 비트 MCU는 하나의 전력을 훨씬 더 많이 소비합니다. 그리고 더 많은 지원 회로가 필요합니다.

하나는 실제로 8 비트에서 32 비트로 전환되지는 않습니다. 두 가지를 자주 함께 사용하게됩니다. 결론은 작업에 적합한 것을 사용하고 배우는 것입니다. 임베디드 세계를 흔드는 지금 ARM은 계속 배우고 있기 때문에 ARM을 배우십시오. AVR 또는 PIC는 훌륭한 보드 컨트롤러이기 때문에 배우십시오.

어쨌든 ARM에서 x86으로하는 것처럼 AVR에서 ARM으로 많은 고민 전환을 경험할 것입니다. 버스의 크기는 실제로 큰 차이를 만들지 않습니다. 모든 고급 하드웨어는 그렇지 않습니다. 표준 인터럽트에서 우선 순위가 6 인 벡터 인터럽트 어레이로가는 것은 40 억을 계산하는 방법을 찾는 것보다 훨씬 어렵습니다.


4
32 비트 MCU가 본질적으로 더 많은 전력을 소비한다고 주장하는 것이 정확한지 모르겠습니다. 최소한 하나의 회사 ( 에너지 마이크로 ) 전체 제품군은 초 저전력 MCU이며 모두 32 비트 ARM 코어 기반입니다.
코너 울프

3
방금 cr2032에서 7 년 동안 실행되어야하는 stm32l1 회로를 해결했습니다
Scott Seidman

2
32 비트 MCU에 "지원 회로"가 더 필요하다는 의견을 정당화 할 수 있습니까? 나는 당신이 여기에 여러 가지 정당하지 않은 의견을 표현하고 있다고 생각합니다.
Joe Hass

1
또한 8 비트 마이크로 컨트롤러에서 여러 우선 순위 레벨을 얻을 수 있기 때문에 (벡터 우선 순위 레벨이 3 개인 Atmel xmega MCU 참조) 모든 하드웨어 디바이스에 벡터 인터럽트가 있으면 벡터 인터럽트 인터럽트 주석이 의미가 없습니다. 어쨌든 자신의 독립적 인 벡터.
코너 울프

2
전기 자동차의 스마트 배터리 충전기를 제어하기 위해 32 비트 Cortex-M0 프로세서를 사용하고 있습니다. 단일 3.3V 전원을 사용합니다. 내부 발진기와 PLL이 있으므로 수정이 필요하지 않습니다. 28 핀 DIP 패키지를 사용하고 있지만 원하는 경우 8 핀 DIP에서 Cortex-M0을 얻을 수 있습니다. 일반적인 PIC 또는 AVR보다 어떻게 더 복잡 할 수 있습니까?
Joe Hass
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.