שְׁאֵלָה:
מהם המאקרו FLASH_ARRAY / FLASH_TABLE בקוד זה?
Cybergibbons
2014-03-05 04:35:37 UTC
view on stackexchange narkive permalink

ב קוד זה לפקח חימום, נראה שיש פקודות מאקרו הנקראות FLASH_ARRAY ו- FLASH_TABLE . אני לא מוצא שום התייחסות אליהם לא בקוד הזה, בארדואינו, או באינטרנט. מה הם עושים?

  FLASH_ARRAY (בתים, VARIABLE_DEVICE_TABLE, DEVICE_LADDNING_RETUR, DEVICE_LADDNING_UT, DEVICE_TANK1, DEVICE_TANK2, ... VARIABLE_ID_LOAD,> VARIABLE, VARIABLE / p> 
  FLASH_TABLE (בתים, NUMBER_TEMP_TABLE, 7, {DEVICE_LADDNING_RETUR, 99, 5, 10, 7, MAIN_TYPE_TEXT_CELCIUS, 2}, {DEVICE_LADDNING_UT, 99, 43, 10, 7, MA. .. {DEVICE_UTE, 0, 55, 15, 7, MAIN_TYPE_TEXT_CELCIUS_WITH_NEGATIVE, 103}, {VARIABLE_ID_EFFECT, 114, 29, 10, 7, MAIN_TYPE_TEXT_VARIABLE, 2});  
שתיים תשובות:
#1
+5
Cybergibbons
2014-03-05 04:42:39 UTC
view on stackexchange narkive permalink

לאחר חפירה נוספת, נראה שמדובר ב ספריית הפלאש של מיקאל הארט.

הסיבה לפיתוח ספרייה זו היא:

נתוני תוכנית סטטיים בפלאש / PROGMEM הם חלק מסובך בתכנות ארדואינו. כדי לחסוך זיכרון RAM יקר, משתמש מתחיל שכבר מכוון עם תחביר C ++ לא מוכר חייב לעכל מושגים מרתיעים כמו prog_char, PSTR (), PROGMEM, pgm_read_word () וכו '. אפילו משתמשים מנוסים נכשלו על ידי ההכוונה וההדבקה הנדרשים כדי לאחזר נתונים PROGMEM תקפים. . הוסף לכך כמה באגים לכאורה ביישום, וברור ש- PROGMEM הוא בלגן מסובך.

כתבתי ספרייה חדשה, Flash, שממצה את רוב המורכבות הזו. הוא מספק סוגים חדשים של מחרוזת, מערך, טבלה ומחרוזת שהופכים את אוספי הנתונים מבוססי ה- ROM לקלים לשימוש כמו סוגים "רגילים". כל אחד מהם עוקף את אופרטור C ++ [], כדי לחלץ אלמנטים בודדים משתמשים בתחביר גישה למערך מוכר:

באופן ספציפי, מדובר במקרו ובמחלקת עוזר פשוטה כדי להקל על יצירת מערכים וטבלאות של ערכים בזיכרון התוכנית.

שני המאקרו מוצהרים ככאלה:

  // דוגמה: FLASH_ARRAY (צף, טמפרטורות, 98.1, 98.5, 99.1, 102.1); # הגדר FLASH_ARRAY (סוג, שם, ערכים ...) \ const type type const ## _ flash [] PROGMEM = {values}; \ _FLASH_ARRAY<type שם שם > (שם ## _ flash, sizeof (name ## _ flash) / sizeof (type)); // דוגמה: FLASH_TABLE (uint8_t, גופנים, 7, ​​{ON, OFF, ON, ON, OFF, OFF, OFF} , {OFF, ON, OFF, ON, OFF, ON, OFF}); # define FLASH_TABLE (type, name, cols, ערכים ...) \ const type const name ## _ flash [] [cols] PROGMEM = {values }; \ _FLASH_TABLE<type שם של > ((const PROGMEM * שם) ## _ flash, sizeof (name ## _ flash) / sizeof (name ## _ flash [0]), cols);  

העוזר הפונקציות כוללות גודל ועוקפות את המפעיל [] כך שניתן יהיה לגשת אליהם בקלות כך

  FLASH_ARRAY [0]  

אני לא מסכים עם zmo - זה יותר מ- boilerplate. האזור של PROGMEM גורם להרבה שאלות ממשתמשי Arduino, וקל מאוד לעשות דברים לא נכונים בעת יצירת מערכים ב- PROGMEM.

האם תוכל להוסיף הסבר על המאקרו בתוך התשובה? תשובה זו מכילה קישור בלבד ולא תועיל במיוחד אם הקישור יעבור לא מקוון.
Cybergibbons, זה נחמד, שימושי ושימושי, אבל זה בהחלט מוסיף תקורה לא טריוויאלית: זה סוגר אובייקט במופע מלא. כשיש לך רק 2k RAM, כל בתים הם יקרים.
#2
+4
zmo
2014-03-05 07:43:33 UTC
view on stackexchange narkive permalink

מערך הפלאש הוא מ ספריית הפלאש של מיקאל הארט כפי שאתה מראה, ומה שהוא עושה זה שהם מכריזים על מערך או על אובייקט מטריצה ​​(טבלה) בזיכרון PROGMEM:

#define FLASH_ARRAY (type, name, values ​​...) \ const type type const ## _ flash [] PROGMEM = {values}; \ _FLASH_ARRAY<type> name (name ## _ flash, sizeof (name ## _ flash) / sizeof (type));

שהוא מופע של המעמד המוגדר _FLASH_ARRAY באותו קובץ, המהווה מתקן לגישה לזיכרון PROGMEM / Flash.

ביסודו של דבר, מדובר בהרבה תנור של מה שכבר עושה את המאקרו PSTR () בין השאר מ- קוד> pgmspace.h . אני באופן אישי הייתי נמנע משימוש בזה ומעדיף להשתמש במקרואים המקוריים יחד עם האינדקס והמצביעים שלי.

BTW, למעט קסם של Arduono IDE, אני לא חושב שזה יכול להיערך, כ Flash.h אינו כלול.

עריכה:

כדי להצביע על נקודה נוספת FLASH_TABLE / FLASH_ARRAY boilerplate / overhead, מכיוון ש- avc-gcc 4.8 הוצג __flash qualifier שהוא תחליף למאקרו PROGMEM , ופשט את כל הדברים :

  // כדי להשתמש במילולי מחרוזות מבלי להטיל # הגדר FSTR (X) ((const __flash char []) {X}) / / צור מחרוזת pstr בכתובת .progmem.data spaceconst __flash char * pstr = FSTR ("foo"); 

ולא עוד שימוש בפונקציות pgm_read _ * () , כעת אתה יכול לגשת לתוכן זיכרון הפלאש באמצעות * pstr , כפי שמוצג הוא שרשור זה. אם ברצונך לשמור על קוד התואם לגרסה ישנה יותר של avr-gcc, הנה פוסט המציע פקודות מאקרו לטיפול בשתי המערכות.



שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...