מערכות בקרה ואוטומציה
כיצד לכתוב קוד C עבור מכשירים Iot
Table of Contents
כתיבת קוד C למכשירי IoT היא מיומנות בסיסית עבור מפתחים משובצים אשר צריכים לפרוס יישומים בפלטפורמות חומרה מגוונות.מערכת האינטרנט של IoT כוללת מיקרו-בקרים עם ARM Cortex-M, RISC-V, AVR, וארכיטקטורה קניינית, כל אחד עם מפות זיכרון ייחודיות, רישומים היקפיים היקפיים, ו-Matderr quirks. ללא תכנון מכוון עבור יכולת , שעובד על מטרה אחת לעתים קרובות, מספק מסלולים יקרים יותר, והשגת גישות תחזוקה יעילה זו, והשגת טקטיקות יעילות אסטרטגית מורחבת.
הבנה של זמינות בפיתוח IoT
יכולת זו פירושה שקוד המקור יכול להיות מורכב והפעלה על ארכיטקטורות חומרה שונות עם מעט או לא שינוי. בעולם ה-IoT, יכולת ה-Silability אינה רק נוחות – זו דרישה עסקית.מחזורי חיים של מוצרים הם ארוכים, שרשרת אספקה משתנה, וסיליקון חדש מופיע כל הזמן.בסיס קוד נייד מאפשר לך להשתמש בקושחה הקיימת על פני דורות של מוצרים, במהירות לא לרכיבים חלופיים במהלך מחסור, ולהפחית זמן לשוק מוצרים נגזרים.
קיימות על ספקטרום.בסופו של דבר, קוד שהוא לחלוטין תלוי בפלטפורמה (למשל, אלגוריתמים גינריים) מאגדים בכל מקום.בסופו של דבר, קוד שמשמרן ישירות את רישום החומרה אינו ניתן לידע.המטרה של C עבור IoT היא לבודד פרטים לא-פורטיים מאחורי שכבות מופשטות, כך שהאלגוריתם העסקי הליבה וקוד נותר ניתן להדהד.
אתגרים משותפים לקוד יכולת
כמה הבדלים ברמה נמוכה ממגרעות C יציבות:
- (FLT:0) Endianness.FLT:1 ARM Cortex-M ו- AVR הם מעט endian; כמה אדריכלות ישנה יותר (למשל, Freescale HC12 הם endian גדול.
- (ב) גודל המילה והגדרות מסוג זה (FLT:1) AnFLT:0 עשוי להיות 16 ביטים על AVR 8 סיביות, 32 סיביות על קורטקס-M0, ו 64 סיביות על מעבד RISC-V 64 סיביות.
- (FLT:0) ,register Map Differences.FLT:1 אפילו שני MCUs מאותו המוכר יש לעתים קרובות כתובות בסיס היקפיות שונות, שדות סיביות ורצף תצורה.
- (ב) ,0) ,(הרחבות והרחבות של ⁇ : ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) חלק מהפלטפורמות דורשות התאמה קפדנית עבור גישה של 32 סיביות; אחרים מטפלים בגישה לא משוחדת עם מטפל אשם.
- (FLT:0) טיפול וערעור השימוש במחסנית:1 , וקטורים אינטררופוט, מודלים עדיפות והתנהגות קינון משתנים באופן נרחב.
אסטרטגיות לכתיבה של קידוד C
שכבות קשיחות (HAL)
(ה) כלי רב העוצמה ביותר בארסנל הקוד הנייד הוא AFLT:0hardware אבסטרקטימנט של שכבת ההפשטה (A-HAL), אשר עוצב היטב חושף ממשק API אחיד עבור פריפריה משותפת (GPIO, UART, I2C, SPI, Timers) תוך הסתרת ה-Hal-SHL-King-King-King.
דפוס יישום כללי טיפוסי נראה כך:
// hal_gpio.h (common)
typedef uint8_t gpio_pin_t;
typedef uint8_t gpio_port_t;
void hal_gpio_set_output(gpio_port_t port, gpio_pin_t pin);
void hal_gpio_set_high(gpio_port_t port, gpio_pin_t pin);
void hal_gpio_set_low(gpio_port_t port, gpio_pin_t pin);
קבצים ספציפיים בפלטפורמה (למשל, FLT 7) מכילים את הרשום בפועל כותב.כאשר נעים ל-MCU חדש, רק מקורות HAL ברמה נמוכה צריכים לכתוב מחדש, בעוד שכל השכבות הגבוהות יותר נותרו בלתי נסבלים.
אימוץ מנגנונים סטנדרטיים
הספרייה הסטנדרטית של C מספקת בסיס נייד עבור פעולות נפוצות רבות.פונקציות כמו FPLT:8 , ⁇ 9 , כלי מיתר, פונקציות מתמטיות זמינים על כל מאגד C. להימנע הנחות על ספריה פנימיים הוא קריטי - לעולם לא לשכתב מחדש 10 עבור ביצועים אלא אם כן אתה לא מבין כי יישום המדור שלך הוא לא מספיק.
(ב) מערכות IoT עם זיכרון מוגבל, שקול להשתמש במצע של הספרייה הסטנדרטית (כגון:0newlib-nanocioFLT:1 במערכת האקולוגית של GCC) ולא לגלגל את שגרת המיתרים שלך באופן דומה, ה-FLT:11 ו-FLT:12 זמינים באופן אוניברסלי: TheFLT:2GNU Library CLT5, 3.
שימוש קבוע-Width Data Types
(ב) ב[[1924]] וב[[1924]]]], [[1924]]]]]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]], [[1924]]]]]]]], [[1924]], [[1924]]]]]]]]]], [[1924]], [[1924]], [[1924]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]], [[1924]]]]]]]]]], [[1924]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]]]], [[1924]], [[1924]], [[1924]], [[1924]], [[1924]], [[1924]], [[1924]], [[1924]]]]]], [[1924]], [[1924]], [[1924]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]], [[
כאשר אתה צריך לנסח נתונים על פני תחבורה מוכוונת על ידי te, לשלב סוגים קבועים של עדי ראייה עם פונקציות ההמרה מפורשות על ידי מסדרה (ראהFLT:24, FLT:25, או המקבילות הניידות שלהם) לעולם לא פשוט להטיל את ה-FLT:26 ל-FLT:27 ולשלוח אותו מעל רשת - אנדואנטות נשך.
המונחים:
הוראות עיבוד הן כלי לגיטימי עבור קוד ספציפי פלטפורמה, אבל יש להשתמש בהם באופן עסיסי. Define קבוצה קטנה של מאקרו בראש מרכזי יחיד (למשל, FLT:28) ולא לפזר את ה-FLT:29 דרך כל קובץ.
// platform_config.h
#if defined(STM32L4)
#define PLATFORM_STM32L4
#elif defined(EFM32GG)
#define PLATFORM_EFM32GG
#else
#error "Unsupported platform"
#endif
לאחר מכן, בקוד, השתמש בגנרית (FLT:31) רק כאשר יש צורך מוחלט. זכור כי עודף (FLT:32) הופך קוד קשה לקריאה ותחזוקה.עדיף את ההפשטות על גבי אוסף מותני שבו ניתן.
מינימום תלות חיצונית
כל ספריה של צד שלישי שאתה כולל היא סכנה אפשרית של יכולת עמידה לפני הוספת תלות, ודא כי היא תומכת בכל ארכיטקטורות היעד שלך וכי היא אינה נמשכת הנחות בלתי ניתנות לדיווח. Libraries שנכתבה לחלוטין ב- C נייד (למשל, FLT:0FatFSFLT:1 או FLT:2FreeOSFLT3) הם בטוחים יותר מאשר אלה שעדיין יכולים לעטוף קוד ספציפי או לעטוף אחר כך, לאחר מכן, אפילו לא ניתן להשתמש בו.
קישור: המאמר של ה-FLT:0 (Esbedded.com על קוד C CoderovigFLT:1) מציע נקודת מבט נוספת על ניהול התלויות.
טיפים מעשיים ל- Enhancing Portability
תגית: Modular Code
לשבור את הקושחה שלך לתוך מודולים עצמאיים עם ממשקים מוגדרים היטב.כל מודול צריך לחשוף את הפונקציונליות שלה באמצעות קובץ ראש ולהסתיר את הפרטים הפנימיים שלה.הפרדה זו של חששות עושה את זה קל להחליף מודול עם גרסה ניידת כאשר עובר לפלטפורמה חדשה. לדוגמה, מודול בקרה מוטורי צריך לדבר עם HAL עבור פלט PWM, לא ישירות ללוח זמן.
מסמכים קשיחים
ברור כי לא ניתן להסיק כל קוד אשר מניח התנהגות חומרה מסוימת. השתמש הערות כדי להסביר מדוע גישה מסוימת שאינה ניתנת לדיווח, אילו פלטפורמות הוא עובד, ומה יהיה צורך לשנות למטרה אחרת.התיעוד הזה אינו יקר כאשר המפתח המקורי אינו זמין ומהנדס חדש חייב לפורט את הקוד.
כלי פיתוח Cross-Platform Build Tools
בניית מערכות כמו FLT:0.CMakeFLT 1 או (FLT:2MesonveFLT 3: 3) יכול לנהל הגדרות מטרות מרובות ממבנה פרויקט יחיד. CMake, לדוגמה, מאפשר לך לציין קבצי Toolchain עבור כל פלטפורמה ולהגדיר הגדרות על בסיס המטרה.זה מבטל את הצורך לשמור באופן ידני של קבצי פרויקט נפרדים עבור IAR, Kepilil, ו- GCC: LT5 LT5 , , , , ההרחבה של LT5: LT5 .
שימוש בטכניקות bit-Manipulation
כאשר הגדרת או ניקוי ביטים ברשומות, להימנע מכתיבה של מסכות מוחלטות הנותנותנות מיקומים bit-field. במקום זאת, השתמש קבועים סמליים המוגדרים ב- HAL, ולהשתמש במאקרו או בפונקציות קו ישיר לפעילות בטוחה:
#define BIT_SET(reg, bit) ((reg) |= (1u << (bit)))
#define BIT_CLEAR(reg, bit) ((reg) &= ~(1u << (bit)))
Define (FLT:34 ), פרמטר מופשט ולא אינפורטגר מילולי, כך, אם המיקום הקטן משתנה על MCU שונה, רק ההגדרה הקבועה חייבת להשתנות, לא השימוש בכל בסיס הקוד.
בדיקות ואימות בפלטפורמות
יש לאמת את טענות ה-Portability. השתמש באינטגרציה רציפה (CI) אשר בונה את הפרויקט שלך עבור כל הפלטפורמות הנתמכות.In CI, להפעיל כלים ניתוח סטטי כגון FLT:0PC-lintigFLT:1 או FLT:2Coverity FigFLT 3 כדי לזהות שימוש לרעה של מבנים לא-portable. for Testing, למניעים (למשל QEMU for ARM) או ל-R.
בדיקות רגרסיה צריכות לממש את כל ממשקי ה- HAL על כל פלטפורמה כדי לתפוס את המיומנות מוקדם.מבחן כמו "לשרט עיל ל-UART, לקרוא אותו בחזרה בלולאבק" יחשוף את ההבדלים בתזמון או בתצורה בין יישום UART.
מסקנה
כתיבת קוד C נייד למכשירי IoT אינה מחשבה – זוהי משמעת שחייב להיות אפוי לתוך האדריכלות מיום אחד. על ידי השקעה בשכבה מופשטת חומרה, הדבקות בסוגים סטנדרטיים וספריות, באמצעות איסוף מותני, ובדיקה קפדנית על פני מטרות, אתה יוצר קושחה שיכולה לשרוד את השינויים הבלתי נמנעים בנוף החומרה.