Јединица 3 / 9

Уграђени системи и генерисање кода микроконтролера

Добици:

  • Способност генерисања уграђеног кода датог регистра и хардверског контекста за Ардуино/СТМ32/ЕСП32 са АИ
  • Способност препознавања и исправљања уграђених образаца као што су прекиди, тајмери и неблокирајуће петље у АИ излазу
  • Могућност прегледа генерисаног кода у смислу меморије, у реалном времену и безбедности пре него што га отпремите на хардвер

У мехатроници, микроконтролер је место где се идеје сусрећу са физичким светом. Картице као што су Ардуино, СТМ32, ЕСП32; чита сензоре, покреће актуаторе, комуницира и све то ради под ограниченом меморијом, ограниченом процесорском снагом и строгим временским захтевима. Вештачка интелигенција је веома корисна у овој области: може да издвоји подешавања регистра на основу листа података сензора, кодира комуникациони протокол, подеси прекид тајмера. Али уграђени системи су једна од области у којима АИ производи најубедљивије неистине; зато што су адресе регистра, битне маске и временско понашање специфични за плочу и једна грешка бита ремети целокупно понашање. У овој јединици објашњавамо како да се уграђени код генерише помоћу вештачке интелигенције и како да га прегледате пре него што га учитате у хардвер.

Разлика између уграђеног кода и чистог софтвера

Програм за десктоп рачунаре има довољно меморије, оперативни систем и лако отклањање грешака. Уграђеном коду недостаје већина ових:

Величина

десктоп

уграђени систем

памћење

ГБ ниво

КБ ниво (нпр. 2 КБ РАМ-а)

тајминг

Генерално флексибилан

Уско, у реалном времену

отклањање грешака

Лако (дебагер, дневник)

Хард (ЈТАГ, серијски, ЛЕД)

Резултат грешке

Програм се руши

Погон/хардвер може бити оштећен

приступ ресурсима

ОС абстрацтс

Директан приступ Регистру

Ове разлике одређују ваше критеријуме за процену АИ излаза: употреба меморије, у реалном времену (без блокирања) и тачност хардверског регистра су увек на врху ваше контролне листе.

Блокатор против кода који не блокира

Најчешћа грешка почетника (и коју често прави АИ) је употреба делаи(). делаи(1000) закључава процесор на 1 секунду; Током овог периода, ниједан други сензор се не може очитати, ниједна дугмад се не може контролисати. Ово је неприхватљиво у мехатроници. Уместо тога, користи се неблокирајући образац заснован на миллис().

// ЛОШЕ: блокатор -- процесор не може да ради ниједан други посао за 1 секунду воид лооп() { дигиталВрите(ЛЕД, ХИГХ); кашњење(1000); // све зауставља дигиталВрите(ЛЕД, ЛОВ); кашњење(1000); // Дугме за хитне случајеве не може да се прочита у овом тренутку!}// ДОБРО: не блокира -- петља није блокирана, други задаци се покрећу иф (сада Мс - претходниМс >= интервал) { превиоусМс = новМс; ледСтатус = !ледСтатус; дигиталВрите(ЛЕД, ледСтатус); } буттонЦхецк(); // може да ради у сваком циклусу сенсорРеад(); //може да ради у било којој петљи}

Неблокирајући образац је основа уграђене мехатронике: контролна петља тече непрекидно, ниједан задатак не блокира други. Рећи АИ да „не користи кашњење, пише неблокирање засновано на милиметрима“ приликом писања кода директно побољшава квалитет излаза.

