એકમ 3 / 9

એમ્બેડેડ સિસ્ટમ્સ અને માઇક્રોકન્ટ્રોલર કોડ જનરેશન

નફો:

  • AI સાથે Arduino/STM32/ESP32 માટે આપેલ રજિસ્ટર અને હાર્ડવેર સંદર્ભમાં એમ્બેડેડ કોડ જનરેટ કરવાની ક્ષમતા
  • AI આઉટપુટમાં ઇન્ટરપ્ટ્સ, ટાઈમર અને નોન-બ્લોકિંગ લૂપ્સ જેવા એમ્બેડેડ પેટર્નને ઓળખવાની અને સુધારવાની ક્ષમતા
  • હાર્ડવેર પર અપલોડ કરતા પહેલા મેમરી, રીઅલ-ટાઇમ અને સુરક્ષાના સંદર્ભમાં જનરેટ કરેલ કોડની સમીક્ષા કરવાની ક્ષમતા

મેકાટ્રોનિક્સમાં, માઇક્રોકન્ટ્રોલર એ છે જ્યાં વિચારો ભૌતિક વિશ્વને મળે છે. કાર્ડ્સ જેમ કે Arduino, STM32, ESP32; તે સેન્સર વાંચે છે, એક્ટ્યુએટર ચલાવે છે, વાતચીત કરે છે અને આ બધું મર્યાદિત મેમરી, મર્યાદિત પ્રોસેસિંગ પાવર અને કડક સમયની જરૂરિયાતો હેઠળ કરે છે. આર્ટિફિશિયલ ઇન્ટેલિજન્સ આ ક્ષેત્રમાં ખૂબ જ ઉપયોગી છે: તે સેન્સરની ડેટાશીટના આધારે રજિસ્ટર સેટિંગ્સને એક્સટ્રેક્ટ કરી શકે છે, કોમ્યુનિકેશન પ્રોટોકોલ કોડ કરી શકે છે, ટાઇમર ઇન્ટરપ્ટ સેટ કરી શકે છે. પરંતુ એમ્બેડેડ સિસ્ટમ્સ એ એવા ક્ષેત્રોમાંની એક છે જ્યાં AI સૌથી વધુ "વિશ્વાસપૂર્ણ ખોટા" પેદા કરે છે; કારણ કે રજીસ્ટર એડ્રેસ, બીટ માસ્ક અને સમયની વર્તણૂક બોર્ડ માટે વિશિષ્ટ છે અને એક બીટ ભૂલ સમગ્ર વર્તનને વિક્ષેપિત કરે છે. આ એકમમાં, અમે એઆઈ સાથે એમ્બેડેડ કોડ કેવી રીતે જનરેટ કરવો અને તેને હાર્ડવેરમાં લોડ કરતા પહેલા તેની સમીક્ષા કેવી રીતે કરવી તે આવરી લઈએ છીએ.

શુદ્ધ સોફ્ટવેરથી એમ્બેડેડ કોડનો તફાવત

ડેસ્કટૉપ પ્રોગ્રામમાં પુષ્કળ મેમરી, ઑપરેટિંગ સિસ્ટમ અને ડિબગિંગની સરળતા હોય છે. એમ્બેડેડ કોડમાં આમાંથી મોટા ભાગનો અભાવ છે:

કદ

ડેસ્કટોપ

એમ્બેડેડ સિસ્ટમ

મેમરી

જીબી સ્તર

KB સ્તર (દા.ત. 2 KB RAM)

સમય

સામાન્ય રીતે લવચીક

ચુસ્ત, વાસ્તવિક સમય

ડિબગીંગ

સરળ (ડીબગર, લોગ)

સખત (JTAG, સીરીયલ, LED)

ભૂલ પરિણામ

પ્રોગ્રામ ક્રેશ થાય છે

એક્ટ્યુએટર/હાર્ડવેરને નુકસાન થઈ શકે છે

સંસાધન ઍક્સેસ

OS એબ્સ્ટ્રેક્ટ્સ

