యూనిట్ 3 / 9

ఎంబెడెడ్ సిస్టమ్స్ మరియు మైక్రోకంట్రోలర్ కోడ్

లాభాలు:

  • స్పష్టమైన ప్రాంప్ట్‌తో మైక్రోకంట్రోలర్ కోసం రిజిస్టర్, అంతరాయం మరియు సమయ అవసరాలను నిర్వచించగల సామర్థ్యం
  • రిజిస్టర్ సెట్టింగ్‌లు, బఫర్ ఓవర్‌ఫ్లో మరియు రియల్ టైమ్ పరిమితుల పరంగా AI ద్వారా ఉత్పత్తి చేయబడిన C/Arduino కోడ్‌ని తనిఖీ చేసే సామర్థ్యం
  • హార్డ్‌వేర్‌లో (ఓసిల్లోస్కోప్, సీరియల్ పోర్ట్) కొలవడం ద్వారా ఉత్పత్తి చేయబడిన కోడ్‌ను ధృవీకరించే అలవాటును వర్తింపజేయగల సామర్థ్యం

ఎంబెడెడ్ సిస్టమ్ డెవలప్‌మెంట్ అంటే సాఫ్ట్‌వేర్ మరియు హార్డ్‌వేర్ కలుస్తుంది: రిజిస్టర్ బిట్‌ను తప్పుగా సెట్ చేయడం, అంతరాయాన్ని ఎక్కువసేపు ఉంచడం లేదా బఫర్‌ను ఓవర్‌ఫ్లో చేయడం వంటివి ఫీల్డ్‌లో విచిత్రమైన, పునరుత్పత్తికి కష్టతరమైన వైఫల్యాలకు కారణమవుతాయి, అయినప్పటికీ కోడ్ "కంపైల్" చేసి రన్ అవుతుంది. ఈ ప్రాంతంలో AI నిజంగా యాక్సిలరేటర్; ఇది ప్రారంభ అస్థిపంజరాలు, హార్డ్‌వేర్ సంగ్రహణ విధులు, రాష్ట్ర యంత్రాలు మరియు కమ్యూనికేషన్ నిత్యకృత్యాలను ఉత్పత్తి చేయగలదు. కానీ AI మీ కార్డ్ డేటాషీట్‌ను చూడదు, మీ క్లాక్ ఫ్రీక్వెన్సీ తెలియదు మరియు మీ నిజ సమయ పరిమితులను గుర్తించదు. ఈ యూనిట్‌లో, మైక్రోకంట్రోలర్ పనిని AIకి ఎలా స్పష్టంగా నిర్వచించాలి, ఉత్పత్తి చేయబడిన C/Arduino కోడ్‌ను ఎలా తనిఖీ చేయాలి మరియు మీరు హార్డ్‌వేర్‌లో ప్రతిదాన్ని ఎందుకు కొలవాలి అనే విషయాలను మేము కవర్ చేస్తాము.

ఆవశ్యకతను స్పష్టంగా నిర్వచించడం: రిజిస్టర్, కట్టింగ్, టైమింగ్

"LEDని వెలిగించమని" AIకి చెప్పడం పని చేయదు; ఏ కార్డ్, ఏ పిన్, ఏ క్లాక్ ఫ్రీక్వెన్సీ, ఏ టైమింగ్? AIకి ఎంబెడెడ్ టాస్క్‌ను కేటాయించేటప్పుడు, ఈ ఫ్రేమ్‌వర్క్‌ని ఉపయోగించండి: హార్డ్‌వేర్ (MCU ఫ్యామిలీ, క్లాక్, పిన్), ఫంక్షన్ (ఏమి జరుగుతుంది), పరిమితి (టైమింగ్, పవర్, మెమరీ) మరియు ఇంటర్‌ఫేస్ (రిజిస్టర్, HAL, Arduino లైబ్రరీ).

బలహీనమైన ప్రాంప్ట్ / బలమైన ప్రాంప్ట్

