שְׁאֵלָה:
מה אוכל לעשות אם נגמר לי זיכרון הפלאש או ה- SRAM?
Peter Bloomfield
2014-02-15 07:09:33 UTC
view on stackexchange narkive permalink

על פי התיעוד של Arduino, ל- ATmega328 זיכרון פלאש של 32KB עבור ה- Bootloader + סקיצה שהועלתה, ורק 2KB SRAM לנתוני זמן ריצה. ל- ATmega2560 יש לא מעט יותר, בהיקף של 256KB ו- 8KB בהתאמה.

בשני המקרים, מגבלות אלה נראות קטנות למדי, במיוחד בהשוואה למכשירי צריכה בגודל דומה, כמו סמארטפונים. > מה אתה יכול לעשות אם נגמר לך? לְמָשָׁל. אם השרטוט שלך גדול מדי, או שאתה צריך לעבד הרבה נתונים (כגון מחרוזות) בזמן הריצה? האם יש דרך להרחיב את ה- Flash או ה- SRAM?

נסה להשתמש באופטימיזציה משתנה. כמה משתנים שונים נידונים [כאן] (http://arduino.stackexchange.com/questions/196/when-to-use-different-variable-types)
השתמש בהיקפים מתאימים למשתנים שלך אם עדיין לא עשה זאת, המהדר ייעל את השימוש ב- RAM עבורך כאשר משתנים אינם בשימוש.
ייתכן שתשתמש בפועל ב- Teensy 3.2 (עם תוכנת Teensyduino), שתהיה דומה לארדואינו. בהתחשב בכך שנגמר לך זיכרון RAM / PROGMEM, פירוש הדבר שסביר להניח שמה שאתה מנסה לעשות הוא לדחוף את הארדואינו שלך. Teensy 3.2 לא כל כך יקר יותר. אבל יש לו: 32bit, 72MHz (wtf !?) 256KB FLASH ו- 64KB RAM ו- UART 3x. לא יותר זיכרון תוכניות כמו ה- ATmega2560, אבל זיכרון ה- RAM והעלאת המהירות צריכים להספיק.
ארבע תשובות:
#1
+30
Peter Bloomfield
2014-02-15 07:09:33 UTC
view on stackexchange narkive permalink

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

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

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

אופטימיזציה של נתוני זמן ריצה (SRAM) נוטה להיות מעט קלה יותר כשאתה רגיל לזה. מלכודת נפוצה מאוד עבור מתכנתים מתחילים היא שימוש בנתונים גלובליים רבים מדי. כל דבר שהוכרז בהיקף גלובלי יתקיים לכל אורך חייו של השרטוט, וזה לא תמיד הכרחי. אם משתמשים במשתנה רק בפונקציה אחת, ואין צורך להתקיים בין שיחה, הפוך אותו למשתנה מקומי. אם צריך לחלוק ערך בין הפונקציות, שקול אם תוכל להעביר אותו כפרמטר במקום להפוך אותו לכלל. בדרך זו תשתמש ב- SRAM רק עבור משתנים אלה כאשר אתה זקוק לו בפועל.

רוצח נוסף לשימוש ב- SRAM הוא עיבוד טקסט (למשל באמצעות המחלקה String ). באופן כללי, כדאי להימנע מביצוע פעולות מחרוזת במידת האפשר. הם חזירי זיכרון מאסיביים. לדוגמא, אם אתה מוציא הרבה טקסט לטורי, השתמש בשיחות מרובות ל Serial.print () במקום להשתמש בשרשור מחרוזות. נסה גם לצמצם את מספר מילולי המחרוזות בקוד שלך אם זה אפשרי.

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

השתמש ב- EEPROM
EEPROM משמש לאחסון ארוך טווח של דברים שמשתנים רק מדי פעם. אם אתה צריך להשתמש ברשימות גדולות או בטבלאות חיפוש של נתונים קבועים, שקול לאחסן אותם ב- EEPROM מראש, ולשלוף רק את מה שאתה צריך בעת הצורך.

ברור ש- EEPROM די מוגבל בגודלו ובמידת הצורך. מהירות, ויש לו מספר מוגבל של מחזורי כתיבה. זה לא פיתרון נהדר למגבלות נתונים, אבל זה עשוי להספיק כדי להקל על הנטל על Flash או SRAM. אפשר בהחלט להתממשק עם אחסון חיצוני דומה, כמו כרטיס SD.

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

קבלת SRAM נוסף היא למעשה די פשוטה. אפשרות אחת היא להשתמש בשבב 23K256 אחד או יותר. ניתן לגשת אליהם באמצעות SPI, ויש את ספריית SpiRAM שיעזור לך להשתמש בהם. רק היזהר שהם פועלים ב -3.3 וולט לא 5 וולט!

אם אתה משתמש במגה, תוכל לחילופין להשיג מגני הרחבה של SRAM מ Lagrangian Point או מעגלים מחוספסים א>.

אתה יכול גם לאחסן נתונים קבועים בזיכרון התוכנית, במקום SRAM, אם יש לך בעיות שטח SRAM וזיכרון תוכנית פנוי. ראה [כאן] (http://jeelabs.org/2011/05/23/saving-ram-space/) או [כאן] (http://www.nongnu.org/avr-libc/user-manual/pgmspace .html)
אלטרנטיבה נהדרת נוספת ל- EEPROM היא כרטיס SD. זה אכן תופס כמה יציאות IO, אך אם אתה זקוק לנתח גדול של שטח, למשל נתוני מפות או דומים, זה יכול להיות קל להחליף ולערוך באמצעות תוכנית מותאמת אישית במחשב האישי.
אין לעודד אנשים להשתמש ב- SPI SRAM או הרחבות זיכרון RAM, אם הם חסרים זיכרון. זה פשוט בזבוז כסף. בחירה ב- MCU גדול יותר תהיה זולה יותר. מלבד זאת, הביצועים יכולים להיות גרועים מאוד. ראשית יש לבצע הערכת שטח: אם השימוש המוערך ב- RAM קרוב למגבלה, אז אתה בוחר בלוח / מיקרו-בקר / פלטפורמת פיתוח שגויים. בטח, שימוש טוב (אחסון מחרוזות בפלאש) ואופטימיזציה (הימנעות משימוש בספריות מסוימות) יכולים להחליף משחק אמיתי. אולם בשלב זה אני לא רואה יתרונות בשימוש בפלטפורמת תוכנת Arduino.
#2
+25
sachleen
2014-02-15 09:24:15 UTC
view on stackexchange narkive permalink

כשאתה מעלה את הקוד שלך לארדואינו שלך, אמור Uno למשל, זה יגיד לך כמה בתים הוא משתמש מכל 32K הזמינים. זה כמה זיכרון פלאש שיש לך (תחשוב על דיסק קשיח במחשב). בזמן שהתוכנית שלך פועלת, היא משתמשת במה שנקרא SRAM, ויש הרבה פחות מזה זמין.

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

אחסון מחרוזות בפלאש במקום SRAM.

אחד הדברים הנפוצים ביותר שראיתי הוא שבב נגמר. זיכרון מכיוון שיש יותר מדי מחרוזות ארוכות.

השתמש בפונקציה F () בעת שימוש במחרוזות כך שהם מאוחסנים ב- Flash במקום ב- SRAM, מכיוון שיש לך הרבה יותר מזה זמין.

  Serial.println (F ("מחרוזת זו תישמר בזיכרון הבזק"));  

השתמש בסוגי הנתונים הנכונים

ניתן לשמור בתים על ידי מעבר מ- int (2 בתים) ל בתים (בת אחד). בתים לא חתומים ייתן לך 0-255, כך שאם יש לך מספרים שאינם גבוהים מ- 255, שמור בתים!

כיצד אוכל לדעת שנגמר לי הזיכרון?

בדרך כלל תתבונן בתוכנית שלך מתנהגת בצורה מוזרה ותוהה מה השתבש ... לא שינית שום דבר בקוד ליד הנקודה שבה היא מתבלבלת, אז מה נותן? נגמר לו הזיכרון.

ישנן כמה פונקציות שיעידו לך כמה זיכרון זמין יש לך.

זיכרון זמין

האם אתה יודע אם העניין 'F ()' הוא פונקציה ספציפית לארדואינו או שהוא נמצא בספריות ה- AVR? אתה יכול לשקול להזכיר גם 'PROGMEM const ...'.
כמו כן אתה יכול להשתמש במבני סיביות כדי לצמצם עוד יותר את השטח המשמש את המשתנים שלך 5eg אם אתה מתמודד עם הרבה בוליאנים).
#3
+17
jfpoilpret
2014-02-15 23:28:24 UTC
view on stackexchange narkive permalink

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

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

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

  • פלאש (כלומר זיכרון תוכנית); לשם כך, באפשרותך:
    • להסיר קוד מת (למשל כל קוד שנכלל אך לא נעשה בו שימוש) ומשתנים שאינם בשימוש (זה עוזר גם ב- SRAM)
    • לפענח קוד כפול
    • הסר את מטען האתחול לגמרי (אתה יכול להרוויח בין 0.5K עבור UNO ו- 2 או 4K עבור דגמים אחרים של Arduino); יש לכך כמה חסרונות אם כי
  • SRAM (כלומר נתונים על מחסנית, ערימה וסטטי); לשם כך תוכלו:
    • להסיר משתנים שאינם בשימוש
    • למטב את הגודל של כל משתנה (למשל אל תשתמשו ב -4 בתים ארוכים - אם אתם זקוקים רק ל -2 בתים)
    • השתמש בהיקף הנכון עבור המשתנים שלך (והעדיף מחסנית על נתונים סטטיים במידת האפשר)
    • צמצם את גודל המאגרים למינימום הקפדני
    • העבר נתונים קבועים ל- PROGMEM (כלומר שלך נתונים סטטיים יישארו בזיכרון הפלאש ולא יועתקו ל- SRAM בתחילת התוכנית); זה חל גם על מחרוזות קבועות שעבורם אתה יכול להשתמש ב F () macro)
    • הימנע מהקצאה דינמית אם זה לא הכרחי; תימנע מ ערימה מקוטעת שלא עשויה להתכווץ גם לאחר שחרור זיכרון