રજિસ્ટરની સીધી ઍક્સેસ

આ તફાવતો એઆઈ આઉટપુટનું મૂલ્યાંકન કરવા માટેના તમારા માપદંડોને નિર્ધારિત કરે છે: મેમરીનો ઉપયોગ, રીઅલ-ટાઇમ (નોન-બ્લૉકિંગ), અને હાર્ડવેર રજિસ્ટરની ચોકસાઈ હંમેશા તમારી ચેકલિસ્ટની ટોચ પર હોય છે.

બ્લોકર વિ નોન-બ્લોકીંગ કોડ

નવા નિશાળીયા દ્વારા કરવામાં આવતી સૌથી સામાન્ય ભૂલ (અને એઆઈ દ્વારા વારંવાર કરવામાં આવતી) વિલંબનો ઉપયોગ છે. વિલંબ(1000) પ્રોસેસરને 1 સેકન્ડ માટે લોક કરે છે; આ સમયગાળા દરમિયાન, અન્ય કોઈ સેન્સર વાંચી શકાતા નથી, કોઈ બટનને નિયંત્રિત કરી શકાતા નથી. મેકાટ્રોનિક્સમાં આ અસ્વીકાર્ય છે. તેના બદલે, millis() આધારિત નોન-બ્લોકીંગ પેટર્નનો ઉપયોગ થાય છે.

// BAD: બ્લોકર -- પ્રોસેસર 1 સેકન્ડ રદબાતલ લૂપ() { digitalWrite(LED, HIGH); વિલંબ(1000); // બધું ડિજીટલરાઈટ બંધ કરે છે(LED, LOW); વિલંબ(1000); // આ સમયે કટોકટીનું બટન વાંચી શકાતું નથી!}// સારું: બિન-અવરોધિત -- લૂપ અવરોધિત નથી, અન્ય કાર્યો ચાલે છે જો (nowMs - previousMs >= interval) { previousMs = nowMs; ledStatus = !ledStatus; ડિજીટલ રાઈટ (એલઇડી, લેડ સ્ટેટસ); } બટનચેક(); // દરેક ચક્ર સેન્સર રીડ(); // કોઈપણ લૂપમાં ચાલી શકે છે}

નોન-બ્લોકીંગ પેટર્ન એ એમ્બેડેડ મેકાટ્રોનિકસનો આધાર છે: કંટ્રોલ લૂપ સતત વહે છે, કોઈ કાર્ય બીજાને લૉક કરતું નથી. જ્યારે કોડ લખવાથી આઉટપુટની ગુણવત્તામાં સીધો સુધારો થાય છે ત્યારે AI ને "વિલંબનો ઉપયોગ કરશો નહીં, મિલિ-આધારિત નોન-બ્લોકિંગ લખો" કહેવાનું.

