ה- STL אינו חלק מארדואינו ואין תמיכה ב- libstc ++ מ- AVR.
ההבדלים בין "התשובה" שלי ממלאכי בשלב מסוים, כפי שמוסבר בתגובות.
אני לא חושב שאתה לא צריך, רק בגלל ש"רוב האנשים אומרים "שאתה לא צריך. יש הרבה אנשים שאפילו חושבים שלא צריך להשתמש ב- C ++ בכלל. הבעיה היא ש- C ++ (וספריית C ++ סטנדרטית) הם חזקים מאוד ועשויים להיות מועברים בצורה לא יעילה.
מדוע להשתמש ב- libstdc ++?
אולם אני חושב שאם אתה משתמש בזה בזהירות, זה יכול להיות מאוד שימושי.
נניח שאנחנו יש לנו שני מאגרים, מאגר שליחה ומאגר קבלה. עם C היית מאחסן אותם במערך קבוע קבוע. ב- C ++ תוכלו להשתמש במכולות דינמיות.
אז ב- C, תשתמשו ב -250 בתים של זיכרון בכדי לשמור את ההודעות שלכם. כל הודעה ארוכה יותר לא תתאים.
ב- C ++ תשתמש רק בכל הבייטים הנחוצים בנקודה אחת (פלוס תוספת כנראה). ואם תקבל הודעה ארוכה יותר, היא פשוט תתרחב.
אם העניין C ++ עובד בשבילך, ורק לבדוק את זה טוב מאוד, למה לא להשתמש בו? בממוצע, הוא ישתמש בפחות זיכרון, מכיוון שאינך מקצה את כל זה כשאינו בשימוש. תהיה לך בעיה כאשר ההודעות שלך יהיו גדולות מדי, מכיוון שהזיכרון שלך יעלה על גדותיו, ולעיתים קרובות גורם לאיפוס המיקרו-בקר. אבל אם יותר מאגרים בתוכנית שלך הם דינמיים, אחד עשוי להשאיר קצת מקום לאחר וכו '. שימוש יעיל בזיכרון יעיל יותר!
אך ללא הקצאה דינמית, זה עשוי להיות קצת יותר בטוח, מכיוון שאתה כבר טענת את חלקי הזיכרון האלה, אין שום דרך שלא תוכל להשתמש בחתיכות האלה. כל הודעה גדולה יותר, פשוט לא תתאים, אך תוכלו לבדוק זאת בקלות. דבר נוסף הוא ש- C ++ stl שתמצאו לא יתאים במיוחד לאדריכלות / מיקרו-בקר שלכם.
כמו כן, יצירת אחסון דינמי משלך ב- C עלולה לגרום לבעיות רבות יותר מ- C ++ stl;). וזה לא כאילו אתה צריך להשתמש באחסון דינמי לכל דבר, פשוט היכולת לעשות זאת זה נחמד.
בקרי המיקרו הנוכחיים גם הם הופכים להיות הרבה יותר רציניים כמו Arduino של 8 סיביות (328P). 20 $ יכול להשיג לך Teensy 3.2 שיש לו 256K Flash Flash, 64K RAM
כך שבמקרה זה זיכרון דינמי יכול להיות שימושי מאוד (אם אתה בטוח שנשאר לך מספיק זיכרון). כמו כן: כל מוצרי STM32F41xxx מוטבעים: עד 192 קילו-בייט של מערכת SRAM כולל 64 קילו-בתים של זיכרון נתונים של CCM (זיכרון ליבה)
על ידי זה, זה יכול להיות גם נחמד מאוד דרך ללמוד C ++ ולתכנת באותה שפה כמו שאתה עושה במחשב האישי. אך זכור כי על מיקרו 8 סיביות, עליך לבדוק אם פונקציות ה- STL שלך אינן נותנות יותר מדי תקורה.
כיצד להשתמש בספריית התבניות הרגילה C ++ עבור AVR?
עקבתי אחר הבלוג מ- אנדי בראון וכעת פועלים איטרטורים / מחרוזת / ווקטורים ב AtmelStudio.
למרות שקיבלתי כמה שגיאות, קבוצת השגיאות הראשונה כללה:
שגיאה '_M_deallocate' לא הוכרזה בהיקף זה, ולא נמצאו הצהרות על ידי תלוי ארגומנט בדיקת נקודת ההתיישרות [-מתיר] D: \ avr-stl \ include \ string 173 הצהרות הודעות בבסיס תלוי 'std :: _ String_alloc_base<char, std :: allocator<char>, true>al' לא נמצאות על ידי unifi ed lookup D: \ avr-stl \ include \ string 173 הודעה השתמש ב- 'this->_M_deallocate' במקום D: \ avr-stl \ include \ string 173
שגיאה זו למעשה מסבירה את עצמה; עליך להשתמש ב this->_M_deallocate
.
לאחר מכן קיבלתי התייחסות לא מוגדרת ל"מפעיל חדש (int חתום, בטל *)
. אבל תיקנתי אותו על ידי הכללת "pnew.cpp" ממש מתחת ל #include <new>
ב stl_construct.h
שזה מוזר, אבל זה עובד.
(חתיכת stl_construct.h)
#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H # הגדר __SGI_STL_INTERNAL_CONSTRUCT_ #include <new> # include <pnew.cpp>__STL_BEGIN_NAMESPACE