Наскільки відрізняються 8-бітні мікроконтролери від 32-розрядних мікроконтролерів, коли мова йде про їх програмування


19

Так, тож у нас на даний момент є 8-бітні, 16-бітні та 32-бітні мікроконтролери. Всі вони часто використовуються. Наскільки відрізняється програмування 8-бітних та 16-бітних мікроконтролерів? Я маю на увазі, чи потрібна вона інша техніка чи вміння? Давайте, наприклад, візьмемо мікрочіп. Яких нових речей потрібно навчитися людині, якщо вона хоче перейти від 8-бітових мікроконтролерів до 32-бітових мікроконтролерів?


Ні. Безумовно, є різні проблеми, але вони значною мірою залежать від рівня деталізації пристрою. Наприклад, чи не дозволений доступ до слів? (На ARM це не так - ще на x86 це). Це питання насправді недостатньо конкретне.
Кріс Страттон

Вау хлопці, дякую за відповіді. Тож насправді є дуже важливі відмінності, які нам потрібно враховувати при програмуванні 32-бітних процесорів проти 8-бітових процесорів. Тут я мав на увазі C, оскільки я думаю, що більшість людей не заглиблюються в Асамблею з програмування з тих причин, які ми всі дуже знаємо. Дякую за детальні відповіді, я дуже ціную це.
Quantum231

З 32-бітним UC є набагато більше варіантів і набагато більше реєстрів, що вам доведеться правильно. Я думаю, це залежить від того, що ти робиш. Однак, у ці дні ви можете отримати плату розробки, компілятор, налагоджувач, IDE приблизно за 50 доларів. Ще в той день, який коштуватиме близько 1000 доларів.

Відповіді:


33

Взагалі, перехід від 8 до 16 до 32 бітових мікроконтролерів означає, що у вас буде менше обмежень на ресурси, зокрема пам’ять та ширину регістрів, які використовуються для виконання арифметичних та логічних операцій. 8, 16 та 32-розрядний монітор загалом позначає як розмір внутрішніх, так і зовнішніх шин даних, а також розмір внутрішнього реєстру (ів), який використовується для арифметичних та логічних операцій (раніше використовувався лише один або два названі акумулятори , зараз зазвичай є регістрові банки 16 або 32).

Розміри портів вводу-виводу також зазвичай відповідають розміру шини даних, тому 8-бітний мікро-порт матиме 8-бітні порти, 16-бітний матиме 16-бітні порти тощо.

Незважаючи на наявність 8-бітової шини даних, багато 8-бітових мікроконтролерів мають 16-бітну шину адреси і можуть адресувати 2 ^ 16 або 64 К байт пам'яті (це не означає, що вони є десь реалізованими). Але деякі 8-бітні мікросередовища, як, наприклад, PIC-телефони низького рівня, можуть мати лише дуже обмежений простір оперативної пам’яті (наприклад, 96 байт на PIC16).

Щоб обійти свою обмежену схему адресації, деякі 8-бітні мікросередовища використовують підказка, де вміст реєстру сторінок визначає один із декількох банків пам'яті. Зазвичай буде доступна загальна оперативна пам’ять незалежно від того, для чого встановлено реєстр сторінок.

16-розрядний мікроконтролер, як правило, обмежений на 64 Кб пам'яті, але також може використовувати методи пейджингу, щоб уникнути цього. 32-розрядні мікроконтролери, звичайно, не мають таких обмежень і можуть містити до 4 Гб пам'яті.

Поряд з різними розмірами пам'яті є розмір стека. У мікросхемах нижнього кінця це може бути реалізовано в спеціальній області пам'яті і бути дуже маленьким (багато PIC16 мають 8-рівневий стек глибоких викликів). У 16-бітних та 32-бітових мікросхемах стек зазвичай буде загальною оперативною пам’яттю і обмежується лише розміром ОЗУ.

Існує також велика різниця в обсязі пам'яті - як програмної, так і оперативної пам'яті - реалізованої на різних пристроях. 8-бітні мікросистеми можуть мати лише кілька сотень байт оперативної пам’яті та кілька тисяч байтів програмної пам’яті (або набагато менше - наприклад, PIC10F320 має лише 256 14-бітових слів флеш-пам'яті та 64 байти оперативної пам’яті). 16-бітні мікросистеми можуть мати кілька тисяч байт оперативної пам’яті та десятки тисяч байтів програмної пам’яті. 32-бітні мікросхеми часто мають понад 64 К байт оперативної пам’яті та, можливо, 1/2 Мбайт або більше програмної пам’яті (PIC32MZ2048 має 2 Мб флеш-пам’яті та 512 КБ оперативної пам’яті; нещодавно випущений PIC32MZ2064DAH176, оптимізований для графіки, має 2 Мб спалаху та колосальні 32 Мб оперативної пам'яті на мікросхемі).

