จะเกิดอะไรขึ้นเมื่อฉันโทรออก () จากโปรแกรมของฉัน


17

ในอย่างใดอย่างหนึ่งsetupหรือloopถ้าฉันจะเพิ่มexit(0)สายที่จะควบคุมจะถูกส่งผ่านไป? ไมโครคอนโทรลเลอร์รุ่นต่อไปจะเป็นอย่างไร? มันจะหยุดการทำงานและปิดเครื่องไหม

ฉันใช้ตัวแก้ไข Arduino Uno 2


ฉันคิดว่ามันหยุด มันจะไม่ปิดนาฬิกาหรือปิดเครื่อง
TheDoctor

ส่วนที่เหลือของหน่วยความจำควรจะเต็มไปด้วยNOPงบการชุมนุมซึ่งเพียงหยุดชั่วคราวสำหรับรอบสองนาฬิกา
TheDoctor

คำตอบ:


12

การคาดเดาครั้งแรกของฉันผิด ฉันคิดว่ามันจะกลับมาจากลูปและไลบรารีแกนจะเรียกลูป () อีกครั้ง อย่างไรก็ตามฉันเห็นรหัสต่อไปนี้ถูกสร้างขึ้น สังเกตว่า __stop_program เป็นลูปที่ยาก ...

สารสกัดจากรายชื่อของ Blink.ino โดยเพิ่ม exit (0):

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
  exit(0);
}

ถอดดังกล่าวข้างต้น:

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
 100:   80 91 00 01     lds r24, 0x0100
 104:   61 e0           ldi r22, 0x01   ; 1
 106:   0e 94 ca 01     call    0x394   ; 0x394 <digitalWrite>
  delay(1000);               // wait for a second
 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     call    0x1ee   ; 0x1ee <delay>
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
 116:   80 91 00 01     lds r24, 0x0100
 11a:   60 e0           ldi r22, 0x00   ; 0
 11c:   0e 94 ca 01     call    0x394   ; 0x394 <digitalWrite>
  delay(1000);               // wait for a second
 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     call    0x1ee   ; 0x1ee <delay>
  exit(0);
 12c:   80 e0           ldi r24, 0x00   ; 0
 12e:   90 e0           ldi r25, 0x00   ; 0
 130:   0e 94 1e 02     call    0x43c   ; 0x43c <_exit>

...

0000043c <_exit>:
 43c:   f8 94           cli

0000043e <__stop_program>:
 43e:   ff cf           rjmp    .-2         ; 0x43e <__stop_program>

โปรดทราบว่าถ้า _exit ไม่ได้เรียกว่า cli การขัดจังหวะจะสามารถทำสิ่งต่างๆได้ แต่นั่นไม่ใช่กรณี


avr-objdump -S {compiled *.elf file}สร้างไฟล์ที่มีรหัส C ที่นำไปสู่แต่ละส่วนของรหัสแอสเซมบลี มันง่ายกว่ามากที่จะติดตาม
Connor Wolf

aaaand ฉันเพิ่งลองและมันก็ไม่ถูกต้องเปล่งรหัสอินไลน์ C สำหรับฟังก์ชั่นการวนซ้ำ อะไรกันเนี่ย?
Connor Wolf

โอ้โหแปลกมาก ฉันรวบรวมโครงการที่มีStinoแทนการแก้ไข Arduino, decompiled *.elfจากนั้นและแล้วฉันจะได้รับสัญลักษณ์การแก้จุดบกพร่องที่เหมาะสม ผมคิดว่า Arduino แก้ไขข้อความ / ปุ่มแมโคร (ฉันปฏิเสธที่จะเรียกว่า IDE เนื่องจากมันไม่ได้) สิ่งที่จะลอกข้อมูลการแก้ปัญหาจากเพียงแค่รวบรวมหลัก C ++ ไฟล์ด้วยเหตุผลบางอย่างที่แปลกประหลาดและโง่
Connor Wolf

มีเป็นคำอธิบายและมันก็จะทำอย่างไรกับวิธีการสำเนา IDE ไฟล์ของคุณไปยังสถานที่เก็บชั่วคราว คุณสามารถ "แก้ไข" ว่าด้วยการบอก AVR-objdump avr-objdump -S -I/path/to/the/sketch/folder xxx.elf ที่แหล่งที่มา: นั่นคือเส้นทางโฟลเดอร์ร่างไม่ใช่ไฟล์. io เอง จากนั้นคุณควรจะได้รับแหล่ง C ในการถ่ายโอนข้อมูล
Nick Gammon

11

ฉันเพิ่งทดสอบกับ Arduino Uno ของฉันและมันเพิ่งจะหยุดโค้ดและทิ้งเอาท์พุททั้งหมดตามที่พวกเขาเมื่อรหัสหยุดทำงาน (ดังนั้นมันจึงเหลือ LED ที่ฉันเปิดอยู่) ดูเหมือนว่าจะไม่มีการล้างข้อมูล IO เมื่อคุณโทรออก นี่คือสิ่งที่ฉันคาดไว้เพราะ Arduino IDE มีฟังก์ชั่นการตั้งค่าและลูปถ้าคุณตั้งโปรแกรม ATMEGA * 28 ด้วย AVR IDE อื่น ๆ คุณเริ่มต้นด้วยฟังก์ชั่นหลักเช่นโปรแกรม C / C ++ ฟังก์ชั่นการตั้งค่าและการวนซ้ำนั้นไม่ได้มาตรฐานสำหรับ AVR MCU

หมายเหตุ:การกดปุ่มรีเซ็ตจะรีสตาร์ทรหัสหากคุณสงสัย


ดีแล้วที่รู้. ฉันกำลังมองหาบางสิ่งที่ละเอียดกว่าและอยู่ในระดับที่ต่ำกว่า เกี่ยวกับการเรียกexit(0)คำแนะนำ disassembled คือ (IIRC) __stop_program, cliและ spinlock ฉันต้องการตรวจสอบว่าถูกต้องด้วยคำอธิบายว่าการควบคุมผ่านเช่น call stack pop?, ISR call?
asheeshr

อ่าฉันไม่ได้ดู arduino ในระดับต่ำเช่นนี้สำหรับข้อมูลที่คุณอาจต้องการตรวจสอบเว็บไซต์ atmel
Jesse Laning
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.