ในอย่างใดอย่างหนึ่งsetup
หรือloop
ถ้าฉันจะเพิ่มexit(0)
สายที่จะควบคุมจะถูกส่งผ่านไป? ไมโครคอนโทรลเลอร์รุ่นต่อไปจะเป็นอย่างไร? มันจะหยุดการทำงานและปิดเครื่องไหม
ฉันใช้ตัวแก้ไข Arduino Uno 2
NOP
งบการชุมนุมซึ่งเพียงหยุดชั่วคราวสำหรับรอบสองนาฬิกา
ในอย่างใดอย่างหนึ่งsetup
หรือloop
ถ้าฉันจะเพิ่มexit(0)
สายที่จะควบคุมจะถูกส่งผ่านไป? ไมโครคอนโทรลเลอร์รุ่นต่อไปจะเป็นอย่างไร? มันจะหยุดการทำงานและปิดเครื่องไหม
ฉันใช้ตัวแก้ไข Arduino Uno 2
NOP
งบการชุมนุมซึ่งเพียงหยุดชั่วคราวสำหรับรอบสองนาฬิกา
คำตอบ:
การคาดเดาครั้งแรกของฉันผิด ฉันคิดว่ามันจะกลับมาจากลูปและไลบรารีแกนจะเรียกลูป () อีกครั้ง อย่างไรก็ตามฉันเห็นรหัสต่อไปนี้ถูกสร้างขึ้น สังเกตว่า __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 ที่นำไปสู่แต่ละส่วนของรหัสแอสเซมบลี มันง่ายกว่ามากที่จะติดตาม
*.elf
จากนั้นและแล้วฉันจะได้รับสัญลักษณ์การแก้จุดบกพร่องที่เหมาะสม ผมคิดว่า Arduino แก้ไขข้อความ / ปุ่มแมโคร (ฉันปฏิเสธที่จะเรียกว่า IDE เนื่องจากมันไม่ได้) สิ่งที่จะลอกข้อมูลการแก้ปัญหาจากเพียงแค่รวบรวมหลัก C ++ ไฟล์ด้วยเหตุผลบางอย่างที่แปลกประหลาดและโง่
avr-objdump -S -I/path/to/the/sketch/folder xxx.elf
ที่แหล่งที่มา: นั่นคือเส้นทางโฟลเดอร์ร่างไม่ใช่ไฟล์. io เอง จากนั้นคุณควรจะได้รับแหล่ง C ในการถ่ายโอนข้อมูล
ฉันเพิ่งทดสอบกับ 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?