Якщо ви програмуєте на мові складання, обмеження щодо розміру регістру будуть дуже очевидними, наприклад, додавання двох 32-бітових чисел є клопотом на 8-бітовому мікроконтролері, але тривіальним на 32-бітному. Якщо ви програмуєте на C, це буде значною мірою прозоро, але, звичайно, базовий складений код буде набагато більшим для 8-гіркого.

Я сказав, що це значною мірою прозоро, тому що розмір різних типів даних С може відрізнятися від мікро розмірів одного розміру; наприклад, компілятор, націлений на 8 або 16-бітовий мікро, може використовувати "int" для позначення 16-бітної підписаної змінної, а для 32-бітного мікро - це 32-бітова змінна. Так що багато програм використовують #defines, щоб явно сказати, що таке потрібний розмір, наприклад, "UINT16" для 16-бітної змінної без підпису.

Якщо ви програмуєте на C, найбільший вплив матиме розмір змінних вами. Наприклад, якщо ви знаєте, що змінна завжди буде менше 256 (або в діапазоні від -128 до 127, якщо вона підписана), тоді вам слід використовувати 8-бітну (непідписану символу або діаграму) на 8-бітовому мікро (наприклад, PIC16 ), оскільки використання більшого розміру буде дуже неефективним. Аналогічно повторні 16-бітні змінні на 16-бітовому мікро (наприклад, PIC24). Якщо ви використовуєте 32-бітний мікро (PIC32), це насправді не має ніякої різниці, оскільки набір інструкцій MIPS має інструкції байт, слово та подвійні слова. Однак на деяких 32-бітових мікросередовищах, якщо їм відсутні такі інструкції, маніпулювання 8-бітовою змінною може бути менш ефективною, ніж 32-розрядна через маскування.

Як зазначив учасник форуму vsz, у системах, де у вас є змінна величина, що перевищує розмір регістру за замовчуванням (наприклад, 16-бітна змінна на 8-бітовому мікро), і ця змінна поділяється між двома потоками або між базовим потоком і обробник переривання, повинен робити будь-яку операцію (включаючи просто читання) на змінній атомній , тобто, здається, що це робиться як одна інструкція. Це називається критичним розділом. Стандартний спосіб пом'якшити це - оточити критичний ділянку парою відключення / включення переривання.

Таким чином, перехід від 32-бітових систем до 16-бітових або 16-розрядних до 8-розрядних, будь-які операції зі змінними цього типу, які зараз перевищують розмір регістру за замовчуванням (але раніше цього не було), слід вважати критичним розділ.

Ще одна основна відмінність переходу від одного процесора PIC до іншого - це обробка периферійними пристроями. Це менше стосується розміру слова і більше стосується типу та кількості ресурсів, виділених на кожному чіпі. Загалом, Microchip намагався зробити програмування одного і того ж периферійного пристрою, що використовується для різних мікросхем, максимально схожим (наприклад, timer0), але відмінності завжди будуть. Використання їх периферійних бібліотек значною мірою приховає ці відмінності. Остаточна різниця - це обробка переривань. Тут знову є допомога з бібліотек Microchip.


