שְׁאֵלָה:
מה קורה כשאני מתקשר ל- exit () מהתוכנית שלי?
asheeshr
2014-02-14 07:28:33 UTC
view on stackexchange narkive permalink

באחת מ setup או loop , אם הייתי מוסיף שיחת יציאה (0) , לאן יועבר השליטה? מה יהיה המצב הבא של המיקרו-בקר? האם זה יפסיק את הביצוע והכיבוי?

אני משתמש בתיקון 2 Arduino Uno.

אני חושב שזה פשוט מפסיק. זה לא היה מכבה את השעון או מכבה אותו.
יש למלא את שאר הזיכרון בהצהרות הרכבה של 'NOP', שרק עוצרות למשך כמה מחזורי שעון
שתיים תשובות:
#1
+12
mpflaga
2014-02-14 10:00:10 UTC
view on stackexchange narkive permalink

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

תמצית מהרישום של Blink.ino, עם יציאה (0) שנוספה:

  // שגרת הלולאה עוברת ו שוב לנצח: loop loop () {digitalWrite (led, HIGH); // להדליק את הנורית (HIGH הוא רמת המתח) עיכוב (1000); // המתן ל- DigitalWrite שני (led, LOW); // כבה את הנורית על ידי עיכוב מתח נמוך (1000); // המתן ליציאה שנייה (0);}  

פירוק האמור לעיל:

  // שגרת הלולאה עוברת שוב ושוב לנצח : void loop () {digitalWrite (led, HIGH); // להדליק את הנורית (HIGH היא רמת המתח) 100: 80 91 00 01 lds r24, 0x0100 104: 61 e0 ldi r22, 0x01; 1 106: 0e 94 ca 01 התקשר 0x394; 0x394 עיכוב <digitalWrite> (1000); // המתן לשנייה 10a: 68 ee ldi r22, 0xE8; 232 10c: 73 e0 ldi r23, 0x03; 3 10e: 80 e0 ldi r24, 0x00; 0 110: 90 e0 ldi r25, 0x00; 0 112: 0e 94 f7 00 התקשר 0x1ee; 0x1ee <delay> digitalWrite (led, LOW); // כבה את הנורית על ידי הפיכת המתח LOW 116: 80 91 00 01 lds r24, 0x0100 11a: 60 e0 ldi r22, 0x00; 0 11c: 0e 94 ca 01 התקשר 0x394; 0x394 עיכוב <digitalWrite> (1000); // המתן לשנייה 120: 68 ee ldi r22, 0xE8; 232 122: 73 e0 ldi r23, 0x03; 3 124: 80 e0 ldi r24, 0x00; 0 126: 90 e0 ldi r25, 0x00; 0 128: 0e 94 f7 00 התקשר 0x1ee; 0x1ee <delay> יציאה (0); 12c: 80 e0 ldi r24, 0x00; 0 12e: 90 e0 ldi r25, 0x00; 0
130: 0e 94 1e 02 להתקשר 0x43c; 0x43c <_exit> ... 0000043c <_exit>: 43c: f8 94 cli0000043e <__stop_program>: 43e: ff cf rjmp.-2; 0x43e <__stop_program>  

שים לב שאם _exit לא היה קורא cli, הפרעות היו מסוגלות לעשות דברים. אבל זה לא המקרה.

'avr-objdump -S {compiled * .elf file}' מייצר קובץ הכולל את קוד C שמוביל לכל קטע של קוד הרכבה. זה הרבה יותר קל לעקוב.
aaaand פשוט ניסיתי את זה, וזה לא פולט כראוי קוד C מוטבע עבור פונקציית הלולאה. מה לעזאזל?
וואו, מוזר ביותר. ריכזתי את הפרויקט עם [סטינו] (https://github.com/Robot-Will/Stino) במקום עורך הארדואינו, פירקתי את ה'* .עצם 'מזה, ואז * ואז אני מקבל את הסמלים הראויים לניפוי באגים. אני חושב שדבר עורך הטקסטים / כפתור-מאקרו של Arduino (אני מסרב לקרוא לזה IDE מכיוון שזה לא) העניין הוא להוציא את המידע על ניפוי הבאגים ** רק ** מקובץ C ++ הראשי המהולל, מסיבה מוזרה וטיפשה כלשהי.
יש ** הסבר, וזה קשור לאופן שבו ה- IDE מעתיק את הקבצים שלך למיקום זמני. אתה יכול "לתקן" זאת על ידי אמירה ל- avr-objdump היכן המקור: `avr-objdump -S -I / path / to / the / sketch / folder xxx.elf`. זהו הסקיצה * נתיב התיקיה *, ולא קובץ ה- .ino עצמו. אז אתה צריך לקבל את מקור C במזבלה.
#2
+11
Jesse Laning
2014-02-14 07:42:56 UTC
view on stackexchange narkive permalink

ובכן רק בדקתי את זה עם ה- Arduino Uno שלי וזה פשוט עצר לחלוטין את הקוד והשאיר את כל הפלטים כשהיו כשהקוד הפסיק לפעול (אז הוא השאיר נורית שהייתי דולקת). נראה כי אין ניקוי IO כשאתה קורא ל- exit. זה היה מה שציפיתי מכיוון שה- Arduino IDE מספק את פונקציות ההתקנה והלולאה, אם אתה מתכנת את ATMEGA * 28 עם כל AVR IDE אחר אתה מתחיל עם הפונקציה הראשית כמו כל תוכניות C / C ++. פונקציות ההתקנה והלולאה אינן סטנדרטיות במכשירי AVR MCU.

הערה: לחיצה על כפתור האיפוס מפעילה מחדש את הקוד, אם תהיתם.

טוב לדעת. חיפשתי משהו יותר מפורט וברמה * נמוכה יותר *. בקריאה ל- 'יציאה (0)' ההוראות המפורקות הן (IIRC) '__stop_program', 'cli' ו- spinlock. רציתי לוודא אם זה נכון עם הסבר על אופן העברת הפקד כלומר קריאת מחסנית שיחה ?, שיחת ISR?
אה, ובכן, לא בדקתי את הארדואינו ברמה כל כך נמוכה, למידע הזה כדאי לבדוק באתר atmel.


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