బలహీనం: "STM32తో PWMని ఉత్పత్తి చేయండి." (ఫలితం: ఏ టైమర్, ఏ ఫ్రీక్వెన్సీ, ఏ పిన్ అస్పష్టంగా ఉంది; సాధారణ, బహుశా తప్పు రిజిస్టర్ పేరు పెట్టబడింది.) స్ట్రాంగ్: "STM32F103 (72 MHz సిస్టమ్ క్లాక్) కోసం TIM3 CH1 (PA6)పై 20 kHz, 0-100% సర్దుబాటు డ్యూటీ PWM ఉత్పత్తి చేయండి (72 MHz సిస్టమ్ క్లాక్). - రిజిస్టర్ స్థాయిలో వ్రాయండి (HAL మరియు HAL కోసం ప్రీస్కేల్ విలువ కాదు). వ్యాఖ్య లైన్‌లో గణనను చూపండి - 0-100 మధ్య ఉన్న విధిని సెట్ చేయండి - మీరు ఉపయోగించే ప్రతి రిజిస్టర్ బిట్‌కు మీ గడియారం తప్పుగా ఉంటే, అది మారుతుందని గమనించండి.

వ్యత్యాసం ఏమిటంటే, శక్తివంతమైన ప్రాంప్ట్ మోడల్‌ను గణనను చూపుతుంది మరియు గడియార అంచనాను బహిర్గతం చేస్తుంది. కాబట్టి మీరు స్వతంత్రంగా ప్రీస్కేలర్/ARR విలువలను తనిఖీ చేయవచ్చు:

20 kHz PWM (72 MHz గడియారం) కోసం:Timer_clock = 72 MHzమనకు ప్రీస్కేలర్ కావాలంటే = 72-1 → కౌంటర్ క్లాక్ = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49ధృవీకరణ: 1e 06 / (49+10) =

ఆడిటింగ్ AI కోడ్: దేని కోసం వెతకాలి?

ఉత్పత్తి చేయబడిన కోడ్ కంపైల్ అయినందున అది సరిగ్గా పని చేస్తుందని కాదు. ఈ చెక్‌లిస్ట్‌ని అనుసరించండి:

నియంత్రణ ప్రాంతం

దేని కోసం వెతకాలి

నమోదు/బిట్ సెట్టింగ్‌లు

డేటాషీట్‌తో సరిగ్గా అనుకూలమైనది, సరైన బిట్ మాస్క్

అంతరాయం (ISR)

పొట్టిగా ఉందా? బ్లాకర్ ఆలస్యం లేదా? అస్థిరత ఉపయోగించబడుతుందా?

బఫర్/అరే

సరిహద్దు నియంత్రణ ఉందా? పొంగిపొర్లించే ప్రమాదం?

టైమింగ్

ఆలస్యం లేదా టైమర్‌తో? అసలు సమయ పరిమితి నెరవేరుతుందా?

రకం మరియు వెడల్పు

8/16/32-బిట్ ఓవర్‌ఫ్లో, సంతకం/సంతకం చేయని గందరగోళం

శక్తి/కాపలాదారు

అనంతమైన లూప్ ఫీడింగ్ వాచ్‌డాగ్?

ఇంటెరప్ట్ సర్వీస్ రొటీన్‌లు (ISR) లోపాల యొక్క అత్యంత సాధారణ మూలం. AI కొన్నిసార్లు ISR లోపల ఆలస్యం() లేదా లాంగ్ లూప్‌ను ఉంచుతుంది. ఇది ఇతర అంతరాయాలను కోల్పోవడానికి మరియు వాచ్‌డాగ్ రీసెట్‌లకు దారితీస్తుంది. నియమం: ISR వీలైనంత తక్కువగా ఉండాలి; ప్రధాన పని జెండాను సెటప్ చేయడం మరియు దానిని ప్రధాన లూప్‌కు తరలించడం.

// WEAK (AI కొన్నిసార్లు దీన్ని ఉత్పత్తి చేస్తుంది): ISR శూన్య TIM3_IRQHandler(శూన్యం) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // చాలా సమయం పట్టవచ్చు - BAD CASE_Delay(10); // ISRలో ఆలస్యం - చాలా చెడ్డది }}// స్ట్రాంగ్: ISR షార్ట్; ఉద్యోగం ప్రధాన లూప్‌వోలేటైల్ uint8_t tick_flag = 0కి మారుతుంది; // అస్థిర స్థితి TIM3_IRQHandler (శూన్యం) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; టిక్_ఫ్లాగ్ = 1; //ప్రధాన లూప్‌లో కేవలం ఫ్లాగ్‌ని సెట్ చేయండి}}// (టిక్_ఫ్లాగ్) {tick_flag = 0; read_sensor(); }

