Ці будзе той жа код C для мікракантролераў AVR з працы любога іншага тыпу?

Я вучуся аб мікракантролерах і вельмі абмежаваныя веды па гэтым пытанні.

Я проста ведаю, што трэба ўсталёўваць біты ў рэгістрах і маніпуляваць імі ў асноўным, каб зрабіць працу Uc. Ўстаноўка рэгістраў і кіравання электронікай ў мікра-кантролера.

Дапусцім, я напісаў код C у Atmel Studio, для канкрэтнага 8-бітнага УНЦ. Гэта мае ЦС імёны рэгістраў у дадзеным лісце, як, напрыклад, TCNT0. Што рабіць, калі я хачу выкарыстоўваць адзін і той жа код, з другога 8-бітным AVR? Ці павінен я напісаць усё з нуля або проста трэба зрабіць невялікія змены? А большасць імёнаў рэгістраў у агульным?

Напрыклад, калі я праграмаваць ATmega328P з C, будзе тым жа код працаваць у любым іншым 8-бітным тыпе, напрыклад, з ATmega168? І калі не, то вы б нармальна пісаць з нуля ці проста змяніць папярэднюю?

Я зьбянтэжаны аб сумяшчальнасці кода. Як наконт таго ж пытання для выкарыстання 8-бітнага кода УНЦ на працягу 32-разрадных УНЦ як AVR32?

2
праблема некаторы адсотак кода і/або бібліятэкі голы метал размаўляе з канкрэтнымі перыферыйнымі прыладамі і адрасамі ў чыпе. Няма падстаў лічыць ад аднаго чыпа ў адной і той жа сям'і зусім розныя чып сям'і ці кампаніі, каб мець аднолькавую колькасць перыферыйных прылад, якія ідэнтычныя па канструкцыі і маюць адзін і той жа адрас. Можна стварыць умовы, каб паспрабаваць павялічыць партатыўнасць (Arduino, mbed), але вы да гэтага часу не можаш прасіць то, што чып вы на аленевай скуры мае або, калі там не бібліятэку для гэтага чыпа, то няма.
дададзена аўтар Bartosz Radaczyński, крыніца
калі канкрэтныя рэгістры паклікалі ён не можа нават порт па ўсёй сям'і. Вы павінны праверыць два радыёокомпонент.
дададзена аўтар Bartosz Radaczyński, крыніца

6 адказы

<�Р> Напрыклад, калі запраграмаваць ATmega328P з C, будзе той жа код працаваць у любой іншай 8-бітавага тыпу, напрыклад, з ATmega168? </Р>

У гэтым выпадку адказ здараецца так. Адзінае адрозненне паміж ATmega168P і 328P з'яўляецца аб'ём флэш-памяці - да таго часу, як ваша праграма падыходзіць на 168P (г.зн. тых часоў, пакуль гэта не больш, чым 16 КБ), ён будзе працаваць аднолькава на гэтай частцы.

У іншых выпадках ... гэта залежыць. Ёсць некаторыя тонкія адрозненні ў перыферыйных і асаблівасць ўсёй лініі AVR, нават у тых сітуацыях, калі перыферыйныя прылады маюць такое ж імя. Параўнайце тэхнічныя апісання старанна для дэталяў.

<�Р> Як наконт таго ж пытання для выкарыстання 8-бітнага кода УНЦ для 32-бітнага УНЦ як AVR32?

AVR32 з'яўляецца цалкам іншая архітэктура з 8-бітным AVR; яны не маюць амаль нічога агульнага, акрамя імя. Такім чынам, вы, верагодна, прыйдзецца перапісаць праграму.

3
дададзена
На ўзроўні C, гэта не так адрозніваецца, як вы зробіце гэта, каб быць, але затым на ўзроўні C, код для поўнамаштабнай праграмы Unix не ўсе <�я>, што </я> розныя. Што істотна адрозніваецца ад AVR архітэктуры з'яўляецца набор каманд, карта памяці і перыферыйных прылад - так у асноўным усе. Але C да гэтага часу C незалежна.
дададзена аўтар jmknetspeed, крыніца

Код можа быць напісаны, каб быць пераноснасці паміж мікракантролерамі. Гэта добрая ідэя, каб зрабіць гэта, калі ваша прыкладанне або вельмі проста, ці вы знаходзіцеся ў вялікай спешцы :)

Ідэя заключаецца ў тым, каб аддзяліць працэдуры верхняга ўзроўню (ваш асноўны паток праграмы) ад апаратнага маніпулявання нізкага ўзроўню (паварот на кантактах, налады рэгістраў і г.д.).

Для простага прыкладу возьмем схему, дзе вы хочаце, каб кіраваць святлодыёдам. Вы можаце наладзіць свой код, які мае цэлы асобны модуль для святлодыёдаў (я не працую з Арн, калі ласка, прабачце памылкі)

<�Моцны> led.c:

// For simplicity, this assumes all LEDs are on Port D.

void ledInit(uint8_t ledPin)
{

    DDRD |= (1 << ledPin);  //Configure the pin as an output
    PORTD &= ~(1 << ledPin);//Set the pin low
}

void ledOn(uint8_t ledPin)
{
    PORTD |= (1 << ledPin);
}