Савет: Потражите кашњење ( у уграђеном коду од АИ. Ако видите кашњење у главној контролној петљи, најчешће тај код није погодан за систем у реалном времену и треба га поново написати.

Прекиди и тајмери

Снимамо критичне догађаје (пулс кодера, дугме, периодично узорковање) са прекидима уместо да чекамо у главној петљи. Рутину прекида (ИСР) треба написати кратко и пажљиво: без кашњења, Сериал.принт или дугих прорачуна у њој; Дељене варијабле су означене као променљиве.

волатиле лонг енцодерЦоунтер = 0; // ИСР и петља се деле -> волатиле услов воид енкодерИСР() { // Кратак ИСР: само броји, не ради други посао иф (дигиталРеад(ЕНЦ_Б)) енкодерЦоунтер++; елсе енцодерЦоунтер--;}воид сетуп() { пинМоде(ЕНЦ_А, ИНПУТ_ПУЛЛУП); пинМоде(ЕНЦ_Б, ИНПУТ_ПУЛЛУП); аттацхИнтеррупт(дигиталПинТоИнтеррупт(ЕНЦ_А), енкодерИСР, РИСИНГ);}воид лооп() { лонг цоунтер; ноИнтерруптс(); //кратки прекиди за атомско читање бројача = енцодерЦоунтер; прекида(); //безбедно обављајте трансакције са шалтером...}

Три критичне тачке у овом примеру су у којима АИ често промашује: (1) дељени енцодерЦоунтер мора бити `несталан` или ће оптимизација компајлера пропустити ажурирања; (2) ИСР треба да буде кратак; (3) Када читате вишебајтну променљиву у главној петљи, прекиди за атомско читање морају бити затворени на кратко време, иначе ИСР може интервенисати током читања и може се прочитати половина/покварена вредност (услов трке). Обавезно проверите да ли су ова три присутна у АИ коду.

Тачност регистра и лист са подацима

АИ може веродостојно погрешно приказати адресу регистра сензора или конфигурациони бит МЦУ. На пример, регистар управљања напајањем МПУ6050 ИМУ је 0к6Б; Ако АИ ово да као 0к6А, код се компајлира, чини се да ради, али сензор се не буди. Такве грешке се откривају само када се упореде са подацима.

// МПУ6050 буђење: према подацима ПВР_МГМТ_1 = 0к6Б, вредност 0к00#дефине МПУ_АДДР 0к68#дефине ПВР_МГМТ_1 0к6Б // <-- ВЕРИФИ фром датасхеетВире.бегинТрансмиссион(МПУ_АДДР);Вире.врите(ПВР_МГМТ_1);Вире.врите(0к00); // буђење из режима спавањаВире.ендТрансмиссион(труе);

Пажња: Проверите сваку адресу регистра, бит маску и И2Ц/СПИ адресу коју је дала АИ из табеле са подацима. Ове вредности су специфичне за картицу и чип; Вредност коју АИ „сећа“ може бити из друге ревизије чипа. Нетачан регистар тихо доводи до неправилног понашања.

Слаба порука / јака промпт

СЛАБО: „Очитајте температурни сензор на ЕСП32.“ (Који сензор? Који протокол? Који пин? Генерички, вероватно погрешан код.) ЈАКО: „Очитајте температурни сензор ДС18Б20 на ЕСП32 (Ардуино фрамеворк) са ГПИО4 помоћу ОнеВире-а. Пишите без блокаде, узорковање сваке 1 секунде (користећи кашњење у бази случајева, грешка у милиметрима). -127 или 85. Наведите сваку библиотеку и пин везу коју користите у првом коментару.

Снажан промпт; Он даје чип, оквир, сензор, протокол, пин, узорак узорковања, статус грешке и меморијско ограничење. На овај начин је резултат и проверљив и реалистичан.

Прегледајте контролну листу за уграђени код

Пре учитавања АИ излаза, прођите кроз ову листу:

  1. Блокирање: Да ли постоји кашњење или дуго блокирање у главној петљи?
  2. волатиле: Да ли су променљиве које се деле са ИСР несталне?
  3. Атомски приступ: Да ли је вишебајтна дељена променљива безбедна за читање?
  4. Регистар: Да ли су адресе и битне маске компатибилне са подацима?
  5. Меморија: Стринг, велики низови, да ли рекурзија ствара преливање нивоа КБ?
  6. Руковање грешкама: Да ли се решавају грешке у очитавању сензора, временска ограничења комуникације?
  7. Безбедан старт: Да ли су излази актуатора постављени у безбедно (пасивно) стање при покретању?

Мини Цасе

Инжењер уграђених система Баран има АИ да напише код који чита ИМУ за дрон. Код се компајлира и изгледа да ради, али вредности углова су бесмислене. Баран примењује контролну листу: упоређује адресе регистра са листом података и открива да АИ неисправно емитује регистар конфигурације жироскопа (0к1А уместо 0к1Б), тако да је скала осетљивости погрешна. Када се исправе, вредности се слажу. Затим делаи(10) обавештења у главној петљи; претварајући ово у структуру засновану на милилима, јер је блокирање петље контроле лета неприхватљиво. Коначно, види да дељена променљива бројача није променљива и додаје је. АИ је брзо дао костур; Али листа за преглед је ухватила три одвојене грешке: регистар, блокирање и нестабилност, а хардвер уопште није био у опасности.

Уобичајене грешке

  • Убијање одговора у реалном времену коришћењем делаи() у главној контролној петљи.
  • Избегавајте да променљива која се дели са ИСР буде променљива и да доживите тихо оштећење података.
  • Читање вишебајтне дељене променљиве неатомско и генерисање услова трке.
  • Не проверава се регистарске/битне маске које је дала АИ са подацима.
  • Креирање преливања меморије коришћењем стрингова и великих низова у ограниченој РАМ меморији.
  • Заборављам да првобитно обезбедите излазе актуатора.

Укратко

  • Ембеддед цоде; Ради са ограниченом меморијом, кратким тајмингом и директним приступом регистру.
  • У главној петљи, уместо кашњења се користи неблокирајући образац заснован на милилима.
  • ИСР је кратак; дељене променљиве морају да буду променљиве и да им се приступа атомски.
  • Адресе регистра и битне маске се увек верифицирају у складу са подацима; АИ може погрешити.
  • Меморија, руковање грешкама и статус безбедног покретања се увек проверава.
  • Снажан промпт; Укључује чип, оквир, сензор, протокол, пин и ограничења.

Задатак апликације

Изаберите сензор (нпр. ДС18Б20, МПУ6050 или ХЦ-СР04) и микроконтролер (Ардуино/ЕСП32/СТМ32). Нека АИ генерише неблокирајући код за читање са моћним шаблоном упита у овој јединици. Затим следите седам ставки контролне листе за преглед једну по једну: упоредите бар једну вредност регистра/пина са листом података, проверите кашњења у петљи, проверите променљив статус дељених променљивих. Колико је ставки "прошло" из првог покушаја и колико је потребно исправке? Забележите сваки проблем који пронађете и његово решење.