జాగ్రత్త: అంతరాయం మరియు ప్రధాన లూప్ మధ్య భాగస్వామ్యం చేయబడిన ఏదైనా వేరియబుల్ తప్పనిసరిగా అస్థిరంగా ఉండాలి. లేకపోతే, కంపైలర్ రిజిస్టర్‌లో వేరియబుల్‌ను కాష్ చేసి, నవీకరణను కోల్పోవచ్చు. AI తరచుగా ఈ కీవర్డ్‌ను మరచిపోతుంది; కోడ్ చదివేటప్పుడు దాని కోసం ప్రత్యేకంగా చూడండి.

బఫర్ ఓవర్‌ఫ్లో మరియు టైప్ లోపాలు

AI సరిహద్దుల తనిఖీ లేకుండానే సీరియల్ పోర్ట్ నుండి డేటాను స్థిర-పరిమాణ శ్రేణిలోకి కాపీ చేయగలదు. ఎంబెడెడ్ సిస్టమ్‌లో, దీనర్థం ప్రక్కనే ఉన్న మెమరీ మరియు వివరించలేని క్రాష్‌లను అణిచివేయడం. ప్రతి strcpy, అర్రే సూచిక మరియు DMA బఫర్‌లో పరిమితి తనిఖీ చేయబడిందని నిర్ధారించుకోండి. అదేవిధంగా, 255 తర్వాత 8-బిట్ కౌంటర్ రీసెట్ చేయబడుతుంది; AI దీన్ని విస్మరించి, నిండిన ఖాతాపై ఆధారపడవచ్చు.

హార్డ్‌వేర్‌లో ధృవీకరణ: "పని" అనేది కొలవబడింది, ఊహించబడలేదు

ఎంబెడెడ్ సిస్టమ్‌లో, అత్యంత విశ్వసనీయ సాక్ష్యం మీటర్, కంపైలర్ కాదు. ఈ మూడు మార్గాల్లో రూపొందించబడిన కోడ్‌ను ధృవీకరించండి:

  1. ఒస్సిల్లోస్కోప్/లాజిక్ ఎనలైజర్: PWM ఫ్రీక్వెన్సీ, సిగ్నల్ టైమింగ్ మరియు కమ్యూనికేషన్ వేవ్‌ఫార్మ్‌ను కొలవండి. మీకు 20 kHz కావాలంటే, స్క్రీన్‌పై 20 kHz చూడండి.
  2. సీరియల్ పోర్ట్ (UART) లాగ్: వేరియబుల్ విలువలు, స్థితి పరివర్తనాలు మరియు ఎర్రర్ కౌంటర్‌లను ముద్రించండి మరియు ఊహించిన ప్రవర్తనతో సరిపోల్చండి.
  3. బౌండ్ మరియు స్ట్రెస్ టెస్టింగ్: సిస్టమ్ అత్యధిక లోడ్, వేగవంతమైన డేటా మరియు చెత్త టైమింగ్‌లో ఉందో లేదో పరీక్షించండి.

కొలిచిన విలువ గణనతో ఏకీభవించనట్లయితే, గడియారం ఊహ, ప్రీస్కేలర్ విలువ లేదా రిజిస్టర్ సెట్టింగ్ తప్పు; వెంబడించు.

మినీ కేసు

విద్యార్థుల బృందం HC-SR04 అల్ట్రాసోనిక్ సెన్సార్‌తో AI ప్రింట్ దూర కొలత కోడ్‌ను కలిగి ఉంది. కోడ్ కంపైల్ చేస్తుంది కానీ దూరం ఎల్లప్పుడూ హాస్యాస్పదమైన విలువలను ఇస్తుంది. వారు దానిని ఓసిల్లోస్కోప్‌కి కనెక్ట్ చేసినప్పుడు, ఎకో లెగ్ దాని సమయాన్ని మైక్రోసెకన్‌లకు బదులుగా మిల్లీసెకన్లలో గణించడాన్ని వారు చూస్తారు; AI మైక్రోస్()కి బదులుగా మిల్లీస్()ని ఉపయోగించింది. ఈ ఒక-పద లోపం మొత్తం కొలతను 1000 కారకంతో గందరగోళానికి గురి చేసింది. వారు ముడి ఎకో సమయాన్ని సీరియల్ లాగ్‌లోకి ప్రింట్ చేసి, దానిని నిజమైన రూలర్‌తో పోల్చినప్పుడు, వారు లోపాన్ని కనుగొని దాన్ని పరిష్కరిస్తారు. పాఠం: సంకలనం చేయబడిన కోడ్ సరైన కోడ్ కాదు; హార్డ్‌వేర్‌లో కొలత వెంటనే లోపాన్ని వెల్లడిస్తుంది.