void ledOff(uint8_t ledPin)
{
    PORTD &= ~(1 << ledPin);
}

Затым у кодзе магістральны, вы толькі доступ да LED з дапамогай гэтых каманд. Калі вам трэба больш доступу, як каманды пераключэння, неабходна дадаць яго ў файл led.c. Асноўны код нават не ведае пра тое, што адбываецца ўнутры модуля СВД.

Гэта робіць яго значна прасцей перамясціць код магістральнага паміж мікракантролерамі. У прынцыпе, вам трэба будзе толькі перапісваць файл led.c. Вам не давядзецца мяняць свой магістральны код пры ўсіх .

Гэтая логіка можа таксама выкарыстоўвацца для таймераў, партоў сувязі (SPI, I2C, USART ...) і г.д.


У вялікім праекце, я лічу, што лепш на самай справе ёсць тры пласта кода:

  • Магістральны код, які дырыжуе ўсе
  • Сярэдні ўзровень, які забяспечвае функцыі і імёны (#defines) да кода магістральны. Гэта азначае паміж намерам коды магістральнай і нізкаўзроўневых функцыямі, неабходнымі, каб усё адбылося, і
  • Нізкі ўзровень (вадзіцель), які на самай справе пераварочвае правільныя біты.

У гэтым выпадку функцыя нізкага ўзроўню разглядаецца толькі блокам сярэдняга ўзроўню. Блок сярэдняга ўзроўню падвяргаецца коду магістральнага.

Гэта можа здацца занадта складаным, але гэта сапраўды не зойме значна больш працы. Выгада адбудзецца, калі вы павінны змяніць больш дэталяў рэалізацыі.

Напрыклад, скажам, вы стварылі сваю праграму на выкарыстанне перыферыйнага прылады SPI, але вашы новыя фактычныя патрэбы дызайну выкарыстоўваць I2C. Зараз Вы можаце змяніць код блока сярэдняга ўзроўню, каб правільна называць каманды I2C нізкага ўзроўню, а не нізкага ўзроўню каманд SPI. Вам не давядзецца мяняць альбо высокі ўзровень або кода нізкага ўзроўню.

Гэта, як гаворыцца, я не рэкамендаваў бы гэта, пакуль вы да гэтага часу вывучаюць асновы :)

3
дададзена

Кароткі адказ, няма, C код, напісаны для аднаго мікракантролера не гарантуецца для працы на іншых мікракантролерах.

Доўгі адказ, ваш кампілятар можа клапаціцца аб такіх пытаннях, у значнай ступені, і бібліятэкі могуць быць напісаны ў калодзежы, які клапаціцца аб шматлікіх дэталяў пад капотам.

Напрыклад, я, як правіла, выкарыстоўваць кампілятар PIC C ад CCS, каб мець справу з мікракантролерамі сямейства PIC. Код, напісаны для простага мікракантролера, як правіла, працуюць на складаным кантролеры, проста уключыўшы іншы ч файл. Калі я спрабую запусціць перыферыйныя прылады, не існуе, то кампілятар выдасць мне памылку (што прадухіляе адзін з лёгка збіраюся з складанага кантролера да простага).

Там няма нічога магічнага пра гэта. Хтосьці знайшоў час, каб напісаць DEFS для ўсіх адпаведных вочак памяці, і пісаць функцыі для выкліку гэтых DEFS і прыняць адпаведныя меры.

Для асноўных кантролераў STM32, ёсць бібліятэкі CMSIS, што у тэорыі азначае, што калі ваш чып вытворца дае бібліятэку CMSIS, ваш код будзе ЧЕСТНО партатыўным для іншых членаў асноўнай сям'і STM32, нават тыя з розных вытворцы.

2
дададзена

Код можа працаваць, гэта залежыць ад кампілятара і калі перыферыйныя прылады, якія выкарыстоўваюцца ў кодзе, то ёсць таймеры і лічыльнікі, маюць адны і тыя ж рэгістры.

1
дададзена
<�Р> Што рабіць, калі я хачу выкарыстоўваць адзін і той жа код, з другога 8-бітным AVR?

залежыць ад прыроды кода.

апаратна-залежнага кода, відавочна, не будзе працаваць на БУМ з іншым абсталяваннем. У той меры, два мікракантролеры маюць тыя ж апаратныя сродкі (TIMER0, напрыклад), то код будзе працаваць без зменаў.

апаратна-незалежны код, відавочна, будзе працаваць на любым БУМ, у той ступені, што складальнікі маюць падтрымку.

1
дададзена

Выкарыстанне імя Рэгістра будзе зусім тое ж самае, калі вы працуеце з адной і той жа сям'і AVR. Некаторы рэгістр можа з'яўляцца, знікаць, калі функцыя не тое ж самае. Аднак, калі вы ідзяце на іншы вытворца унца, імя рэгістра будзе зусім іншым. (Калі вы ідзяце ад мікрачыпа да TI і г.д ...)

Вы можаце пачаць з вашага старога кода, паколькі большасць УНЦ выкарыстоўваюць праграмаванне C. Алгарытм частка можа быць нязменнай. Вам трэба будзе адаптаваць рэестр для таго, каб зрабіць сябе паводзіць Uc, як меркавалася.

0
дададзена