מתוארת גם גישה נוספת להפחתת השימוש ב- SRAM (אך לעתים רחוקות נעשה בו שימוש מכיוון שהוא מעט כבד בעת קידוד ולא יעיל במיוחד), הוא מורכב משימוש ב- EEPROM לאחסון נתונים שנבנו על ידי התוכנית שלך, אך לא נעשה בו שימוש מאוחר יותר כאשר מתרחשים כמה תנאים, כאשר ניתן לטעון נתונים מ- EEPROM .

הסרת קוד מת - המהדר _ באמת_ טוב לטפל בזה בשבילך- זה לא ישנה שום הבדל אם יש לך הרבה קוד שלא נקרא אי פעם. אם אתה מתקשר בטעות לקוד שאתה לא צריך, אז זה שונה, כמובן.
#4
+9
David Cary
2014-02-16 03:21:35 UTC
view on stackexchange narkive permalink

יש שני דברים לעשות אם נגמר לך האחסון:

  • איכשהו "אופטימיזציה" של הקוד שלך כך שהוא זקוק פחות לאחסון; או לפחות משתמש פחות מסוג האחסון המסוים שנגמר לך (ומשתמש יותר בסוג האחסון שעדיין יש לך הרבה). לחלופין,
  • הוסף עוד שטח אחסון.

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

