Јединица 3 / 9

Код уграђених система и микроконтролера

Добици:

  • Способност дефинисања захтева регистра, прекида и времена за микроконтролер са јасним промптом
  • Могућност провере Ц/Ардуино кода који производи АИ у смислу подешавања регистра, преливања бафера и ограничења у реалном времену
  • Способност примене навике верификације генерисаног кода мерењем на хардверу (осцилоскоп, серијски порт)

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

Јасно дефинисање захтева: регистрација, резање, тајминг

Рећи АИ да „упали ЛЕД“ неће радити; Која картица, који пин, која фреквенција такта, који тајминг? Када додељујете уграђени задатак АИ, користите овај оквир: хардвер (породица МЦУ, сат, пин), функција (шта ће се десити), ограничење (време, снага, меморија) и интерфејс (регистр, ХАЛ, Ардуино библиотека).

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

СЛАБО: „Производи ПВМ помоћу СТМ32.“ (Резултат: који тајмер, која фреквенција, који пин је нејасан; генерално, вероватно погрешан регистар са именом код.) СНАЖНО: „Произвести 20 кХз, 0-100% подесиви ПВМ на ТИМ3 ЦХ1 (ПА6) за СТМ32Ф103 (72 МХз системски такт). Упишите на нивоу регистра (не показују вредности пресцалер и АЛЦУЛАТЕ кХз). израчунавање у реду за коментаре - Поставите функцију са параметром између 0-100 - Коментирајте сваки бит регистра који користите.

Разлика је у томе што моћни промпт чини да модел покаже прорачун и открије претпоставку сата. Дакле, можете независно проверити вредности прескалера/АРР:

За 20 кХз ПВМ (72 МХз сат): Тајмер_цлоцк = 72 МХз Ако желимо прескалер = 72-1 → бројач такта = 1 МХзАРР = (1 МХз / 20 кХз) - 1 = 50 - 1 = 49 Верификација: 1е6 / (49+1) = 20 Хз

Ревизија АИ кода: Шта тражити?

Само зато што се генерисани код компајлира не значи да ради исправно. Пратите ову контролну листу:

контролно подручје

Шта тражити

Подешавања регистрације/бита

Потпуно компатибилан са листом података, исправна битна маска

прекид (ИСР)

Да ли је кратко? Нема кашњења блокатора? Да ли се користи волатиле?

бафер/низ

Да ли постоји гранична контрола? Ризик од преливања?

тајминг

Са одлагањем или тајмером? Да ли је стварно временско ограничење испуњено?

Тип и ширина

8/16/32-битни прелив, конфузија са знаком/непотписаном

повер/ватцхдог

Чувар за храњење бесконачне петље?

Интеррупт сервисне рутине (ИСР) су најчешћи извор грешака. АИ понекад ставља делаи() или дугу петљу унутар ИСР-а. Ово доводи до пропуштања других прекида и ресетовања надзорног пса. Правило: ИСР треба да буде што краћи; Главни посао би требало да буде постављање заставице и померање у главну петљу.

// СЛАБО (АИ понекад производи ово): Функција блокаде у ИСР-у воид ТИМ3_ИРКХандлер(воид) { иф (ТИМ3->СР & ТИМ_СР_УИФ) { ТИМ3->СР &= ~ТИМ_СР_УИФ; реад_сенсор(); // може потрајати дуго - БАД ЦАСЕ_Делаи(10); // кашњење у ИСР - ВЕОМА ЛОШ }}// ЈАКО: ИСР кратак; посао се помера у главну петљу уинт8_т тицк_флаг = 0; // волатиле ЦОНДИТИОНвоид ТИМ3_ИРКХандлер(воид) { иф (ТИМ3->СР & ТИМ_СР_УИФ) { ТИМ3->СР &= ~ТИМ_СР_УИФ; тицк_флаг = 1; //само постави заставицу }}// у главној петљи:иф (тицк_флаг) { тицк_флаг = 0; реад_сенсор(); }

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

Преливање бафера и грешке у типу

АИ може да копира податке са серијског порта у низ фиксне величине без провере граница. У уграђеном систему, то значи уништавање непрекидне меморије и необјашњиве падове. Уверите се да је ограничење проверено за сваки стрцпи, индекс низа и ДМА бафер. Слично, 8-битни бројач се ресетује након 255; АИ може да игнорише ово и да се ослони на препун налог.

Верификација у хардверу: „Ради“ се мери, а не претпоставља се

У уграђеном систему, најпоузданији доказ је мерач, а не компајлер. Верификујте генерисани код на ова три начина:

  1. Осцилоскоп/логички анализатор: Мерите ПВМ фреквенцију, тајминг сигнала и таласни облик комуникације. Ако желите 20 кХз, погледајте 20 кХз на екрану.
  2. Дневник серијског порта (УАРТ): Одштампајте вредности променљивих, прелазе стања и бројаче грешака и упоредите са очекиваним понашањем.
  3. Везано и стресно тестирање: Тестирајте да ли систем издржава под највећим оптерећењем, најбржим подацима и најгорем времену.

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

Мини Цасе

Тим ученика има АИ да штампа код за мерење удаљености помоћу ултразвучног сензора ХЦ-СР04. Код се компилира, али удаљеност увек даје смешне вредности. Када га повежу са осцилоскопом, виде да ехо нога израчунава свој тајминг у милисекундама уместо у микросекундама; АИ је користио миллис() уместо мицрос(). Ова грешка у једној речи је збунила цело мерење за фактор од 1000. Када одштампају сирово време еха у серијски дневник и упореде га са правим лењиром, пронађу грешку и поправе је. Лекција: компајлирани код није исправан код; Мерење у хардверу одмах открива грешку.

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

  • Прихватање имена регистара и битних маски без поређења са подацима.
  • Омогућавање кашњења блокирања или дуге обраде унутар ИСР-а.
  • Заборављање волатиле на дељене променљиве.
  • Заобићи бафер и проверу граница низа; не видећи преливање.
  • Ослањајући се на фреквенцију такта и претпоставке о времену без њихове провере.
  • Узимајући у обзир да код "ради" без мерења осцилоскопом/серијским дневником.

Укратко

  • Јасно дефинишите уграђени задатак у смислу хардвера, функције, ограничења и интерфејса.
  • Нека АИ израчуна вредности времена као што је прескалер/АРР и провери их независно.
  • Нека ИСР буду кратки, користите волатиле на дељеним променљивим.
  • Посебно потражите грешке регистра, ограничења бафера и ширине типа.
  • „Ради“ је доказано осцилоскопом, логичким анализатором и серијским дневником, а не компајлером.
  • Ако се измерена вредност не слаже са прорачуном, јурите за претпоставкама.

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

Са микроконтролером који имате (Ардуино, СТМ32, ЕСП32), тражите од АИ за ПВМ или периодични задатак на одређеној фреквенцији. Пре учитавања кода: (1) проверите фреквенције/временске вредности независно од налога у реду за коментаре, (2) проверите да ли су променљиве и блокиране у ИСР-у и дељеним варијаблама. Након учитавања, измерите стварну фреквенцију осцилоскопом или логичким анализатором и упоредите је са циљем. Ако постоји одступање, пронађите извор и исправите га и забележите шта је погрешно претпостављено.