ટીપ: વિલંબ માટે જુઓ( AI ના એમ્બેડેડ કોડમાં. જો તમને મુખ્ય નિયંત્રણ લૂપમાં વિલંબ દેખાય છે, તો મોટાભાગે તે કોડ રીઅલ-ટાઇમ સિસ્ટમ માટે યોગ્ય નથી અને તેને ફરીથી લખવો જોઈએ.

વિક્ષેપ અને ટાઈમર

અમે મુખ્ય લૂપમાં રાહ જોવાને બદલે વિક્ષેપો સાથે સમય-નિર્ણાયક ઘટનાઓ (એન્કોડર પલ્સ, બટન, સામયિક નમૂના) કેપ્ચર કરીએ છીએ. ઇન્ટરપ્ટ રૂટિન (ISR) ટૂંકી અને કાળજીપૂર્વક લખવી જોઈએ: તેમાં કોઈ વિલંબ, Serial.print અથવા લાંબી ગણતરીઓ નહીં; વહેંચાયેલ ચલો અસ્થિર તરીકે ચિહ્નિત થયેલ છે.

અસ્થિર લાંબા એન્કોડરકાઉન્ટર = 0; // ISR અને લૂપ શેર કરવામાં આવે છે -> અસ્થિર સ્થિતિ રદબાતલ enkoderISR() {// ટૂંકી ISR: માત્ર ગણતરી કરો, અન્ય કોઈ કામ કરશો નહીં જો (digitalRead(ENC_B)) enkoderCounter++; અન્ય એન્કોડરકાઉન્ટર--;}અર્થાત સેટઅપ() { પિનમોડ(ENC_A, INPUT_PULLUP); પિનમોડ(ENC_B, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(ENC_A), enkoderISR, RISING);}void loop() { long counter; કોઈ વિક્ષેપ (); // અણુ વાંચન કાઉન્ટર માટે ટૂંકા વિક્ષેપો = એન્કોડરકાઉન્ટર; વિક્ષેપ (); //કાઉન્ટર સાથે સુરક્ષિત રીતે વ્યવહાર કરો...}

આ ઉદાહરણમાં ત્રણ નિર્ણાયક મુદ્દાઓ છે જ્યાં AI ઘણીવાર ચૂકી જાય છે: (1) શેર કરેલ એન્કોડરકાઉન્ટર `અસ્થિર` હોવું આવશ્યક છે અથવા કમ્પાઇલર ઑપ્ટિમાઇઝેશન અપડેટ્સ ચૂકી જશે; (2) ISR ટૂંકું હોવું જોઈએ; (3) મુખ્ય લૂપમાં મલ્ટી-બાઇટ વેરીએબલ વાંચતી વખતે, અણુ વાંચન માટેના વિક્ષેપો થોડા સમય માટે બંધ હોવા જોઈએ, અન્યથા ISR વાંચન દરમિયાન હસ્તક્ષેપ કરી શકે છે અને અડધા/ભ્રષ્ટ મૂલ્ય વાંચવામાં આવી શકે છે (રેસની સ્થિતિ). એઆઈ કોડમાં આ ત્રણેય હાજર છે કે કેમ તે તપાસવાની ખાતરી કરો.

રજીસ્ટર ચોકસાઈ અને ડેટાશીટ

AI વિશ્વસનીય રીતે સેન્સરના રજિસ્ટર સરનામાં અથવા MCU ના રૂપરેખાંકન બિટને ખોટી રીતે રજૂ કરી શકે છે. ઉદાહરણ તરીકે, MPU6050 IMUનું પાવર મેનેજમેન્ટ રજિસ્ટર 0x6B છે; જો AI આને 0x6A તરીકે આપે છે, તો કોડ કમ્પાઇલ કરવામાં આવે છે, તે કામ કરતું હોય તેવું લાગે છે, પરંતુ સેન્સર જાગતું નથી. ડેટાશીટ સાથે સરખામણી કરવામાં આવે ત્યારે જ આવી ભૂલો શોધી કાઢવામાં આવે છે.

// MPU6050 વેક-અપ: ડેટાશીટ PWR_MGMT_1 = 0x6B અનુસાર, મૂલ્ય 0x00#define MPU_ADDR 0x68#define PWR_MGMT_1 0x6B // <-- માંથી ચકાસો datasheetWire.beginTransmission(MPU_ADDR);Wire.write(PWR_MGMT_1);Wire.write(0x00); // સ્લીપ મોડમાંથી જાગોWire.endTransmission(true);

ધ્યાન: ડેટાશીટમાંથી AI દ્વારા આપવામાં આવેલ દરેક રજીસ્ટર સરનામું, બીટ માસ્ક અને I2C/SPI સરનામું ચકાસો. આ મૂલ્યો કાર્ડ અને ચિપ વિશિષ્ટ છે; AI "યાદ રાખે છે" તે મૂલ્ય અન્ય ચિપ રિવિઝનમાંથી હોઈ શકે છે. ખોટી નોંધણી ચુપચાપ ખોટી વર્તણૂક તરફ દોરી જાય છે.

નબળા પ્રોમ્પ્ટ / મજબૂત પ્રોમ્પ્ટ

નબળું:"ESP32 પર તાપમાન સેન્સર વાંચો."(કયું સેન્સર? કયો પ્રોટોકોલ? કયો પિન? સામાન્ય, કદાચ ખોટો કોડ.)STRONG:"OneWire સાથે GPIO4 માંથી ESP32 (Arduino ફ્રેમવર્ક) પર DS18B20 તાપમાન સેન્સર વાંચો. નોન-બ્લોકિંગ લખો, સેમ્પલ 1-એક-એક-એક-બેસલેસ સેમ્પલ. વાંચવામાં ભૂલના કિસ્સામાં ફ્લેગ (નિશ્ચિત મૂલ્ય -127 અથવા 85) કૃપા કરીને તમે પ્રથમ ટિપ્પણીમાં ઉપયોગ કરો છો તે દરેક લાઇબ્રેરી અને પિન કનેક્શનનો ઉલ્લેખ કરો, સ્ટ્રિંગને બદલે ચાર બફરનો ઉપયોગ કરો.

શક્તિશાળી પ્રોમ્પ્ટ; તે ચિપ, ફ્રેમવર્ક, સેન્સર, પ્રોટોકોલ, પિન, સેમ્પલિંગ પેટર્ન, ભૂલ સ્થિતિ અને મેમરી અવરોધ આપે છે. આ રીતે આઉટપુટ ચકાસી શકાય તેવું અને વાસ્તવિક બંને છે.

એમ્બેડેડ કોડ માટે ચેકલિસ્ટની સમીક્ષા કરો

AI આઉટપુટ લોડ કરતા પહેલા, તેને આ સૂચિમાંથી પસાર કરો:

  1. અવરોધિત કરવું: શું મુખ્ય લૂપમાં વિલંબ અથવા લાંબો અવરોધ છે?
  2. વોલેટાઈલ: શું ISR સાથે વેરીએબલ્સ વોલેટાઈલ છે?
  3. એટોમિક એક્સેસ: શું મલ્ટી-બાઈટ શેર કરેલ વેરીએબલ વાંચવા માટે સુરક્ષિત છે?
  4. નોંધણી કરો: શું સરનામાં અને બીટ માસ્ક ડેટાશીટ સાથે સુસંગત છે?
  5. મેમરી: સ્ટ્રિંગ, મોટા એરે, શું રિકર્ઝન KB લેવલ ઓવરફ્લો બનાવે છે?
  6. એરર હેન્ડલિંગ: શું સેન્સર રીડિંગ એરર, કોમ્યુનિકેશન ટાઈમઆઉટ હેન્ડલ થાય છે?
  7. સલામત શરૂઆત: શું સ્ટાર્ટઅપ વખતે એક્ટ્યુએટર આઉટપુટ સલામત (નિષ્ક્રિય) સ્થિતિમાં મૂકવામાં આવે છે?

મીની કેસ

એમ્બેડેડ સિસ્ટમ એન્જિનિયર બારન પાસે AI કોડ લખે છે જે ડ્રોન માટે IMU વાંચે છે. કોડ કમ્પાઇલ કરે છે અને કામ કરતો દેખાય છે, પરંતુ કોણ મૂલ્યો અર્થહીન છે. બારન ચેકલિસ્ટ લાગુ કરે છે: ડેટાશીટ સાથે રજિસ્ટર સરનામાંની તુલના કરે છે અને શોધે છે કે AI ખોટી રીતે ગીરોસ્કોપ કન્ફિગરેશન રજિસ્ટર (0x1B ને બદલે 0x1A) આઉટપુટ કરે છે, તેથી સંવેદનશીલતા સ્કેલ ખોટું છે. એકવાર સુધાર્યા પછી, મૂલ્યો સ્થાયી થાય છે. પછી મુખ્ય લૂપમાં વિલંબ(10) નોટિસ; આને મિલી-આધારિત માળખામાં રૂપાંતરિત કરવું, કારણ કે ફ્લાઇટ કંટ્રોલ લૂપને અવરોધિત કરવું અસ્વીકાર્ય છે. છેલ્લે, તે જુએ છે કે વહેંચાયેલ કાઉન્ટર વેરીએબલ અસ્થિર નથી અને તેને ઉમેરે છે. AI એ હાડપિંજરને ઝડપી આપ્યું; પરંતુ સમીક્ષા સૂચિમાં ત્રણ અલગ-અલગ ભૂલો મળી: રજીસ્ટર, અવરોધિત અને અસ્થિર, અને હાર્ડવેરને બિલકુલ જોખમ ન હતું.

સામાન્ય ભૂલો

  • મુખ્ય નિયંત્રણ લૂપમાં delay() નો ઉપયોગ કરીને રીઅલ-ટાઇમ પ્રતિસાદને મારી નાખવો.
  • ISR સાથે શેર કરેલ વેરીએબલને અસ્થિર બનાવવાનું અને સાયલન્ટ ડેટા કરપ્શનનો અનુભવ કરવાનું ટાળો.
  • મલ્ટિ-બાઇટ શેર કરેલ વેરીએબલને બિન-પરમાણુ રીતે વાંચવું અને રેસની સ્થિતિ પેદા કરવી.
  • ડેટાશીટ સાથે AI દ્વારા આપવામાં આવેલા રજિસ્ટર/બીટ માસ્કની ચકાસણી ન કરવી.
  • મર્યાદિત રેમમાં સ્ટ્રીંગ્સ અને મોટા એરેનો ઉપયોગ કરીને મેમરી ઓવરફ્લો બનાવવી.
  • શરૂઆતમાં એક્ટ્યુએટર આઉટપુટ સુરક્ષિત કરવાનું ભૂલી જવું.

સારાંશમાં

  • એમ્બેડેડ કોડ; તે મર્યાદિત મેમરી, ચુસ્ત સમય અને ડાયરેક્ટ રજિસ્ટર એક્સેસ સાથે કામ કરે છે.
  • મુખ્ય લૂપમાં, વિલંબને બદલે મિલી-આધારિત નોન-બ્લોકીંગ પેટર્નનો ઉપયોગ કરવામાં આવે છે.
  • ISR ટૂંકા રાખવામાં આવે છે; વહેંચાયેલ ચલો અસ્થિર અને અણુ એક્સેસેડ હોવા જોઈએ.
  • રજીસ્ટર સરનામાં અને બીટ માસ્ક હંમેશા ડેટાશીટ સામે ચકાસવામાં આવે છે; AI ખોટું હોઈ શકે છે.
  • મેમરી, એરર હેન્ડલિંગ અને સુરક્ષિત સ્ટાર્ટઅપ સ્ટેટસ હંમેશા ચેક કરવામાં આવે છે.
  • શક્તિશાળી પ્રોમ્પ્ટ; તેમાં ચિપ, ફ્રેમવર્ક, સેન્સર, પ્રોટોકોલ, પિન અને અવરોધોનો સમાવેશ થાય છે.

એપ્લિકેશન કાર્ય

સેન્સર (દા.ત. DS18B20, MPU6050 અથવા HC-SR04) અને માઇક્રોકન્ટ્રોલર (Arduino/ESP32/STM32) પસંદ કરો. AI ને આ યુનિટમાં પાવરફુલ પ્રોમ્પ્ટ ટેમ્પલેટ સાથે નોન-બ્લોકિંગ રીડ કોડ જનરેટ કરવા દો. પછી સમીક્ષા ચેકલિસ્ટની સાત વસ્તુઓને એક પછી એક અનુસરો: ડેટાશીટ સાથે ઓછામાં ઓછા એક રજિસ્ટર/પિન મૂલ્યની તુલના કરો, લૂપ વિલંબ માટે તપાસો, શેર કરેલ ચલોની અસ્થિર સ્થિતિ તપાસો. પ્રથમ પ્રયાસમાં કેટલી વસ્તુઓ "પાસ" થઈ અને કેટલા સુધારાની જરૂર છે? તમને મળેલી દરેક સમસ્યા અને તેના ઉકેલની નોંધ કરો.