Можливо, варто відзначити, що на рівні мови складання 8-бітових процесорів, як правило, є менше регістрів і менше ортогональних інструкцій (AVR є більш винятком RISCy), наслідком дизайнерських обмежень при їх розробці. 32-бітні процесори, як правило, є нащадками RISC (єдиний виняток - Renesas 'RX, сучасний CISC, і ColdFire Freescale походить з m68k).
Пол А. Клейтон

9
Щоб не почати нову відповідь лише на це доповнення, я думаю, що важливо додати, що перехід від 32 біт до 16 з 16 до 8 може викликати неприємні сюрпризи, оскільки арифметика перестає бути атомною. Якщо ви додасте два 16-бітових чисел на 8-бітний мікроконтроллер і використовуєте їх у перериваннях, вам потрібно подбати про те, щоб зробити їх безпечними для потоків, інакше ви можете додати додавання лише половини до запуску переривань, в результаті чого недійсне значення в рутинному режимі обслуговування.
vsz

2
@vsz - Добрий момент, забув про це. Як правило, слід відключити переривання навколо будь-якого доступу (включаючи просто читання) будь-якої мінливої ​​змінної, що перевищує розмір регістру за замовчуванням.
tcrosley

1
Чи правда, що 32-розрядний UC зазвичай має 32-бітні інтерфейси вводу / виводу? Я думаю, що так чи інакше це просто послідовне спілкування.
clabacchio

1
@clabacchio Мій досвід полягає в тому, що всі регістри портів вводу-виводу визначаються як 32-розрядні, але іноді верхні 16 біт 16-31 не використовуються, тому паралельний порт - це ще 16 фізичних контактів. В інших випадках, як регістр RTCC, використовуються всі 32 біти.
tcrosley

8

Однією загальною відмінністю між 8-бітовими та 32-бітовими мікроконтролерами є те, що 8-бітні часто мають діапазон пам'яті та простір вводу / виводу, до якого можна отримати доступ в одній інструкції, незалежно від контексту виконання, в той час як 32-бітні мікроконтролери часто вимагають послідовності з декількома інструкціями. Наприклад, на типовому 8-бітовому мікроконтролері (HC05, 8051, PIC-18F тощо) можна змінити стан портового біта за допомогою однієї інструкції. У типовому ARM (32-бітному), якщо вміст регістра спочатку був невідомим, знадобиться послідовність інструкцій із чотирьох інструкцій:

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

У більшості проектів контролер витрачає переважну більшість свого часу, роблячи інші речі, крім встановлення чи очищення окремих бітів вводу / виводу, тому факт, що такі операції, як очищення штифта порту, вимагає більше інструкцій, часто не має значення. З іншого боку, бувають випадки, коли в коді доведеться "сильно багнути" багато портових маніпуляцій, а можливість робити такі речі за допомогою однієї інструкції може виявитися досить цінною.

З іншого боку, 32-бітні контролери незмінно розроблені для ефективного доступу до багатьох видів структур даних, які можуть зберігатися в пам'яті. Для порівняння, багато 8-бітових контролерів дуже неефективні для доступу до структур даних, які статично не розподілені. 32-розрядний контролер може виконувати в одній інструкції доступ до масиву, який потребує півдюжини або більше інструкцій на типовому 8-бітовому контролері.


Я припускаю, що ви мали на увазі "біт-баг". Можливо, варто відзначити, що ARM підтримує бітові діапазонні регіони (де операції зі словом є однобітними операціями), а специфічне розширення додатка MCU для MIPS забезпечує Atomically Set / Clear Bit у межах інструкцій Byte (ASET / ACLR).
Пол А. Клейтон

@ PaulA.Clayton: Я не дуже дивився на MIPS за останні 20 років; що стосується областей біт-діапазону, я ніколи не придумав способу їх використання в розумному коді, і навіть якби я міг їх використовувати, вони зберегли б лише одну інструкцію, якщо тільки хтось не використав шалену хитрість програмування, в цьому випадку вони можуть зберегти два [завантажити R0 з парною або непарною адресою, залежно від того, чи слід встановити або очистити біт, і відрегулювати зміщення в інструкції про зберігання відповідно до компенсації]. BTW, чи маєте ви уявлення про те, чому область біт-діапазону використовує слово адреси?
supercat

@supercat: Адресація слів дозволяє отримати доступ до регіонів біт-діапазону з C або C ++ через підписку вказівника ( region_base[offset])
Ben Voigt

@BenVoigt І чому ти не міг цього робити з байт-адресацією? (Можливо, однією з можливих причин було б зняти очікування / сподівання, що двобітні та чотирибітні операції будуть підтримані.)
Пол А. Клейтон,

@BenVoigt: Масштабування бітового числа в 4 рази часто коштує додаткової інструкції. Насправді, те, що я хотів би бачити, а не область бітової смуги, - це набір з декількох областей, які сидітимуть з фіксованим зміщенням відносно "нормальних" доступів пам’яті, але уточнюють, що пише в одну область буде, якщо можливо, лише "встановити" біти, а запис іншим буде лише "очищати" біти. Якби шина мала окремі керуючі біти "write-ones-enable" та "write-zeroes-enable", можна було б досягти речей, які дозволяє розміщення бітів, але у багатьох випадках уникати читання-модифікації-запису.
supercat

6

Найбільша практична відмінність - це кількість документації, насправді, щоб повністю зрозуміти всю фішку. Є 8-бітні мікроконтролери, які оснащені майже 1000 сторінками документації. Порівняйте це з приблизно 200-300 сторінками для 8-бітового процесора 1980 року та популярних периферійних мікросхем, з якими він буде використовуватися. 32-розрядний пристрій, багатий периферією, вимагає пройти 2000-10 000 сторінок документації, щоб зрозуміти деталь. Частини із сучасною тривимірною графікою на 20-ти сторінках документації.

З мого досвіду, потрібно близько 10 разів, щоб знати все, що відомо про даний сучасний 32-бітний контролер, як це було б для сучасної 8-бітної частини. Під "усім" я маю на увазі те, що ви знаєте, як використовувати всі периферійні пристрої, навіть нетрадиційними способами, і знаєте машинну мову, асемблер, який використовує платформа, а також інші інструменти, ABI (и) тощо.

Зовсім немислимо, що багато, багато конструкцій робляться з частковим розумінням. Іноді це несуттєво, іноді - ні. Перемикання платформ повинно здійснюватися з розумінням того, що продуктивність, яку ви платите за сприйняте підвищення продуктивності завдяки більш потужній архітектурі, буде коротко- та середньостроковою. Зробіть належну ретельність.


3

Я особисто не надто переймався б оновленням (8bit-> 32bit) UC тієї ж сім’ї, і ви збільшуєте технічні характеристики в усьому світі. Як правило, я нічого не роблю з норми з типом даних, оскільки це може бути важко зберегти в дорозі.

Пониження коду пристрою - це вже інша історія.


3
Розмір типів даних визначається компілятором, а не архітектурою процесора. 8-бітний процесор може мати 32-бітові вкладиші, хоча для маніпулювання ними знадобиться кілька інструкцій.
Джо Хасс

хороший коментар - я вилучив перший рядок через виправлення.
Нік Туллос

@JoeHass: компілятор для 8-бітний процесор може визначити int32 біта, або навіть 64 з цього питання, але я нічого не відомо про існуючі 8-бітних компіляторів , які на насправді дійсно визначають intбути більше , ніж 16 біт, або заохочувати 16 бітових значень до чогось більшого.
supercat

-1

32-розрядні MCU з'їдять набагато більше енергії на одного. І вимагають більше схеми підтримки.

Один насправді не переходить на 32-бітний з 8-бітових ... Ви продовжуєте використовувати обидва, часто разом. Суть полягає в тому, що ви повинні використовувати (і вивчити) все, що підходить для роботи. Вивчіть ARM, тому що добре він розгойдує вбудований світ прямо зараз і буде продовжувати це робити. Також вивчіть AVR або PIC, оскільки вони є приголомшливими контролерами плати.

Ви, мабуть, відчуєте стільки ж проблем, що переходять з AVR на ARM, як і з ARM на x86 у будь-якому разі, розмір шини насправді не має великої різниці. Все додаткове сучасне обладнання все ж робить. Перехід від стандартних переривань до векторованого масиву переривань з 6 рівнями пріоритетів буде набагато складніше, ніж з'ясувати, як рахувати до чотирьох мільярдів.


4
Я не знаю, чи точно стверджувати, що 32-бітні MCU суттєво більш голодні. Принаймні одна компанія ( енергетична мікро ) вся лінійка продуктів - це MCU наднизької потужності, і всі вони базуються на 32-бітних ядрах ARM.
Вонор Коннор

3
Щойно розробив схему stm32l1, яка повинна працювати 7 років на CR2032
Скотт Сейдман,

2
Чи можете ви обґрунтувати коментар, що 32-розрядний MCU потребує більшої «схеми підтримки»? Я думаю, ви тут висловлюєте кілька необґрунтованих думок.
Джо Хасс

1
Крім того, ваш векторизований коментар переривань не має особливого сенсу, оскільки ви можете отримати кілька рівнів пріоритетності в 8-бітових мікроконтролерах (див. Мікросхеми Atmel xmega, які мають 3 рівні пріоритету), а векторизовані переривання не має значення, коли кожен апаратний пристрій має його власні незалежні вектори в будь-якому випадку.
Коннор Вольф

2
Я використовую 32-бітний процесор Cortex-M0 для управління розумним зарядним пристроєм для електромобілів. Він використовує єдине 3,3 В джерело живлення. У нього є внутрішній генератор і PLL, тому мені навіть кришталь не потрібен. Я використовую 28-контактний пакет DIP, але я можу отримати Cortex-M0 в 8-контактному DIP, якщо хочу. Як це може бути складніше, ніж типовий PIC або AVR?
Джо Хасс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.