సాధారణ తప్పులు

  • రిజిస్టర్ పేర్లు మరియు బిట్ మాస్క్‌లను డేటాషీట్‌తో పోల్చకుండా వాటిని ఆమోదించడం.
  • ISRలో ఆలస్యం లేదా సుదీర్ఘ ప్రాసెసింగ్‌ను నిరోధించడాన్ని అనుమతిస్తుంది.
  • షేర్డ్ వేరియబుల్స్‌లో అస్థిరతను మర్చిపోవడం.
  • బైపాస్ బఫర్ మరియు అర్రే హద్దుల తనిఖీ; ఓవర్‌ఫ్లో చూడలేదు.
  • క్లాక్ ఫ్రీక్వెన్సీ మరియు టైమింగ్ అంచనాలను ధృవీకరించకుండా వాటిపై ఆధారపడటం.
  • ఓసిల్లోస్కోప్/సీరియల్ లాగ్‌తో కొలవకుండా "పనిచేస్తోంది" కోడ్‌ను పరిగణనలోకి తీసుకుంటుంది.

సారాంశంలో

  • హార్డ్‌వేర్, ఫంక్షన్, పరిమితులు మరియు ఇంటర్‌ఫేస్ పరంగా ఎంబెడెడ్ టాస్క్‌ను స్పష్టంగా నిర్వచించండి.
  • ప్రీస్కేలర్/ARR వంటి సమయ విలువలను AI లెక్కించి, వాటిని స్వతంత్రంగా ధృవీకరించండి.
  • ISRలను క్లుప్తంగా ఉంచండి, షేర్డ్ వేరియబుల్స్‌లో అస్థిరతను ఉపయోగించండి.
  • రిజిస్టర్, బఫర్ పరిమితి మరియు టైప్ వెడల్పు ఎర్రర్‌ల కోసం ప్రత్యేకంగా చూడండి.
  • "ఇది పని చేస్తుంది" అనేది కంపైలర్‌తో కాకుండా ఓసిల్లోస్కోప్, లాజిక్ ఎనలైజర్ మరియు సీరియల్ లాగ్‌తో నిరూపించబడింది.
  • కొలిచిన విలువ గణనతో ఏకీభవించనట్లయితే, అంచనాలను వెంబడించండి.

అప్లికేషన్ టాస్క్

మీ వద్ద ఉన్న మైక్రోకంట్రోలర్‌తో (Arduino, STM32, ESP32), PWM కోసం AIని అడగండి లేదా నిర్దిష్ట పౌనఃపున్యం వద్ద ఆవర్తన పనిని అడగండి. కోడ్‌ను లోడ్ చేయడానికి ముందు: (1) కామెంట్ లైన్‌లో ఖాతా నుండి స్వతంత్రంగా ఫ్రీక్వెన్సీ/టైమింగ్ విలువలను ధృవీకరించండి, (2) ISR మరియు షేర్డ్ వేరియబుల్స్‌లో అస్థిర మరియు నిరోధించడాన్ని తనిఖీ చేయండి. అప్‌లోడ్ చేసిన తర్వాత, ఓసిల్లోస్కోప్ లేదా లాజిక్ ఎనలైజర్‌తో వాస్తవ ఫ్రీక్వెన్సీని కొలవండి మరియు దానిని లక్ష్యంతో సరిపోల్చండి. విచలనం ఉన్నట్లయితే, మూలాన్ని కనుగొని దాన్ని సరిదిద్దండి మరియు తప్పుగా భావించిన దాన్ని గమనించండి.