Ogólnie rzecz biorąc, przejście z mikrokontrolerów od 8 do 16 do 32 bitów oznacza, że będziesz mieć mniej ograniczeń zasobów, w szczególności pamięci i szerokości rejestrów używanych do wykonywania operacji arytmetycznych i logicznych. 8, 16 i 32-bitowe monikery ogólnie odnoszą się zarówno do wielkości wewnętrznych i zewnętrznych magistral danych, jak również do wielkości rejestru wewnętrznego (rejestrów) wykorzystywanego do operacji arytmetycznych i logicznych (kiedyś był to jeden lub dwa nazywane akumulatorami , teraz zwykle są zarejestrowane banki 16 lub 32).
Rozmiary portów I / O będą również generalnie odpowiadały rozmiarom magistrali danych, więc 8-bitowe mikro będzie miało 8-bitowe porty, 16-bitowe będzie miało 16-bitowe porty itp.
Pomimo 8-bitowej magistrali danych, wiele 8-bitowych mikrokontrolerów ma 16-bitową magistralę adresową i może adresować 2 ^ 16 lub 64 KB bajtów (co nie znaczy, że mają one gdziekolwiek zaimplementowane). Ale niektóre 8-bitowe mikroskopy, takie jak niskiej jakości PIC, mogą mieć bardzo ograniczoną przestrzeń RAM (np. 96 bajtów na PIC16).
Aby obejść ich ograniczony schemat adresowania, niektóre 8-bitowe mikroskopy używają stronicowania, w którym zawartość rejestru stron określa jeden z kilku banków pamięci do użycia. Zwykle dostępna będzie pewna dostępna pamięć RAM, bez względu na ustawiony rejestr stron.
16-bitowy mikrokontroler jest zwykle ograniczony do 64 KB pamięci, ale może również użyć technik stronicowania, aby obejść ten problem. 32-bitowe mikrokontrolery oczywiście nie mają takich ograniczeń i mogą adresować do 4 GB pamięci.
Wraz z różnymi rozmiarami pamięci jest rozmiar stosu. W dolnych mikrach można to zaimplementować w specjalnym obszarze pamięci i być bardzo małe (wiele PIC16 ma 8-poziomowy stos wywołań głębokich). W 16-bitowych i 32-bitowych mikrach stos będzie zwykle ogólnie RAM i będzie ograniczony tylko przez rozmiar RAM.
Istnieją również ogromne różnice w ilości pamięci - zarówno programowej, jak i RAM - zaimplementowanej na różnych urządzeniach. 8-bitowe mikroskopy mogą mieć tylko kilkaset bajtów pamięci RAM i kilka tysięcy bajtów pamięci programu (lub znacznie mniej - na przykład PIC10F320 ma tylko 256 14-bitowych słów pamięci flash i 64 bajty pamięci RAM). 16-bitowe mikroskopy mogą mieć kilka tysięcy bajtów pamięci RAM i dziesiątki tysięcy bajtów pamięci programu. 32-bitowe mikroskopy często mają ponad 64 KB pamięci RAM, a może 1/2 MB lub więcej pamięci programu (PIC32MZ2048 ma 2 MB pamięci flash i 512 KB pamięci RAM; nowo wydany PIC32MZ2064DAH176, zoptymalizowany pod kątem grafiki, ma 2 MB pamięci flash i aż 32 MB pamięci RAM na chipie).
Jeśli programujesz w języku asemblera, ograniczenia wielkości rejestru będą bardzo widoczne, na przykład dodanie dwóch liczb 32-bitowych jest obowiązkowe dla 8-bitowego mikrokontrolera, ale banalne dla 32-bitowego. Jeśli programujesz w C, będzie to w dużej mierze przezroczyste, ale oczywiście skompilowany kod będzie znacznie większy dla 8-gorzkiego.
Powiedziałem, że w dużej mierze przejrzyste, ponieważ rozmiar różnych typów danych C może być różny dla różnych rozmiarów mikro; na przykład kompilator ukierunkowany na 8 lub 16-bitowy mikro może używać „int”, co oznacza 16-bitową zmienną ze znakiem, a na 32-bitowej mikro to 32-bitowa zmienna. Dlatego wiele programów używa #defines, aby wyraźnie powiedzieć, jaki jest pożądany rozmiar, np. „UINT16” dla 16-bitowej zmiennej bez znaku.
Jeśli programujesz w C, największy wpływ będzie miał rozmiar twoich zmiennych. Na przykład, jeśli wiesz, że zmienna zawsze będzie mniejsza niż 256 (lub w zakresie od -128 do 127, jeśli jest podpisana), powinieneś użyć 8-bitowego (char lub char bez znaku) na 8-bitowej mikro (np. PIC16 ), ponieważ użycie większego rozmiaru będzie bardzo nieefektywne. Podobnie ponownie 16-bitowe zmienne na 16-bitowej mikro (np. PIC24). Jeśli używasz 32-bitowej mikro (PIC32), to tak naprawdę nie ma znaczenia, ponieważ zestaw instrukcji MIPS zawiera instrukcje bajtów, słów i podwójnych słów. Jednak na niektórych 32-bitowych mikrach, jeśli nie mają takich instrukcji, manipulowanie zmienną 8-bitową może być mniej wydajne niż zmiennej 32-bitowej z powodu maskowania.
Jak zauważył członek forum vsz, w systemach, w których masz zmienną, która jest większa niż domyślny rozmiar rejestru (np. 16-bitowa zmienna na 8-bitowym mikro) i ta zmienna jest dzielona między dwa wątki lub między wątkiem podstawowym i obsługi przerwań, należy wykonać dowolną operację (w tym po prostu odczyt) na zmiennej atomowej , to znaczy, że wydaje się, że jest wykonywana jako jedna instrukcja. Nazywa się to sekcją krytyczną. Standardowym sposobem na złagodzenie tego jest otoczenie sekcji krytycznej parą wyłączania / włączania przerwań.
Przechodząc od systemów 32-bitowych do 16-bitowych lub 16-bitowych do 8-bitowych, wszelkie operacje na zmiennych tego typu, które są teraz większe niż domyślny rozmiar rejestru (ale nie były wcześniej), należy uznać za krytyczne Sekcja.
Inną główną różnicą między poszczególnymi procesorami PIC jest obsługa urządzeń peryferyjnych. Ma to mniej wspólnego z rozmiarem słowa, a więcej z rodzajem i liczbą zasobów przydzielonych na każdym chipie. Ogólnie rzecz biorąc, Microchip starał się, aby programowanie tego samego urządzenia peryferyjnego stosowanego w różnych układach było jak najbardziej podobne (np. Timer0), ale zawsze będą różnice. Korzystanie z bibliotek peryferyjnych w dużym stopniu ukryje te różnice. Ostatnią różnicą jest obsługa przerwań. Ponownie jest tutaj pomoc z bibliotek Microchip.