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

הבנה של צריכת חשמל במכשירים Embedded

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

עבור מכשיר קורטקס-M0+ טיפוסי פועל ב-48 MHz, זרם פעיל עשוי להיות סביב 5-10 מ"א, בעוד מצב שינה עמוק יכול להפחית את זה מתחת 1 מיקרוA. כתיבת קוד C יעיל פירושו צמצום הזמן שה- CPU מבלה במצב פעיל, צמצום תעבורת זיכרון, וניצול מצבי חומרה נמוכים כוח בכל מקום אפשרי.

אופטימיזציה של אנרגיה

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

אפשרויות נוספות לרכיבה:

  • (ב) ,0) ,fno-math-ernomath-ernocioph1) – מבטלת בדיקת שגיאות עבור פונקציות מתמטיות, שמירת הוראות.
  • (FLT:0)-ffunction-סעיפים - TERD-CREFLT) 1 - מאפשר למחבר לבטל פונקציות ונתונים לא בשימוש, להפחית את טביעת הרגל הבזקית.
  • (האופטימיזציה של זמן קישורים) - 0 (קישור) - מבצע הכחשה אגרסיבית וחיסול קוד מת על פני יחידות תרגום.
  • (ב) ,0)-לא-מאיר-כניסה אל-מחדש (FLT:1) – מונע מהמדור לייצר גישה זיכרון לא מזוינת, אשר מאטה או גישה כפולה לאוטובוס על ליבות ARM רבות.