ישנם 3 דברים שמשתמשים בפלאש או ב- SRAM; כל אחד מהם זקוק לגישה מעט שונה להוספת אחסון:

  • אחסון משתנה: ניתן להרחיב את SRAM, כפי שכבר ציין שקלין. SRAM, FRAM ו- NVSRAM מתאימים למשתנים המשתנים במהירות. (בעוד שבאופן עקרוני תוכל להשתמש בפלאש לאחסון משתנים, אז אתה צריך לדאוג להתבלות פלאש). SPI (פרוטוקול סדרתי) הוא הקל ביותר להתחברות Arduino. ספריית SpiRAM עובדת עם שבב ה- MicroAM שבב 23K256 SRAM. שבב ה- Ramtron FM25W256 FRAM הסדרתי (כיום בבעלות Cypress) משתמש גם ב- SPI . Cypress CY14B101 NVSRAM משתמש גם ב- SPI.Etc.

  • נתונים קבועים שצריכים להיות שם בפעם הבאה שהכוח יופעל: זה פשוט כמעט כמו הרחבת SRAM. ישנם התקני אחסון חיצוניים רבים . נכון לעכשיו העלות הנמוכה ביותר ל- MB היא כרטיסי פלאש SD (אליהם ניתן לגשת באמצעות SPI). הרמטרון FM25W256 (ראה לעיל), Cypress CY14B101 (ראה לעיל) וכו 'יכולים גם לאחסן נתונים קבועים. מגני הרחבה רבים כוללים חריץ לכרטיס SD, וכמה ספריות ו מדריכים תומך בקריאה וכתיבה לכרטיסי SD (פלאש). (איננו יכולים להשתמש ב- SRAM לשם כך, מכיוון ש- SRAM שוכח הכל כשהכוח נכבה).

  • קוד הפעלה: למרבה הצער, הרחבת זיכרון ה- Flash של Arduino כדי להגדיל את שטח התוכנית אינה אפשרית. עם זאת, מתכנת יכול תמיד לשדרג מחדש שרטוט להפחתת גודל הקוד על חשבון הגדלת גודל הנתונים והפיכתו לאט יותר לאט. (בתיאוריה, אתה יכול להרחיק לכת ולתרגם את כל המערכון שלך לשפה פרשנית כלשהי, לאחסן את הגרסה של הרישום שלך בכרטיס SD, ואז לכתוב מתורגמן לשפה ההיא שפועל על הארדואינו כדי להביא ולבצע הוראות מה כרטיס SD - בהמשך לארדואינו, מתורגמן BASIC, מתורגמן טום נאפייר פיקארו, שפה מסוימת ספציפית ליישום וכו ').



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