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

הבנת רשומות אבטחה

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

רוב המיקרובקרים המוטבעים (למשל, ARM Cortex-M, AVR, RISC-V) משתמשים ב-זיכרון ממופת I/O (MMIO) המנצלים גישה לתפקוד זיכרון רגיל, אך ההיגיון החומרי שמאחורי כתובות אלה גורם להם להתנהג אחרת.קריאה של רישום עשוי להחזיר ערך המשקף קלט פיזי או את התצורה הנוכחית; לכתוב חומרת יכול לגרום לפעולה מיידית.

ארגון רישום

לעתים קרובות רשומים מחולקים לפריפריה.לדוגמה, UART peripheral עשוי להיות רשום עבור נתונים (DR), מצב (SR), שליטה (CR1, CR2) ו- baud Rate (BRR) כל רישום הוא בדרך כלל 8, 16, או 32 סיביות רחב.גליון הנתונים יגדירו את bit בתוך כל רישום - לדוגמה, bit-3 של שליטה עשוי לרשום את המקור, בעוד ש- 4.7 סיביות.

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

צעדים להגדרה נכונה

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

1.זיהוי כתובת הרישום

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

לדוגמה, על כתובת הבסיס של STM32F407, כתובת הבסיס של USART2 היא (FLT:1), מנהל CMSIS הרשמי מגדיר את FLT:2 והורה 3:3 תמיד מעדיף את כתובות סמליות אלה על פני מספרי הגלם.

2.הבנה פונקציות רישום

קרא את פרק הנתונים של הפריפריה שאתה מנקה.לתשומת לב:

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

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

3.הגדירו את הערכים הרצויים

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

◄ [15]

עבור שדות המשתרעים על פני מספר ביטים, בונים את הערך וליישם אותו לאחר ניקוי השדה:

uint32_t temp = REG → CR1;
temp &= ~TIM_CR1_CKD_Msk; // clear the clock division bits
temp |= (2 << TIM_CR1_CKD_Pos); // set division to 4
REG → CR1 = temp;

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

4.הסבר את הקונפדרציה

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

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

Best Practices for Register Configuration

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

תמיד תייעץ עם ה- Device Datasheet

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

שימוש בטכניקות מסכות

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

#define SET_BITS(reg, mask) ((reg) |= (mask))
#define CLEAR_BITS(reg, mask) ((reg) &= ~(mask))
#define MODIFY_REG(reg, clearmask, setmask) \
 ((reg) = ((reg) & ~(clearmask)) | (setmask))

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

רישום מוקדם במהלך ההפעלה

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

להימנע מכתיבה של רשומות ללא הבנה של המדינה הנוכחית

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

שם מקור: The Qualifier

מכיוון שכתובות רישום מצביעות על חומרה, המדור חייב לא לייעל את הקריאה או לכתוב.תמיד להכריז על מצביעי הרישום כ- 12:12 (קובץ ראש Vendor בדרך כלל לעשות זאת באופן אוטומטי.

#define MY_REG ((volatile uint32_t *)0x40004000)

ללא LT:14, המדור עשוי להזמין או לחסל את הגישה להירשם, המוביל לכשלים לסירוגין כי הם קשה מאוד לשחזר.

מלכודות נפוצות להימנע

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

המונחים: bits

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

ביקורת ביקורתית Bits Unintentionally

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

התעלמות מהסינכרון ב- Multithreaded Contexts

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

נכשלת לאחר השכנוע

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

המונחים: Access Timing

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

טכניקות מתקדמות של

ככל שמערכות משובצות צומחות מורכבות יותר, מפתחים חייבים לעבור מעבר לכותב רישום בסיסי.

שימוש ב-Hardware Modelion Layers (HALs)

Vendor-Provided HALs (למשל, STM32 HAL, NXP SDK) יכול לפשט את התצורה על ידי המציע פונקציות ברמה גבוהה.עם זאת, הם לעתים קרובות להסתיר את פרטי הרישום, אשר יכול להוביל ליעילות או התנהגות בלתי צפויה. השתמש HALs עבור נתיבי כוונון מהירים, אבל עבור קוד ברמת הייצור, לשקול שכבה דקה על גבי רישום גישה ישירה רבים מנוסים.

Bit-Banding (Cortex-M)

ב ARM Cortex-M3/M4/M7 מעבדים, bitbanding מאפשר גישה אטומית לחתיכות בודדות באזור זיכרון המיועד.זה מבטל את הצורך ברצףי כתיבה לקריאה עבור פעולות חד-לשוניות יחיד. a bit-bandlias הכתובת מפות כל אחד לכתובת ייחודית.לדוגמה, לכתוב לכתובת alias של 5 ב- GP, או ל-Stratends, אשר ישפיע על כתובת ה- bit-S bit-Sams-S.

תגית: Shadowing

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

קונפדרציה מקרוז לעומת Inline Functions

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

static inline void uart_init(USART_TypeDef *uart, const UART_Config *cfg) {
 uart->BRR = cfg->baud_rate;
 uart->CR1 = cfg->mode;
 // ...
}

גישה זו משלבת לוגיקה של תצורה ועושה אותה לבחינה.

קריאה בגליונות נתונים יעילה

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

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

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

שגיאות רישום

כאשר מערכת לא מתנהגת כפי שמצופה, להתחיל על ידי אימות הגדרות רישום.

השתמש ב Debugger

רוב המיקרובקרים מבוססי ARM תומכים ב- JTAG או SWD debugging. Set breakpoints לאחר תחילת ההשלמה או להשתמש בדפדפן זיכרון כדי לבדוק את ערכי הרישום.השוואה אותם נגד גליון הנתונים.אם רישום מראה ערך בלתי צפוי, לבדוק אם השעון היקפי מופעל.מיקרו-בקרים רבים שער היקפי שעון היקפי, וכתיבה לרישום ללא השפעה - ואולי אפילו שגיאה אוטובוס.

אוקסלופ ואנליייזר לוגי

עבור I / O הקשורים היקפים (UART, SPI, I2C, GPIO), אווסקליוסקופ או מנתח לוגיקה מספק הוכחה סופית של תזמון ופרוטוקול הנכון.לדוגמה, אם UART אינו משדר, למדוד את הציון TX כדי לראות אם כל אות מופיע.אם הוא נשאר גבוה, לבדוק את שיעור ה baud, להירשם, לאפשר מעט, GPO חלופית בחירה.

עקבו אחרי Compiler Optimizations

(ב) ,(ה) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

REG->CR1 = 0x01;
__DSB(); // ensure write completes before next instruction
REG->CR2 = 0x02;

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

משאבים חיצוניים

הפחתת הידע שלך בתצורה של רישום דורש חומרי התייחסות מוצקים.הדברים הבאים מומלץ מאוד:

  • ARM Cortex-M3/M4/M7 הוראות התייחסות טכניות - זמין מ-FLT:0ARM Developer DocumentationFLT:1.
  • רשימות היישום של היצרן המיקרובקר שלך - למשל, STMicroelectronics AN4383 "כיצד להשתמש ב- STM32F4 USART" או Microchip AT14421 "AVR1000: החל עם כתיבת קוד מיקרובקר AVR".
  • "מערכות משוטות: זמן אמיתי מוליד קורטקס-M מיקרובקר" מאת ג'ונתן וו. Valvano - ספר לימוד מצוין עם דוגמאות ברמת רישום מעשית.

מסקנה

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