zisky:
- Schopnost definovat požadavky na registr, přerušení a časování pro mikrokontrolér s jasnou výzvou
- Schopnost kontrolovat kód C/Arduino vytvořený AI z hlediska nastavení registrů, přetečení vyrovnávací paměti a omezení v reálném čase
- Schopnost uplatnit zvyk ověřovat vygenerovaný kód měřením na hardwaru (osciloskop, sériový port)
Vývoj vestavěných systémů je místo, kde se software a hardware prolínají: nesprávné nastavení bitu registru, příliš dlouhé držení přerušení nebo přetečení vyrovnávací paměti způsobí podivné, těžko reprodukovatelné poruchy v poli, i když se kód „zkompiluje“ a spustí. AI je v této oblasti skutečně akcelerátorem; Může vytvářet počáteční kostry, funkce abstrakce hardwaru, stavové stroje a komunikační rutiny. Ale AI nevidí datasheet vaší karty, nezná vaši frekvenci hodin a necítí vaše omezení v reálném čase. V této jednotce se budeme zabývat tím, jak jasně definovat práci mikrokontroléru pro AI, jak zkontrolovat vygenerovaný kód C/Arduino a proč byste měli vše měřit v hardwaru.
Jasné definování požadavku: Registrace, řezání, načasování
Říct AI, aby "rozsvítila LED" nebude fungovat; Která karta, jaký pin, jakou taktovací frekvenci, jaké časování? Při přiřazování vestavěné úlohy AI použijte tento rámec: hardware (rodina MCU, hodiny, pin), funkce (co se stane), omezení (časování, napájení, paměť) a rozhraní (registr, HAL, knihovna Arduino).
Slabá výzva / Silná výzva
SLABÉ: "Vytvářejte PWM pomocí STM32." (Výsledek: který časovač, která frekvence, který pin je nejasný; obecně, pravděpodobně chybný pojmenovaný kód registru.) STRONG: "Vyrobte 20 kHz, 0-100 % nastavitelné provozní PWM na TIM3 CH1 (PA6) pro STM32F103 (72 MHz systémové hodiny). Zapište na úrovni registru (nikoli HAL). - Na řádku komentáře ARR a CAL nastavte výpočet 20 kHz. clo s parametrem funkce mezi 0-100 - Komentář ke každému bitu registru, který používáte, Všimněte si, že pokud je váš předpoklad hodin nesprávný.
Rozdíl je v tom, že výkonná výzva umožňuje modelu zobrazit výpočet a odhalit předpoklad hodin. Hodnoty předděličky/ARR tak můžete kontrolovat nezávisle:
Pro 20 kHz PWM (72 MHz hodiny): Časovač = 72 MHz Pokud chceme předděličku = 72-1 → takt čítače = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49 Ověření: 1e6 / (49+1) = 20 000 Hz
Auditování kódu AI: Co hledat?
To, že se vygenerovaný kód zkompiluje, neznamená, že funguje správně. Postupujte podle tohoto kontrolního seznamu:
kontrolní oblast
Co hledat
Nastavení registrace/bitu
Přesně kompatibilní s datasheetem, správná bitová maska
Přerušení (ISR)
Je to krátké? Žádné zpoždění blokování? Používá se těkavý?
buffer/array
Existuje hraniční kontrola? Riziko přetečení?
načasování
Se zpožděním nebo časovačem? Jsou splněny skutečné časové limity?
Typ a šířka
Přetečení 8/16/32 bitů, zmatek podepsané/nepodepsané
moc/hlídací pes
Hlídač krmení v nekonečné smyčce?
Obslužné rutiny přerušení (ISR) jsou nejčastějším zdrojem chyb. AI někdy vloží delay() nebo dlouhou smyčku do ISR. To vede k vynechání dalších přerušení a resetování watchdogu. Pravidlo: ISR by mělo být co nejkratší; Hlavní úlohou by mělo být nastavení příznaku a jeho přesunutí do hlavní smyčky.
// SLABÝ (AI to někdy produkuje): Blokovací funkce v ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // může trvat dlouho - BAD CASE_Delay(10); // zpoždění v ISR - VELMI BAD }}// SILNÉ: ISR short; úloha se přesune do hlavní smyčkyvolatile uint8_t tick_flag = 0; // volatile CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; tick_flag = 1; //stačí nastavit příznak }}// v hlavní smyčce:if (příznak_příznaku) { příznak_příznaku = 0; read_sensor(); }
Upozornění: Jakákoli proměnná sdílená mezi přerušením a hlavní smyčkou musí být nestálá. V opačném případě může kompilátor uložit proměnnou do mezipaměti v registru a zmeškat aktualizaci. AI toto klíčové slovo často zapomíná; Hledejte to konkrétně při čtení kódu.
Přetečení vyrovnávací paměti a chyby typu
AI může kopírovat data ze sériového portu do pole s pevnou velikostí bez kontroly hranic. Ve vestavěném systému to znamená drcení souvislé paměti a nevysvětlitelné pády. Ujistěte se, že je limit zkontrolován u každého strcpy, indexu pole a vyrovnávací paměti DMA. Podobně se 8bitový čítač resetuje po 255; AI to může ignorovat a spolehnout se na přeplněný účet.
Ověření v hardwaru: "Funguje" je měřeno, nikoli předpokládáno
Ve vestavěném systému je nejspolehlivějším důkazem měřič, nikoli kompilátor. Ověřte vygenerovaný kód těmito třemi způsoby:
- Osciloskop/logický analyzátor: Měření frekvence PWM, časování signálu a průběhu komunikace. Pokud jste chtěli 20 kHz, podívejte se na 20 kHz na obrazovce.
- Protokol sériového portu (UART): Vytiskněte hodnoty proměnných, přechody stavů a počítadla chyb a porovnejte s očekávaným chováním.
- Vázané a zátěžové testování: Otestujte, zda systém vydrží při nejvyšší zátěži, nejrychlejších datech a nejhorším načasování.
Pokud naměřená hodnota nesouhlasí s výpočtem, je nesprávný předpoklad hodin, hodnota předděličky nebo nastavení registru; honit.
Mini pouzdro
Tým studentů vytiskl AI kód měření vzdálenosti pomocí ultrazvukového senzoru HC-SR04. Kód se zkompiluje, ale vzdálenost vždy dává směšné hodnoty. Když jej připojí k osciloskopu, uvidí, že ozvěna vypočítává své načasování v milisekundách místo v mikrosekundách; AI použila millis() místo micros(). Tato jednoslovná chyba zmátla celé měření faktorem 1000. Když vytisknou nezpracovaný čas odezvy do sériového protokolu a porovnají jej se skutečným pravítkem, chybu najdou a opraví. Lekce: zkompilovaný kód není správný kód; Měření v hardwaru odhalí chybu okamžitě.
Časté chyby
- Přijímání názvů registrů a bitových masek bez jejich porovnávání s datovým listem.
- Umožňuje zpoždění blokování nebo dlouhé zpracování v rámci ISR.
- Zapomínání na volatilní sdílené proměnné.
- Obejít vyrovnávací paměť a kontrolu hranic polí; nevidět přepad.
- Spoléhání se na taktovací frekvenci a předpoklady časování bez jejich ověření.
- Vzhledem k tomu, že kód "funguje" bez měření osciloskopem/sériovým logem.
V souhrnu
- Jasně definujte vestavěný úkol z hlediska hardwaru, funkce, omezení a rozhraní.
- Nechte AI vypočítat hodnoty časování, jako je předdělička/ARR, a nezávisle je ověřte.
- Udržujte ISR krátké, používejte volatilní na sdílené proměnné.
- Konkrétně hledejte chyby registru, limitu vyrovnávací paměti a šířky typu.
- "Funguje" je prokázáno osciloskopem, logickým analyzátorem a sériovým logem, nikoli kompilátorem.
- Pokud naměřená hodnota nesouhlasí s výpočtem, řiďte se předpoklady.
Aplikační úkol
S mikrokontrolérem, který máte (Arduino, STM32, ESP32), požádejte AI o PWM nebo periodickou úlohu na určité frekvenci. Před načtením kódu: (1) ověřte hodnoty frekvence/časování nezávisle na účtu v řádku komentáře, (2) zkontrolujte nestálost a blokování v ISR a sdílených proměnných. Po nahrání změřte skutečnou frekvenci osciloskopem nebo logickým analyzátorem a porovnejte ji s cílem. Pokud existuje odchylka, najděte zdroj a opravte jej a poznamenejte si, co bylo považováno za špatné.