מחקר תעשייתי של ההרחבה (FLT:0) מצא כי שילוב של (FLT:2-OsscioFLT 3 עם FLT:4-tophFLT:5 יכול להפחית צריכת אנרגיה עד 20-35% לעומת אופטימיזציה, תוך שמירה על הביצועים צריך תמיד למדוד את זמן הביצוע ואת הנוכחי בעת ביצוע דגלי הייצור; 55 יכול להפחית את צריכת האנרגיה על ידי 20 עד 35% לעומת ללא אופטימיזציה, תוך שמירה על ביצועים.

טכניקות קידוד לאנרגיה

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

בחירת סוג נתונים ואריתמטית

(ב) שימוש בסוג הנתונים הקטן ביותר חוסך זיכרון ולהפחית את תנועת האוטובוס (PreferFLT:0uint8 tentis tveFLT:1 או FLT:2int16 tigmLT 3) מעל ל-FLT:4intph:5 שבו טווח הערך מאפשר, להימנע מחלוקת ומודולולוציה; להחליף אותם עם שינויים מעט לוגיים לעומת 2, אם ניתן להחליף אותם באמצעות ניתוח יחיד, למשל, כלומר, אם הוא מ-F1, אם הוא משתנה באופן דומה.

פעולות נקודתיות הן יקרות במיוחד. על מכשירים Cortex-M4F עם חומרה FPU, צפים חד-כישור אחד הם מהירים, אבל כפול-precision עדיין מחקה בתוכנה. על M0/M0+ ליבות, כל נקודת צף ממחיש וצריך להימנע. השתמש בקידוד קבוע או בקנה מידה של teger במקום. גישה נפוצה מייצגת טווח של ערכים כמו שכפול, לאחר שינוי משמעותי.

אופטימיזציה וחיזוי הזרוע

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

  • (ב) [ה]: [ה], [ה], [ה], [ה], [ה],] ב[[המאה ה',], או ב[[המאה ה-1]], ובין אם כן, ב[[1924]],]], [[1924]],]], [[1924]]]], [[1924]]]]]],]], [[1924]]]]]]]]
  • (ב) ,0) ,Using ספירה-למטה לולאות למטה (FLT:4 טיפוסי יוצר פחות הוראות מאשר לספור, כי אפס-קדוק הוא חינם על ארכיטקטורות רבות (למשל, ARMFLT:5 קובע דגלים).
  • (ב) ויקרא י"א: ויקרא י"ד): "השיבות לזיכרון ושמור את הצנרת במלואה.
  • (ב) [ה]הפעלת ה-[[1824]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]

לולאה טובה עשויה לבלות עד 70% פחות זמן בתחום הפעיל מאשר יישום תמים, בתרגום ישיר לאנרגיה נמוכה יותר.

דפוסי הגישה של Memory Access

(הזיכרון הפלאש קורא יותר כוח מאשר גישה ל-SRAM, וממשקי זיכרון חיצוניים הם אפילו יקרים יותר.ארגן נתונים כדי למקסם את להיטי ה-Cache (אם קיים כאב) או למזער את מדינות ההמתנה: השתמש ב-FLT:0constFLT:1 ו-FLT:2static ContFLT:3 for Lookup טבלאות כך שהן שוכנות בפלאש, אך גישה להן במידה ניכרת כדי למנוע רצף לעתים קרובות.

גישה Bit-field יכולה להיות יקרה כי המדור חייב ליצור רצפים של כתבי-העתיים לקריאה.כאשר דגלים מרובים חולקים עוטה, לשקול שימוש ב-FLT:0uint8 tigFLT:1 ופעולות bitwise ישירות; התוצאה היא לעתים קרובות קטנה ומהירה יותר מאשר שדה C סיביות.

DMA (Direct Memory Access) הוא בעל ברית חשוב ליעילות כוח.במקום לקבל את נתוני עותק CPU על ידיte-byte-byte (למשל, מ UART ל- RAM), להגדיר ערוץ DMA כדי לבצע את ההעברה בעוד ה- CPU נכנס למצב כוח נמוך. מיקרו-בקרים רבים תומכים DMA מפריפריה לזיכרון ולזיכרון.

התנגשויות נגד זיהום

בקביעת דגל בלולאה עסוקה שומר על כוח CPU פעיל וצריכת. Interrupt-oriented I / O מאפשר CPU לישון או לבצע עבודה אחרת עד אירוע מתרחשת.עבור משימות תקופתיות, להשתמש בלוחות חומרה במקום עיכובים בתוכנה. לדוגמה, ולא LT 7 זה נחשב ל 1 000, להגדיר זמן כדי ליצור הפרעה לאחר המרווח הרצוי לשים את CPU לתוך מצב שינה.

נקודה אחת עדינה: כל ההקשר של הפרעות אכילה לחסוך / חנות יתר על פני השטח.אם הפרעות מתרחשות בשיעורים גבוהים מאוד (למשל, כל 10 מיקרומטר), ראש הפנים יכול לצרוך יותר כוח מאשר גישה פשוטה לקלה.מד את הכדאיות של המערכת שלך ו- CPI כדי להחליט. באופן כללי, עבור אירועים איטי יותר מ- 100 kHz, הפרעות הן יעילות יותר.

להימנע מזיכרון דינמי

שימוש ב-FLT:0 mallocFLT:1 ו-FLT:2freecioFLT 3: בקושחה משובצת לא רק מציג תזמון בלתי צפוי ופיצול אלא גם צור אנרגיה לניהול ה-Heap.Prefer שהוקצה באופן סטטי buffers ו-Buffocators בריכה לא רק דינמית, השתמש במאגר קבוע שלא נכשל ויש לו מורכבות אנרגיה של O(1) עלות של פעולות מיקרו-בקר קטן יותר מאשר קורט.

תכונות חומרה

רוב המיקרובקרים המודרניים כוללים תכונות המיועדות במיוחד להפחית את הכוח.

מצבי כוח נמוך ומקורות Wake-up

ספקי MCU מציעים מספר מצבי שינה: idle, שינה עמוקה, ו- hibernate. in C, אלה בדרך כלל נכנסים על ידי ביצוע AFLT:0WFIigFLT:1 (המתנה ל- Interrupt) או (FLT:2WFEFLT 3: 3 (המתנה לאירוע) הוראה על המפתח להגדיר מקורות מתעוררים (למשל, GPC), או RTC עבור בחירת כוח מתאים, IF3, או R.

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

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

while (1) {
 uint32_t next_event_time = schedule_next_event();
 enter_sleep_until(next_event_time);
 process_event();
}

שעון GING ו-Wolage Scaling

רבים MCUs מאפשרים שעונים היקפיים להיות מוגבלים באופן אישי.ב C, זה נעשה על ידי כתיבה לשעון מאפשר לרשום (למשל, RCC->AHNR על STM32) לאחר תחילתו של פריפריה, להשבית את השעון עד הנדרש.כמה מכשירים מתקדמים תומכים במתח דינמי ותדירות (DVS). הפחתה של שעון CPU מ -24 ל-48 ל- M יכול עדיין להזין את המועד האחרון, אך ורק לאחר מכן הוא יכול להיות פעיל ביותר, אך ורק לאחר מכן, אך ורק כדי זמן קצר עד כדי כך הוא יכול להיות פעיל, אך ורק לאחר מכן, רק כדי זמן קצר עד כדי כך הוא יכול לענות על ידי זמן קצר יותר מ- 50%.

לדוגמה, על NXP LPC55S6x, באפשרותך לשנות את השעון המרכזי עם:

CLOCK_SetFreq(kCLOCK_Core, 24000000U);

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

שימוש ב-Chip Peripherals עבור Offload

כמה פריפריה יכולה לפעול באופן אוטונומי מה- CPU. An אנלוגי קומפוטור יכול לגרום להפרעה כאשר סף חצוי, חיסול של סקרים רצופים. A חומרת זמן יכול ליצור אותות PWM ללא התערבות CPU. מערכת אירועים (כפי שנמצאת במיקרוצ'יפ AVR, מעבדת הסיליקון, או מכשירי TI) יכול לשרשרת לנסח קוד C המאפשרים אלה מצבי חירום להפחית את הזמן הפעיל ל-C.

תגית: Power-Optimized LED Blinker

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

Naive implementation (polling delay):

while (1) {
 toggle_led();
 delay_loop(1000000); // busy-wait ~100 ms
 toggle_led();
 delay_loop(19000000); // busy-wait ~1900 ms
}

כאן, CPU פעיל 100% מהזמן, בזבוז אנרגיה המתנה הנוכחית - 5 mA, אנרגיה ממוצעת - 1080 mAh / שנים (מעל 3.0 V).

(ב) ,0) יישום שינה:

void SysTick_Handler(void) {
 static uint32_t ticks = 0;
 ticks++;
 if (ticks == 2000) {
 toggle_led();
 ticks = 0;
 }
}
int main() {
 init_systick(1); // 1 ms tick
 while (1) {
 __WFI(); // sleep until SysTick interrupt
 }
}

עכשיו ה- CPU ישן עבור רוב התקופה השנייה, רק מתעוררות עבור 1 ms סיסטייק להפריע ואת LED להתעלל. טיפות נוכחיות ממוצעות -0.5 mA (כולל דליפה), התשואות - 120 mAh / שנה - שיפור 9x.

(ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

במקום להשתמש ב- CPU כדי לעכל את LED, להגדיר נתב 16 סיביות כדי להתפוקה PWM עם 100 ms על-זמן כל 2 s. ואז להשבית את כל שאר המשקפיים ולכנס לישון עמוק.הזמן פועל בשטח תמיד-על-ידי עיצוב זהיר, ממוצע יכול ליפול ל -10 μA, כולל צריכת LED עצמו, נותן חיים מעל חמש שנים.

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

מדדים מעשיים ואימות

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

  • שיאים פעילים: להבטיח שהם קצרים ככל האפשר.
  • שינה נוכחית: לאמת אותו תואם את ערך גליון הנתונים עבור מצב שנבחר.
  • מצבי Wake-up: שינויים מהירים שעלולים לגרום לספיקים עתידיים מופרזים.

חישוב אנרגיה ממוצעת למשימה או לשנייה ולהשוות לדרישות: A (FLT:0EETimes articleFLT:1 מדגיש כי פיתוח מונחה מדידות לעתים קרובות מגלה כיור אנרגיה מפתיע, כגון עדשות בלתי צפויות או צף GPIOs, אשר יכול להיות קבוע עם שינויים קוד פשוט (כמו הצבת pins לא בשימוש למצב אנלוגי או תצורה של אותם כמו פלט נמוך).

מסקנה

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

לקריאה נוספת, ייעוץ (FLT:0)ARM Software Development GuideveFLT:1 עבור הנחיות בעלות כוח נמוך ו-FLT:2Microchip Power Manager Tools, כולל Power Manager 3 עבור תמיכה ספציפית למכשיר.