현재이 세상에는 8 비트, 16 비트 및 32 비트 마이크로 컨트롤러가 있습니다. 그들 모두가 종종 사용됩니다. 8 비트 및 16 비트 마이크로 컨트롤러를 프로그래밍하는 것이 어떻게 다른가요? 다른 기술이나 기술이 필요합니까? 예를 들어 마이크로 칩을 생각해 봅시다. 8 비트 마이크로 컨트롤러에서 32 비트 마이크로 컨트롤러로 전환하려면 어떤 새로운 것들을 배워야합니까?
현재이 세상에는 8 비트, 16 비트 및 32 비트 마이크로 컨트롤러가 있습니다. 그들 모두가 종종 사용됩니다. 8 비트 및 16 비트 마이크로 컨트롤러를 프로그래밍하는 것이 어떻게 다른가요? 다른 기술이나 기술이 필요합니까? 예를 들어 마이크로 칩을 생각해 봅시다. 8 비트 마이크로 컨트롤러에서 32 비트 마이크로 컨트롤러로 전환하려면 어떤 새로운 것들을 배워야합니까?
답변:
일반적으로 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 비트와 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 개 이상의 명령어를 사용하는 어레이 액세스를 하나의 명령어로 수행 할 수 있습니다.
region_base[offset]
) 를 통해 C 또는 C ++에서 비트 밴드 영역에 액세스 할 수 있습니다.
가장 큰 실제 차이점은 실제로 전체 칩을 완전히 이해하는 문서의 양입니다. 거의 1000 페이지의 문서와 함께 제공되는 8 비트 마이크로 컨트롤러가 있습니다. 1980 년대 8 비트 CPU와 함께 사용되는 인기있는 주변기기 칩의 가치가 대략 200-300 페이지 인 것을 비교해보십시오. 주변 장치가 풍부한 32 비트 장치를 사용하려면 부품을 이해하기 위해 2000-10,000 페이지의 설명서를 거쳐야합니다. 최신 3D 그래픽이있는 부품은 20k 페이지의 문서에 사용됩니다.
내 경험상, 현대식 8 비트 부품과 마찬가지로 주어진 현대식 32 비트 컨트롤러에 대해 알려진 모든 것을 아는 데 약 10 배가 걸립니다. "모든 것"은 모든 주변 장치를 기존 방식으로 사용하는 방법을 알고 기계 언어, 플랫폼이 사용하는 어셈블러 및 기타 도구, ABI 등을 알고 있음을 의미합니다.
많은, 많은 디자인들이 부분적으로 이해되어 완성되는 것은 전혀 상상할 수 없다. 때로는 중요하지 않은 경우도 있고 그렇지 않은 경우도 있습니다. 스위칭 플랫폼은보다 강력한 아키텍처를 통해 인식되는 생산성 향상에 대한 대가로 단기 및 중기의 생산성 비용이 발생한다는 점을 이해해야합니다. 부지런히 행동하십시오.
나는 개인적으로 같은 제품군의 (8bit-> 32bit) uC를 업그레이드하는 것에 대해 너무 걱정하지 않고 보드 전체에서 사양을 높이고 있습니다. 일반적으로 데이터 유형에 대해서는 표준에서 벗어나지 않는 것이 어렵습니다.
장치 코드를 다운 그레이드하는 것은 다른 이야기입니다.
int
32 비트 또는 그 문제에 대해, 심지어 64 수 있지만 실제로 기존 8 비트 컴파일러 모르고있어 않는 정의 int
초과 16 비트, 또는 홍보 16 비트 값을 더 큰 값으로 설정하십시오.
32 비트 MCU는 하나의 전력을 훨씬 더 많이 소비합니다. 그리고 더 많은 지원 회로가 필요합니다.
하나는 실제로 8 비트에서 32 비트로 전환되지는 않습니다. 두 가지를 자주 함께 사용하게됩니다. 결론은 작업에 적합한 것을 사용하고 배우는 것입니다. 임베디드 세계를 흔드는 지금 ARM은 계속 배우고 있기 때문에 ARM을 배우십시오. AVR 또는 PIC는 훌륭한 보드 컨트롤러이기 때문에 배우십시오.
어쨌든 ARM에서 x86으로하는 것처럼 AVR에서 ARM으로 많은 고민 전환을 경험할 것입니다. 버스의 크기는 실제로 큰 차이를 만들지 않습니다. 모든 고급 하드웨어는 그렇지 않습니다. 표준 인터럽트에서 우선 순위가 6 인 벡터 인터럽트 어레이로가는 것은 40 억을 계산하는 방법을 찾는 것보다 훨씬 어렵습니다.