ตัวเลือกของบรรณาธิการ:

การโฆษณา

บ้าน - การตั้งค่าอินเทอร์เน็ต
ขัดจังหวะใน atmega8 หลักสูตรการฝึกอบรม

ข้อดีอย่างหนึ่งของไมโครคอนโทรลเลอร์ ATmega8 คือการขัดจังหวะที่หลากหลาย

ขัดจังหวะเป็นเหตุการณ์ที่เกิดขึ้นเมื่อมีการหยุดการทำงานของโปรแกรมหลักและมีการเรียกใช้ฟังก์ชันที่จัดการการขัดจังหวะบางประเภท

การขัดจังหวะแบ่งออกเป็นภายในและภายนอก แหล่งที่มาของการขัดจังหวะภายในรวมถึงโมดูลไมโครคอนโทรลเลอร์ในตัว (ตัวจับเวลา, ตัวรับส่งสัญญาณ USART ฯลฯ ) การขัดจังหวะภายนอกเกิดขึ้นเมื่อสัญญาณภายนอกมาถึงที่พินไมโครคอนโทรลเลอร์ (เช่น สัญญาณที่พิน RESET และ INT) ลักษณะของสัญญาณที่นำไปสู่การขัดจังหวะถูกตั้งค่าไว้ในรีจิสเตอร์ควบคุม มจรโดยเฉพาะอย่างยิ่งในบิต - ISC00 (บิต 0) และ ISC01 (บิต 1) สำหรับอินพุต INT 0; ISC10 (bit2) และ ISC11 (bit3) สำหรับอินพุต INT1

ในไมโครคอนโทรลเลอร์ ATmega8 แต่ละอินเทอร์รัปต์จะมีของตัวเอง เวกเตอร์ขัดจังหวะ(ที่อยู่ที่จุดเริ่มต้นของพื้นที่หน่วยความจำโปรแกรมซึ่งเก็บคำสั่งสำหรับการข้ามไปยังรูทีนขัดจังหวะที่ระบุ) ใน mega8 การขัดจังหวะทั้งหมดจะมีลำดับความสำคัญเท่ากัน หากมีการขัดจังหวะหลายครั้งเกิดขึ้นพร้อมกัน การขัดจังหวะที่มีจำนวนเวกเตอร์ต่ำกว่าจะถูกประมวลผลก่อน

เวกเตอร์ขัดจังหวะใน Atmega8

ที่อยู่ แหล่งที่มาขัดจังหวะ คำอธิบาย
0x0000 รีเซ็ต รีเซ็ตสัญญาณ
0x0001 INT0 คำขอขัดจังหวะภายนอกที่อินพุต INT0
0x0002 INT1 คำขอขัดจังหวะภายนอกที่อินพุต INT1
0x0003 ที/ซี1 จับเวลาจับ T/C1
0x0004 ที/ซี1 จับคู่ตัวจับเวลา T/C1 เปรียบเทียบรีจิสเตอร์ A
0x0005 ที/ซี1 จับคู่กับรีจิสเตอร์เปรียบเทียบ B ของไทม์เมอร์ T/C1
0x0006 ที/ซี1 T/C1 เคาน์เตอร์ล้น
0x0007 ที/ซี0 T/C0 เคาน์เตอร์ล้น
0x0008 เอสพีไอ การถ่ายโอนข้อมูล SPI เสร็จสมบูรณ์
0x0009 ยูอาร์ที ตัวรับส่งสัญญาณ UART ได้รับข้อมูลเรียบร้อยแล้ว
0x000A ยูอาร์ที การลงทะเบียนข้อมูล UART ว่างเปล่า
0x000B ยูอาร์ที การส่งข้อมูลด้วยตัวรับส่งสัญญาณ UART เสร็จสิ้น
0x000C ANA_COMP ขัดจังหวะจากตัวเปรียบเทียบแบบอะนาล็อก

การจัดการขัดจังหวะ

4 รีจิสเตอร์มีหน้าที่จัดการการขัดจังหวะใน ATmega8:

กิมสค์(หรือที่เรียกว่า GICR) - ห้าม/เปิดใช้งานการขัดจังหวะตามสัญญาณที่อินพุต INT0, INT1

GIFR- การจัดการการขัดจังหวะภายนอกทั้งหมด

ทิมสค์, ทีไอเอฟอาร์- การจัดการการหยุดชะงักจากตัวจับเวลา/ตัวนับ

ลงทะเบียน กิมสค์(GICR)

INTFx=1: เกิดการขัดจังหวะที่อินพุต INTx เมื่อเข้าสู่รูทีนการจัดการการขัดจังหวะ INTFx จะถูกรีเซ็ตเป็นสถานะบันทึกโดยอัตโนมัติ 0

ลงทะเบียน ทิมสค์

7 6 5 4 3 2 1 0
โทอิเอะ1
โอซีอี1เอ
โอซีอี1บี
-
ทิซี่
-
TOIE0
-

TOIE1=1: เปิดใช้งานการขัดจังหวะโอเวอร์โฟลว์ T/C1

โอซีอี1เอ=1: ขัดจังหวะเมื่อรีจิสเตอร์การเปรียบเทียบ A ตรงกับเนื้อหาของตัวนับ T/C1 ที่เปิดใช้งาน

โอซีอี1B=1: ขัดจังหวะเมื่อรีจิสเตอร์การเปรียบเทียบ B ตรงกับเนื้อหาของตัวนับ T/C1 ที่เปิดใช้งาน

TICIE=1: เปิดใช้งานการขัดจังหวะเมื่อตรงตามเงื่อนไขการจับ

TOIE0=1: เปิดใช้งานการขัดจังหวะโอเวอร์โฟลว์ T/C0

ลงทะเบียน ทีไอเอฟอาร์

7 6 5 4 3 2 1 0
ทีโอวี1
โอซีเอฟ1เอ
โอซีเอฟ1บี
-
ไอซีเอฟ1
-
ทีโอวี0
-

ทีโอวี1=1: เกิดการโอเวอร์โฟลว์ของ T/C1

โอซีเอฟ1เอ=1: การลงทะเบียนการเปรียบเทียบ A ตรงกับเนื้อหาของเคาน์เตอร์ T/C1 ที่อนุญาต

โอซีเอฟ1B=1: การลงทะเบียนการเปรียบเทียบ B ตรงกับเนื้อหาของตัวนับ T/C1 ที่อนุญาต

ไอซีเอฟ=1: ตรงตามเงื่อนไขการจับ

TOV0=1: เกิดการโอเวอร์โฟลว์ของ T/C0

เมื่อเข้าสู่รูทีนย่อยการจัดการการขัดจังหวะ แฟล็กการลงทะเบียน TIFR ที่สอดคล้องกับการขัดจังหวะจะถูกรีเซ็ตเป็นสถานะบันทึกโดยอัตโนมัติ 0

การขัดจังหวะจะทำงานเฉพาะเมื่อมีการเปิดใช้งานการขัดจังหวะทั่วไปในการลงทะเบียนสถานะ SREG (บิต 7 = 1) เมื่อเกิดการขัดจังหวะ บิตนี้จะถูกรีเซ็ตเป็น 0 โดยอัตโนมัติ และปิดใช้งานการขัดจังหวะที่ตามมา

ในตัวอย่างนี้ พิน INT0 ถูกเปิดใช้งานในโหมดอินพุตแบบดึงขึ้น เมื่อพินลัดวงจรลงกราวด์โดยใช้ปุ่ม ลอจิก 0 จะถูกตั้งค่าไว้ (ขอบของสัญญาณจะลดลงจากแรงดันไฟฟ้าไปที่ 0) และตัวจัดการอินเทอร์รัปต์จะถูกทริกเกอร์ โดยเปิดหลอดไฟที่เชื่อมต่อกับพินศูนย์ของพอร์ต บี

โมฆะ lampON()
{
พอร์ตบี.0=1;
DDRB.0=1;
}

ขัดจังหวะเป็นโมฆะ ext_int0_isr (เป็นโมฆะ)
{
หลอดON();
}

DDRD.2=0;
พอร์ตดี.2=1;

SREG|= (1 ในขณะที่(1) (

ตัวอย่างข้างต้นยังแสดงวิธีการตั้งค่าเวกเตอร์อินเทอร์รัปต์ใน Code Vision AVR (interrupt void ext_int0_isr(void)) เวกเตอร์อินเทอร์รัปต์มีการตั้งค่าคล้ายกันสำหรับกรณีอื่นๆ:

EXT_INT0 2
EXT_INT1 3
TIM2_COMP 4
TIM2_OVF 5
TIM1_CAPT 6
TIM1_COMPA 7
TIM1_COMPB 8
TIM1_OVF 9
TIM0_OVF 10
SPI_STC11
USART_RXC 12
USART_DRE 13
USART_TXC 14
ADC_INT 15
EE_RDY 16
ANA_COMP 17
ทวิ 18
SPM_พร้อม 19

ก่อนอื่นการหยุดชะงักคืออะไร?
การขัดจังหวะเป็นฟังก์ชันประเภทหนึ่งที่จะดำเนินการเมื่อมีสัญญาณมาถึงที่อินพุตของคอนโทรลเลอร์บางตัว
เมื่อทำงานใน AVR Studio การขัดจังหวะจะถูกสร้างขึ้นโดยใช้มาโคร ISR() , สัญญาณ()และ ขัดจังหวะ()- พวกเขาทำเครื่องหมายฟังก์ชันบางอย่างว่าเป็นตัวจัดการการขัดจังหวะ ความแตกต่างของพวกเขาก็คือ ขัดจังหวะ()และ ISR()กำหนดฟังก์ชันตัวจัดการสำหรับกรณีที่เปิดใช้งานการขัดจังหวะทั่วไป (ตัวจัดการสามารถถูกขัดจังหวะได้) และ สัญญาณ()สำหรับกรณีปิดการรบกวนทั่วไป

ด้วยเหตุนี้ เรามาจบทฤษฎีและฝึกฝนกันต่อ (แม้ว่าด้านล่างจะมีทฤษฎีเพิ่มเติมก็ตาม)
เราจะรวบรวมไดอะแกรมต่อไปนี้ใน ISIS:

ตามที่คุณอาจเดาได้แล้วเราจะเขียนการขัดจังหวะ (ซึ่งสร้างโดยปุ่ม) ซึ่งจะสว่างขึ้นและปิดไดโอด
ดังนั้นให้เปิดสตูดิโอและสร้างโปรเจ็กต์มาตรฐาน
หากต้องการใช้การขัดจังหวะ ให้รวมไฟล์ส่วนหัว:

#รวม

ยอมรับว่าการขัดจังหวะ (ทางกายภาพ) จะไม่เปิดหรือปิดเครื่องบนขาคอนโทรลเลอร์ (ตามที่ฉันได้พิจารณาไปแล้ว) แต่จะเปลี่ยนเฉพาะการตั้งค่าสถานะเท่านั้น ในบางค่าที่ไดโอดจะเปิดและปิด
มาตั้งค่าสถานะนี้ทั่วโลก:

จำนวน Int = 1;

ตอนนี้ขอประกาศการขัดจังหวะ:

ISR(SIG_INTERRUPT1)( ถ้า (num == 1) num = 0; อื่น ๆ num = 1; )

อย่างที่คุณเห็น เวกเตอร์ขัดจังหวะที่เรียกว่าถูกระบุไว้ในวงเล็บมาโคร เวกเตอร์นี้จะบอกคอมไพเลอร์ว่าอินพุตใดที่อินเทอร์รัปต์จะถูกสร้างขึ้น สำหรับ INT1 มันคือ SIG_INTERRUPT1 ตัวอย่างเช่น สำหรับ ADC นี่คือ SIG_ADC (รายการทั้งหมดอธิบายไว้อย่างสมบูรณ์ในหนังสือ “Shpak Yu.A. การเขียนโปรแกรมด้วยภาษา C สำหรับไมโครคอนโทรลเลอร์ AVR และ PIC”)
ตอนนี้เรามาดูฟังก์ชันหลักของ "โปรแกรม" ของเรากันดีกว่า
เราจำเป็นต้องเปิดใช้งานการขัดจังหวะโดยทั่วไปและสำหรับ INT1 โดยเฉพาะ:

เซย์(); // โดยทั่วไป GIMSK |= (1<

เมื่อเสร็จแล้ว คุณจะต้องกำหนดค่าลักษณะการทำงานขัดจังหวะ สามารถสร้างได้หลายวิธี
ดาวน์โหลดแผ่นข้อมูล (มีลิงค์เมื่อสร้างโครงการ) และค้นหาตารางต่อไปนี้ในส่วนขัดจังหวะ:

ฉันคิดว่าคุณจะเข้าใจวิธีการแปลสิ่งนี้
มาตั้งค่าสถานะการสร้างอินเทอร์รัปต์สำหรับ "การเปลี่ยนแปลงเชิงตรรกะเป็น INT1" แต่ละรายการ

MCUCR = (0<

ตอนนี้เรามาตั้งค่าพอร์ต C ทั้งหมดเป็นเอาต์พุต:

DDRC = 0xff; // พอร์ต C - เอาต์พุต

นี่ควรจะชัดเจนแล้ว:

ในขณะที่ (1)( ถ้า (num == 1) PORTC |= 1; // เปิดเอาต์พุตแรก C อื่น PORTC &= ~1; // ปิดเอาต์พุตแรก C _delay_ms(100); // รอ 100ms )

ไม่จำเป็นต้องรอ นอกจากนี้ยังลดประสิทธิภาพอีกด้วย แต่ฉันอยากให้มันเป็นแบบนั้น
โปรแกรมทั้งหมด:

#กำหนด F_CPU 8000000UL // 8MHz #include #รวม #รวม จำนวน int = 1; ISR(SIG_INTERRUPT1)( ถ้า (num == 1) num = 0; else num = 1; ) int main (โมฆะ)( sei(); GIMSK |= (1<

เรารวบรวมเลขฐานสิบหกและประกอบวงจรใน Proteus เราเพลิดเพลินกับฟังก์ชั่นขัดจังหวะเมื่อเปลี่ยนตำแหน่งของปุ่ม

มันมักจะเกิดขึ้นที่ไมโครวงจรควรทำงานและทำงานอย่างเงียบ ๆ แต่สำหรับเหตุการณ์บางอย่าง ให้ทิ้งทุกอย่างและทำอย่างอื่น แล้ว - กลับไปสู่งานเดิมอีกครั้ง... เปรียบเสมือนนาฬิกา - มันแสดงเวลาจนกระทั่งถึงเวลานาฬิกาปลุก และดูเหมือนว่าไม่มีอิทธิพลจากภายนอก เช่น การกดปุ่ม รีเซ็ต และวงจรไมโครจะสวิตช์เอง

สิ่งนี้สามารถนำไปใช้ได้โดยใช้อินเทอร์รัปต์ - สัญญาณที่แจ้งให้โปรเซสเซอร์ทราบเกี่ยวกับเหตุการณ์ที่เกิดขึ้น

นี่คือตัวอย่างจากชีวิตประจำวัน - คุณกำลังนั่งอยู่ในห้องครัว ดื่มชาพร้อมแยมราสเบอร์รี่และขนมอร่อยๆ และกำลังรอแขก รู้ได้อย่างไรว่ามีคนมา? มีสองทางเลือก: เราจะเสียสมาธิจากรถติด ฉันหมายถึงดื่มชา ทุก ๆ ห้านาทีแล้ววิ่งไปตรวจสอบว่ามีใครยืนอยู่ที่ประตูหรือไม่ หรือซื้อกริ่งประตูและรออย่างใจเย็นในที่ที่มีอุณหภูมิสูงจนกว่าจะมีคนกดกริ่ง

ดังนั้นเมื่อมีแขกโทรมา นี่คือกิจกรรม ดังนั้นเราจึงแยกตัวและรีบไปที่ประตู

ดังนั้นไมโครเซอร์กิตจึงมีการขัดจังหวะ และไม่ใช่แค่หนึ่งเดียว การขัดจังหวะแบ่งออกเป็นภายนอก - สิ่งเหล่านี้ถูกกระตุ้นที่แรงดันไฟฟ้าที่แน่นอนบนพินบางตัวของไมโครวงจร (INT0, INT1 และบางครั้งก็เป็นพอร์ต PCINT ทั้งหมด) - และภายใน - เมื่อตัวนับล้นตัวจับเวลา Watchdog จะถูกทริกเกอร์เมื่อใช้ USART เมื่อตัวเปรียบเทียบอนาล็อก, ADC และอุปกรณ์ต่อพ่วงอื่นๆ ถูกขัดจังหวะ

ดังนั้นปัญหาสำคัญจึงเกิดขึ้น มันเหมือนกับว่าเรายังคงนั่งดื่มชาอยู่ แต่พวกเขาไม่ได้ดังแค่กริ่งประตูเท่านั้น แต่ยังรวมถึงโทรศัพท์ของเราด้วย... และคุณไม่สามารถแยกออกจากกันได้ ต้องทำอะไรสักอย่างก่อน ดังนั้นแผ่นข้อมูลจึงมีตารางเวกเตอร์ขัดจังหวะ ยิ่งหมายเลขขัดจังหวะยิ่งต่ำ ลำดับความสำคัญก็จะยิ่งสูงขึ้น

มีรายละเอียดปลีกย่อยหลายประการที่นี่...

มีเหตุการณ์เกิดขึ้น - มีการส่งคำขอขัดจังหวะซึ่งเรียกว่า "การตั้งค่าสถานะคำขอขัดจังหวะ" หากทุกอย่างเรียบร้อยดี การขัดจังหวะจะได้รับการแก้ไข ชีวิตก็จะสวยงามและได้รับการประมวลผล

แต่หากปิดใช้งานการขัดจังหวะ - ตัวอย่างเช่น กำลังประมวลผลการขัดจังหวะที่มีลำดับความสำคัญสูงกว่าอยู่แล้ว - แฟล็กคำขอนี้จะยังคงหยุดทำงานจนกว่าจะเปิดใช้งานการขัดจังหวะ หลังจากนี้ ชิปจะตรวจสอบการลงทะเบียนคำขอตามลำดับความสำคัญ และหากมีแฟล็ก ชิปก็จะประมวลผล

แต่! ปรากฎว่าถึงแม้จะประมวลผลการหยุดชะงัก แต่ก็ไม่ใช่ความจริงที่ว่าเหตุการณ์ที่ทำให้เกิดเหตุการณ์นั้นยังมีชีวิตอยู่... มันเหมือนกับว่ากริ่งประตูและโทรศัพท์ดังพร้อมกัน คุณรับโทรศัพท์ และแขกก็ได้ยินเสียง ตัดสินใจแล้วว่าไม่มีใครอยู่บ้านและออกไป และดูเหมือนว่าจะมีเหตุการณ์เกิดขึ้น - กริ่งประตูดังขึ้น แต่ไม่มีใครอยู่หลังประตู

ปัญหาอีกประการหนึ่งคือในขณะที่กำลังประมวลผลการขัดจังหวะอื่นและค่าสถานะคำขอถูกยกขึ้นแล้ว เหตุการณ์อาจเกิดขึ้นได้อีกหลายครั้ง เรารับสายเปิดประตู - และมีแขกมากมายอยู่ที่นั่นแล้ว! น่ากลัว? น่ากลัว...

คุณสมบัติอื่นของการใช้การขัดจังหวะ - และไม่เพียงแต่การขัดจังหวะเท่านั้น: การกลับเข้ามาใหม่ (หรือการกลับเข้ามาใหม่)

โปรแกรม Reentrant คือโปรแกรมที่สามารถเรียกใช้โดยผู้ใช้หลายคน (หรือกระบวนการ) โดยไม่ทำให้เกิดข้อผิดพลาด และไม่ทำให้การคำนวณสิ้นเปลืองเป็นอย่างน้อย ตัวอย่างเช่น ผู้ใช้รายอื่นไม่ต้องรันโค้ดอีกครั้ง

กล่าวอีกนัยหนึ่งถ้าอยู่ในครัวในขณะที่คุณทักทายแขกไม่มีใครขโมยของบางอย่างทุกอย่างก็กลับคืนมา)

โดยทั่วไปนี่ถือเป็นเรื่องร้ายแรง - หากคุณไม่คำนึงถึงคุณอาจทนทุกข์ทรมานเป็นเวลานานโดยพูดว่า "ทำไมไม่ทำงาน!" จะต้องนำมาพิจารณาด้วย เช่น หากมีการประมวลผลการขัดจังหวะหลายครั้ง และแต่ละรายการเปลี่ยนตัวแปรโกลบอลบางตัว...

การขัดจังหวะมักจะไม่กลับเข้ามาใหม่ นั่นคือในขณะที่อินเทอร์รัปต์กำลังทำงาน คุณจะไม่สามารถเรียกอินเทอร์รัปต์เดิมได้อีก เพื่อป้องกันการเข้าซ้ำในตัวจัดการ ซึ่งอินเทอร์รัปต์จะถูกห้ามโดยอัตโนมัติในขณะที่ประมวลผล (ถ้าคุณต้องการเปิดใช้งานอินเทอร์รัปต์ในการขัดจังหวะ) ขั้นตอนการจัดการคุณต้องคิดสิบหรือยี่สิบครั้งก่อนจะทำตามขั้นตอนผื่นดังกล่าว)

ลองพิจารณาการทำงานกับการขัดจังหวะภายนอก: ประการแรก เราต้องกำหนดค่าว่าเหตุการณ์ใดที่จะทำให้เกิดการขัดจังหวะ และประการที่สอง ปล่อยให้ไมโครเซอร์กิตประมวลผลการขัดจังหวะนี้เลย

การลงทะเบียน MCUCR รับผิดชอบตัวแรกในชิป ATmega8 - บิต ISC11-ISC10 รับผิดชอบ INT1 และ ISC01-ISC00 รับผิดชอบ INT0

ตารางที่ 1. คำจำกัดความของเหตุการณ์สำหรับการสร้างการขัดจังหวะผ่าน INT1

เช่นเดียวกับ INT0

ตอนนี้สิ่งที่เหลืออยู่คือการเปิดใช้งานการขัดจังหวะบนพินที่เราต้องการ - การลงทะเบียน GIGR มีบิต INT0 และ INT1; ตั้งค่าเป็น "1" ที่ต้องการ - และเปิดใช้งานการหยุดชะงักจากภายนอก! แต่ยังเร็วเกินไปที่จะชื่นชมยินดี - นอกเหนือจากการขัดจังหวะภายนอกแล้ว โดยทั่วไปแล้ว จะต้องเปิดใช้งานการขัดจังหวะด้วย - ตั้งค่าบิตซ้ายสุดของการลงทะเบียน SREG เป็น "1" เช่นเดียวกันสามารถทำได้ด้วยคำสั่งแอสเซมเบลอร์: asm sei;

ลองดูตัวอย่างง่ายๆ: มีปุ่มติดอยู่ที่พิน INT0 (D.2) ของชิป ATmega8 (ที่พินและเป็นศูนย์) กด - เกิดการขัดจังหวะและ LED บนพิน B.0 จะเปิดขึ้น LED ตามลำดับเชื่อมต่อกับขาและตัวเครื่อง:

// โปรแกรมสำหรับ ATmega8 เมื่อคุณกดปุ่มบนพิน INT0 (D.2) - เชื่อมต่อกับ 0 - // เปิด LED บนพิน B.0 โดยการขัดจังหวะภายนอก - เชื่อมต่อกับ 1 // กำหนดประเภทใหม่ typedef ถ่านไบต์ที่ไม่ได้ลงนาม; sbit ddrButton ที่ ddD2_bit; // ปุ่มสร้าง sbit pinButton ที่ pinD2_bit; sbit พอร์ตปุ่มที่ portD2_bit; สบิต ddrLight ที่ ddB0_bit; // เอาต์พุตสำหรับ LED ไปที่เอาต์พุตแบบดึงขึ้นให้เปิด 0 บนปุ่ม sbit portLight ที่ portB0_bit; ไบต์ flagButton = 0; //คลิกปุ่ม ตั้งค่าสถานะ; กด - 1 void INT0_interrupt() org IVT_ADDR_INT0 // อย่างน้อยคุณต้องเขียนฟังก์ชันว่าง - // เพราะคอมไพเลอร์ไม่ได้สร้างมันขึ้นมาเอง มิฉะนั้นมันจะไม่ทำงาน ( flagButton = 1; ) // การประมวลผลการกดปุ่ม - โดยคำนึงถึงการตีกลับเป็นโมฆะ buttonLight() ( if(flagButton) // หากกดปุ่ม ( portLight = 0; // เปิด LED Delay_ms(500); portLight = 1; // ปิดปุ่มธง LED = 0; ) ) เป็นโมฆะ main () ( // กำลังเริ่มต้นพอร์ตที่ใช้ทั้งหมด ddrB = 0; portB = 0; ddrD = 0; portD = 0; // การเริ่มต้นปุ่ม - ไปยังอินพุตด้วย pull-up portButton = 1; // เริ่มต้น LED ซึ่งเปิดอยู่ด้วย 0 และโดยการกดปุ่ม - เพื่อส่งออกและไปที่ 1 portLight = 1; การขัดจังหวะภายนอก MCUCR.ISC00 = 0; // การขัดจังหวะถูกสร้างขึ้นโดยตรรกะ 0 บน INT0 MCUCR.INT0 = 1; // เปิดใช้งานการขัดจังหวะภายนอก INT0 asm sei; // SREG.B7 = 1; หลักการขัดจังหวะ (bit I); คำสั่งเหมือนกับ while(1) ( buttonLight() ; ) )

เล็กน้อยเกี่ยวกับไวยากรณ์ ฟังก์ชันขัดจังหวะเขียนดังนี้: void function_name() org IVT_ADDR_INT0

คำหลักขององค์กรระบุว่าที่อยู่ขัดจังหวะจากแผ่นข้อมูลจะมาถัดไป เรามีชื่อของการขัดจังหวะจากไลบรารี: เราพิมพ์ IVT แล้วกด Ctrl + Space (ฉันชอบสิ่งเหล่านี้ ˆˆ) คุณยังสามารถใช้ iv แทนคำว่า org ได้ โดยพิจารณาจากวิธีใช้คอมไพเลอร์

หมายเหตุเล็กๆ น้อยๆ อีกประการหนึ่ง: ประการแรก การหยุดชะงักไม่ควรยุ่งยาก - เพียงไม่กี่บรรทัดเท่านั้นเอง นี่เป็นเพราะความจริงที่ว่าในขณะที่ประมวลผลการขัดจังหวะนั้น Microcircuit ไม่สามารถถูกรบกวนจากสิ่งอื่นใดได้ ซึ่งหมายความว่าหากเรามีการขัดจังหวะหลายครั้ง เราก็อาจพลาดเหตุการณ์บางอย่างได้

อาจกลายเป็นว่าเราไม่จำเป็นต้องขัดจังหวะการประมวลผลเลย - ตัวอย่างเช่นวงจรก็เพียงพอแล้วที่วงจรจะตื่นจากโหมดสลีป แต่ในกรณีนี้คุณยังคงต้องเขียนฟังก์ชันขัดจังหวะแม้ว่าจะเป็นฟังก์ชันว่างก็ตาม - ที่เรียกว่า "stub" ตามหลักการแล้ว คอมไพเลอร์บางตัวจะเขียนฟังก์ชันว่างโดยอัตโนมัติสำหรับการขัดจังหวะแต่ละครั้ง แต่นี่ไม่ใช่กรณีของเรา - เราต้องทำด้วยตนเอง

วันนี้เราจะมาดูแนวคิดเรื่องการหยุดชะงักและวิธีใช้งานกัน โดยปกติแล้ว เราจะไม่ทำหากไม่มีโปรแกรมการฝึกอบรม แต่ครั้งนี้ เราจะไม่กระพริบไฟ LED ดีอยู่แล้ว. มาทำอะไรเหมือนกริ่งประตูกันเถอะ

งาน:ทำให้ไมโครคอนโทรลเลอร์ส่งเสียงบี๊บเมื่อกดปุ่ม
แผนภาพสำหรับตัวอย่างของเรา ไฟล์โครงการ

เราสร้างโปรเจ็กต์วงแหวนในพื้นที่ทำงานเก่า
ตั้งค่าโครงการสำหรับการกำหนดค่า Release:

เลือกประเภทของไมโครคอนโทรลเลอร์
ตัวเลือกทั่วไป > เป้าหมาย > การกำหนดค่าตัวประมวลผล
ฉันมี ATmega8535 นี้

อนุญาตให้ใช้ชื่อบิตที่กำหนดไว้ในไฟล์ส่วนหัว
ในตัวเลือกทั่วไป > ระบบ ให้เลือกช่องเปิดใช้งานคำจำกัดความบิตในไฟล์ I/O-Include
เรายังไม่เคยใช้ชื่อบิตมาก่อน แต่วันนี้เราต้องการมัน

เปลี่ยนประเภทไฟล์เอาต์พุต
ตัวเชื่อมโยง> เอาท์พุต
ในช่องไฟล์เอาต์พุต ให้เลือกช่องแทนที่ค่าเริ่มต้นและแทนที่นามสกุล d90 ด้วยเลขฐานสิบหก
ในฟิลด์รูปแบบ ให้เลือกอื่นๆ และในเมนูดรอปดาวน์รูปแบบเอาต์พุต ให้เลือกประเภทไฟล์มาตรฐาน Intel

บันทึกโปรเจ็กต์และพื้นที่ทำงาน

______________________________ ขัดจังหวะ ___________________________

ลองจินตนาการถึงสถานการณ์ คุณกำลังนั่งอยู่ที่ทำงานและทบทวนโปรแกรมไมโครคอนโทรลเลอร์ตัวอื่น เจ้านายมาหาคุณแล้วพูดว่า: "ฟังนะ Pash เราซื้อออสซิลโลสโคปสำหรับแผนกของเรา - Tektronix สี่ช่องสัญญาณ ช่วยวาสยาลากพวกเขา” คุณคิดว่า: "เอาละ ความคิดมันเข้ามาขวางทาง... และอยู่กับคุณ" และเจ้านายก็มองคุณแบบนั้น และดวงตาของเขาก็ใจดีและใจดีมาก คุณจะปฏิเสธเขาได้อย่างไร? คุณทิ้งทุกอย่างแล้วไปกับเพื่อนเพื่อซื้อออสซิลโลสโคป พวกเขานำมันเข้ามา เราได้รายงานแล้ว และพวกเขาก็นั่งลงดูรายการอีกครั้ง นี่คือลักษณะของกลไกการขัดจังหวะโดยประมาณ

ค่อนข้างง่าย แต่มีประเด็นพื้นฐานหลายประการ
ประการแรก:
- คุณทำงานของคุณแล้ว
- ขณะเดียวกันก็มีคนซื้อออสซิลโลสโคป
- เมื่อเกิดเหตุการณ์ “ซื้อออสซิลโลสโคป” คุณขัดจังหวะการทำงานของคุณ
- คุณเคยทำงานอื่นมาระยะหนึ่งแล้ว - ถือออสซิลโลสโคป
- จากนั้นคุณกลับไปที่ที่ทำงานและทำงานต่อจากที่ค้างไว้

ประการที่สอง:
- คุณสามารถส่งเจ้านายของคุณได้อย่างง่ายดายและไม่ไปไหน
- หลังจากออกไปออสซิลโลสโคปแล้ว คุณสามารถอยู่ที่นั่นได้นานหรืออาจไม่กลับมาเลยด้วยซ้ำ
- เมื่อคุณกลับมาที่ทำงาน คุณอาจลืมไอเดียเจ๋งๆ ของคุณไปแล้ว

ทั้งหมดนี้คล้ายกันมากกับสิ่งที่เกิดขึ้นในไมโครคอนโทรลเลอร์ ไมโครคอนโทรลเลอร์ AVR ประกอบด้วยอุปกรณ์ต่อพ่วงมากมาย (ตัวจับเวลา/ตัวนับ ตัวแปลงแอนะล็อกเป็นดิจิทัล ตัวเปรียบเทียบแอนะล็อก ตัวรับส่งสัญญาณอะซิงโครนัส...ฯลฯ) พลังของไมโครคอนโทรลเลอร์คืออุปกรณ์ทั้งหมดเหล่านี้สามารถทำงานแบบขนานและแยกจากกัน รวมถึงทำงานแบบขนานกับโปรแกรมที่กำลังดำเนินการอยู่ อุปกรณ์ต่อพ่วงแต่ละชิ้นสามารถทำให้เกิดการขัดจังหวะเมื่อมีเหตุการณ์เฉพาะเกิดขึ้น การขัดจังหวะจะเกิดขึ้นก็ต่อเมื่อมีการเปิดใช้งานเท่านั้น การเปิดใช้งานการขัดจังหวะถูกตั้งค่าไว้สำหรับแต่ละอุปกรณ์แยกกัน นอกจากนี้ ยังมีการตั้งค่าสถานะเปิด/ปิดใช้งานทั่วโลกสำหรับการขัดจังหวะทั้งหมด - นี่คือการตั้งค่าสถานะ I ในการลงทะเบียน SREG เมื่อเกิดการขัดจังหวะ ไมโครคอนโทรลเลอร์จะจัดเก็บเนื้อหาของตัวนับโปรแกรมพีซีไว้บนสแต็ก นั่นคือจะจดจำตำแหน่งที่ถูกขัดจังหวะ โหลดที่อยู่ของเวกเตอร์ขัดจังหวะที่สอดคล้องกันลงในตัวนับโปรแกรมและข้ามไปยังที่อยู่นั้น เข้าสู่คำสั่ง Jump แบบไม่มีเงื่อนไข ซึ่งจะไปที่รูทีนย่อยการประมวลผลการขัดจังหวะ ปิดใช้งานการขัดจังหวะโดยการรีเซ็ตแฟล็ก I ดำเนินการรูทีนย่อย หลังจากดำเนินการตามรูทีนการจัดการการขัดจังหวะแล้ว ไมโครคอนโทรลเลอร์จะเปิดใช้งานการขัดจังหวะโดยตั้งค่าสถานะ I และกู้คืนเนื้อหาของตัวนับโปรแกรม กล่าวคือ มันจะกลับไปยังตำแหน่งเดิมในโปรแกรมที่ถูกขัดจังหวะ

ตามทฤษฎีแล้ว ตัวจัดการการขัดจังหวะไม่ควรสร้างความเสียหายให้กับเนื้อหาของรีจิสเตอร์ของไมโครคอนโทรลเลอร์ เนื่องจากอาจมีข้อมูลจากโปรแกรมที่กำลังดำเนินการในขณะนั้น เมื่อต้องการทำเช่นนี้ ที่จุดเริ่มต้นของรูทีนย่อยการจัดการการขัดจังหวะ เนื้อหาของการลงทะเบียนไมโครคอนโทรลเลอร์จะถูกเก็บไว้ในสแต็ก และในตอนท้ายของรูทีนย่อยเนื้อหาเหล่านั้นจะถูกกู้คืน ดังนั้น หลังจากออกจากการขัดจังหวะ ไมโครคอนโทรลเลอร์จะสามารถดำเนินการโปรแกรมต่อไปได้ราวกับว่าไม่มีอะไรเกิดขึ้น เมื่อเขียนโปรแกรมในแอสเซมเบลอร์โปรแกรมเมอร์เองก็กำหนดให้บันทึกการลงทะเบียนใน C ซึ่งคอมไพเลอร์จะทำได้

_______________________________________________________________

ทีนี้มาพูดถึงตัวจับเวลากัน ATmega8535 มีตัวจับเวลา/ตัวนับสามตัวบนบอร์ด - แปดบิตสองตัว (T0, T2) และหนึ่งตัวสิบหกบิต (T1) เราจะใช้ตัวจับเวลา/ตัวนับ T0 แปดบิต ตัวจับเวลานี้ประกอบด้วยรีจิสเตอร์สามรีจิสเตอร์ - รีจิสเตอร์ควบคุม TCCR0 รีจิสเตอร์การนับ TCNT0 และรีจิสเตอร์การเปรียบเทียบ OCR0 เมื่อเริ่มจับเวลา ตัวนับรีจิสเตอร์ TCNT0 จะเพิ่มค่าของมันทีละหนึ่งสำหรับแต่ละขอบนาฬิกา ความถี่สัญญาณนาฬิกาถูกเลือกจากค่าที่เป็นไปได้หลายค่าในรีจิสเตอร์ควบคุม TCCR0 นอกจากนี้ เมื่อใช้รีจิสเตอร์นี้ โหมดการทำงานของตัวจับเวลาจะถูกตั้งค่าด้วย ตัวจับเวลา T0 สามารถทำให้เกิดการขัดจังหวะเมื่อเกิดเหตุการณ์ "ล้น" - นี่คือเมื่อการลงทะเบียนการนับ TCNT0 ล้น และเมื่อเกิดเหตุการณ์ "บังเอิญ" - นี่คือเมื่อค่าของการลงทะเบียนการนับ TCNT0 เท่ากับค่า ของรีจิสเตอร์เปรียบเทียบ OCR0 ค่าสถานะที่เปิดใช้งานการขัดจังหวะเหล่านี้จะอยู่ในการลงทะเบียน TIMSK
เราจะกำหนดค่าตัวจับเวลา/ตัวนับ T0 เพื่อทริกเกอร์เหตุการณ์ "จับคู่" ขัดจังหวะที่ 5 kHz ในฟังก์ชันตัวจัดการ เราจะกลับสถานะของเอาต์พุตไมโครคอนโทรลเลอร์ที่เชื่อมต่อลำโพงเพียโซอยู่ ดังนั้นความถี่เสียงเปียโซจะเท่ากับ 2.5 kHz (เป็นลำโพงเปียโซที่เชื่อมต่ออยู่! อย่าให้มันปะปนกัน ความต้านทานของลำโพงเปียโซนั้นขึ้นอยู่กับความถี่ และที่ 2.5 KHz โดยปกติจะเป็นหน่วยของ Com จึงสามารถเชื่อมต่อกับเอาต์พุตไมโครคอนโทรลเลอร์ได้โดยตรง โดยไม่ต้อง ตัวต้านทานจำกัด)

ตอนนี้เกี่ยวกับโปรแกรม ไม่สามารถเขียนโปรแกรมทีละบรรทัดได้อีกต่อไป ดังนั้นฉันจะเขียนข้อความให้ทันที ด้านล่างนี้เราจะวิเคราะห์บรรทัดทั้งหมดทีละบรรทัดและทุกอย่างจะชัดเจน ฉันไม่ได้ตั้งใจใช้มาโคร โปรแกรมมีขนาดเล็ก และฉันไม่ต้องการที่จะเกะกะ

ภายในหลัก( เป็นโมฆะ )
{
//ตั้งค่าพอร์ต I/O
DDRD = (0<พอร์ตดี = (1<

//ตั้งเวลา T0
TCCR0 = (1<TCNT0 = 0;
OCR0 = 0xc8;

//เปิดใช้งานการขัดจังหวะ
__enable_ขัดจังหวะ();

// โปรแกรมหลักวนซ้ำ - สำรวจปุ่ม
ในขณะที่(1){
ถ้า((รหัส PIN & (1<ทิมสค์ = (1<อื่น
ทิมสค์ = 0;
}
กลับ 0;
}

//ขัดจังหวะตัวจัดการสำหรับตัวจับเวลา T0

__ขัดจังหวะ เป็นโมฆะ Timer0CompVect( เป็นโมฆะ)
{
พอร์ตดี ^= (1<}

การตั้งค่าพอร์ต

ในวงจรของเรา ปุ่มและลำโพงเพียโซเชื่อมต่อกับพอร์ต D ต้องกำหนดค่าพินที่เชื่อมต่อปุ่มเป็นอินพุตและต้องเปิดตัวต้านทานแบบดึงขึ้น ต้องตั้งค่าพินที่เชื่อมต่อลำโพงเพียโซเป็นเอาต์พุต

DDRD = (0<พอร์ตดี = (1<

การตั้งเวลา

โหมดการทำงานของตัวจับเวลา T0 คือ CTC (รีเซ็ตด้วยความบังเอิญ) สัญญาณนาฬิกาคือ clk/8 เราสะท้อนสิ่งนี้ในการลงทะเบียน TCCR0

TCCR0 = (1<

ในกรณีที่เรารีเซ็ตการลงทะเบียนการนับ TCNT0

เขียน 0xc8 ไปยังรีจิสเตอร์การเปรียบเทียบ OCR0 ทำไม เพราะผมนับมันแล้ว เครื่องคิดเลข- บนกระดาษการคำนวณนี้มีลักษณะเช่นนี้
ความถี่สัญญาณนาฬิกาของไมโครคอนโทรลเลอร์ 8 MHz
สัญญาณนาฬิกาจับเวลาคือ 8000000 Hz/8 = 1000000 Hz
เวลาของนาฬิกาจับเวลาหนึ่งตัว 1/1000000 = 1 µs
เวลาหนึ่งรอบของความถี่ที่เราต้องการคือ 1/5000 Hz = 200 μs
มีตัวจับเวลากี่ตัวที่พอดีกับ 200 µs? 200/1 = 200 ขีด
200 ในเลขฐานสิบหก = 0xc8

สำหรับคำอธิบายโดยละเอียดของตัวจับเวลา T0 โปรดดูเอกสารประกอบสำหรับ ATMega8535

เราได้กำหนดค่าตัวจับเวลาและเปิดใช้งานการขัดจังหวะทั่วไปโดยใช้ฟังก์ชันในตัว

__enable_ขัดจังหวะ();

ปุ่มสำรวจความคิดเห็น

เมื่อไม่ได้กดปุ่มเอาต์พุตของไมโครคอนโทรลเลอร์จะเชื่อมต่อกับพลังงานผ่านตัวต้านทานแบบดึงขึ้นภายในนั่นคือมีตัวหนึ่งอยู่ที่เอาต์พุต เมื่อกดปุ่มเอาต์พุตจะลัดวงจรลงกราวด์นั่นคือที่นั่น เป็นศูนย์ที่เอาต์พุต ในการตรวจสอบว่ามีการกดปุ่มหรือไม่ คุณต้องอ่านเนื้อหาของการลงทะเบียน PIND และตรวจสอบค่าของศูนย์บิต (ปุ่มเชื่อมต่อกับ PD0) เราจะสำรวจปุ่มแบบวนซ้ำไม่รู้จบ

ในขณะที่ (1)
{
ถ้า((รหัส PIN & (1<// หากกดปุ่ม ไมโครคอนโทรลเลอร์ควรจะส่งเสียงดัง
}
อื่น {
//ถ้าไม่ก็เงียบเหมือนปลา
}
}

อย่าลืม == ไม่ใช่ผู้ดำเนินการมอบหมาย =

การจัดการการกดปุ่ม/ปล่อย

โดยการกดปุ่มเราจะเปิดใช้งานการหยุดชะงักของตัวจับเวลา T0 และเมื่อปล่อยเราจะปิดการใช้งาน เมื่อต้องการทำเช่นนี้ เราจะจัดการบิต OCIE0 ของการลงทะเบียน TIMSK

ทิมสค์ = (1<// อนุญาตให้มีการหยุดชะงักของตัวจับเวลา T0 เนื่องจากเหตุการณ์บังเอิญ

ทิมสค์ = 0; // ปิดการใช้งานการหยุดชะงัก

เนื่องจากเราใช้ตัวจับเวลาเพียงตัวเดียว จึงไม่จำเป็นต้องตั้งค่าหรือรีเซ็ตแต่ละบิต

ฟังก์ชั่นขัดจังหวะ

_____________________ ไวยากรณ์ของฟังก์ชันขัดจังหวะ _____________________

ฟังก์ชันขัดจังหวะถูกกำหนดโดยใช้คำสั่ง #pragma vector= และคำฟังก์ชัน __ขัดจังหวะ.ฟังก์ชันต้องเป็นประเภท void และต้องไม่มีพารามิเตอร์ใดๆ

#pragma vector = ที่อยู่
__ขัดจังหวะ เป็นโมฆะชื่อ( เป็นโมฆะ)
{
//โค้ดของเราอยู่ที่นี่
}

ชื่อ– ชื่อฟังก์ชั่น เลือกตามดุลยพินิจของเรา
ที่อยู่– ที่อยู่เวกเตอร์ขัดจังหวะ สามารถระบุได้ด้วยตัวเลข หรือตามชื่อที่กำหนดในไฟล์ส่วนหัวของไมโครคอนโทรลเลอร์ (iom8535.h – ส่วนคำจำกัดความเวกเตอร์ขัดจังหวะ)

______________________________________________________________

สำหรับงานของเรา ฟังก์ชันตัวจัดการการขัดจังหวะจะมีลักษณะเช่นนี้

#pragma เวกเตอร์ = TIMER0_COMP_vect
__ขัดจังหวะ เป็นโมฆะ Timer0CompVect( เป็นโมฆะ)
{
พอร์ตดี ^= (1<//กลับสัญญาณที่ขา PD1
}

นั่นคือทั้งหมดที่ ฉันหวังว่าทุกอย่างชัดเจน
ในบทความถัดไป เราจะทำให้ไมโครคอนโทรลเลอร์เล่นทำนองเพลง

ขัดจังหวะ - เหตุการณ์ที่ต้องการการตอบสนองทันทีจากโปรเซสเซอร์ การตอบสนองคือโปรเซสเซอร์ขัดจังหวะการประมวลผลของโปรแกรมปัจจุบัน ( โปรแกรมถูกขัดจังหวะ) และดำเนินการรันโปรแกรมอื่นต่อไป ( โปรแกรมขัดจังหวะ) ออกแบบมาเพื่องานนี้โดยเฉพาะ เมื่อโปรแกรมนี้เสร็จสิ้น โปรเซสเซอร์จะกลับไปดำเนินการโปรแกรมที่ถูกขัดจังหวะ

แต่ละเหตุการณ์ที่ต้องหยุดชะงักจะตามมาด้วย สัญญาณขัดจังหวะแจ้งให้คอมพิวเตอร์ทราบเรื่องนี้แล้วโทรไป ขัดจังหวะคำขอ.

สถานะของโปรแกรมแสดงถึงชุดสถานะขององค์ประกอบหน่วยเก็บข้อมูลทั้งหมด ณ จุดเวลาที่สอดคล้องกัน (เช่น หลังจากดำเนินการคำสั่งสุดท้าย) เมื่อเกิดการขัดจังหวะ ไมโครคอนโทรลเลอร์จะจัดเก็บเนื้อหาของตัวนับโปรแกรมไว้บนสแต็กและโหลดที่อยู่ของเวกเตอร์ขัดจังหวะที่เกี่ยวข้องลงไป คำสั่งสุดท้ายของรูทีนบริการขัดจังหวะจะต้องเป็นคำสั่งที่กลับไปยังโปรแกรมหลักและกู้คืนตัวนับโปรแกรมที่เก็บไว้ก่อนหน้านี้ ขณะที่ตัวจัดการขัดจังหวะกำลังดำเนินการ ข้อมูลบางอย่างอาจมีการเปลี่ยนแปลง ดังนั้นเมื่อย้ายไปยังตัวจัดการการขัดจังหวะ จำเป็นต้องบันทึกองค์ประกอบที่กำลังเปลี่ยนแปลง ชุดขององค์ประกอบดังกล่าวคือ เวกเตอร์สถานะของโปรแกรม- ในกรณีนี้ ข้อมูลอื่นๆ เกี่ยวกับสถานะของเซลล์หน่วยความจำไม่มีนัยสำคัญหรือสามารถกู้คืนได้โดยทางโปรแกรม

เวกเตอร์สถานะเริ่มต้นมีข้อมูลที่จำเป็นทั้งหมดสำหรับการเปิดตัวโปรแกรมครั้งแรก ในหลายกรณี เวกเตอร์สถานะเริ่มต้นมีเพียงองค์ประกอบเดียวเท่านั้น นั่นคือที่อยู่เริ่มต้นของโปรแกรมที่กำลังเปิดใช้งาน

เวกเตอร์ขัดจังหวะเป็นเวกเตอร์ของสถานะเริ่มต้นของโปรแกรมขัดจังหวะ (ตัวจัดการ) และมีข้อมูลที่จำเป็นทั้งหมดสำหรับการย้ายไปยังตัวจัดการ รวมถึงที่อยู่เริ่มต้นด้วย การขัดจังหวะแต่ละประเภทจะมีเวกเตอร์ขัดจังหวะของตัวเอง ซึ่งเริ่มต้นการดำเนินการของตัวจัดการที่เกี่ยวข้อง โดยทั่วไปแล้ว เวกเตอร์ขัดจังหวะจะถูกจัดเก็บไว้ในตำแหน่งหน่วยความจำคงที่ที่จัดสรรเป็นพิเศษพร้อมที่อยู่แบบสั้นซึ่งเป็นตัวแทน ขัดจังหวะตารางเวกเตอร์- ในการข้ามไปยังโปรแกรมขัดจังหวะที่เหมาะสม โปรเซสเซอร์จะต้องมีเวกเตอร์ขัดจังหวะและที่อยู่ของเวกเตอร์นี้ ตามที่อยู่นี้ ตามกฎแล้ว จะมีคำสั่งกระโดดแบบไม่มีเงื่อนไขไปยังรูทีนย่อยการจัดการการขัดจังหวะ

ตามกฎแล้ว การควบคุมการจัดเก็บและการส่งคืนถูกกำหนดให้กับตัวจัดการการขัดจังหวะ ในกรณีนี้ ตัวจัดการประกอบด้วยสามส่วน - การเตรียมการ (อารัมภบท) และขั้นสุดท้าย (บทส่งท้าย) ซึ่งรับประกันการสลับโปรแกรม และโปรแกรมขัดจังหวะจริงซึ่งดำเนินการตามที่ร้องขอตามคำขอ เวลาตอบสนองถูกกำหนดให้เป็นช่วงเวลาจากช่วงเวลาที่ได้รับคำขอขัดจังหวะจนกระทั่งโปรแกรมขัดจังหวะเริ่มดำเนินการ


ทีพี– เวลาตอบสนองของระบบต่อการหยุดชะงัก
เสื้อ– เวลาในการจัดเก็บสถานะของโปรแกรมที่ถูกขัดจังหวะ
ทีหน้า– เวลาของโปรแกรมขัดจังหวะจริง
ทีเข้า– เวลาในการคืนสถานะของโปรแกรมที่ถูกขัดจังหวะ

หากมีแหล่งที่มาของคำขอหลายแหล่ง จะต้องสร้างลำดับการให้บริการคำขอที่เข้ามา เรียกว่า ความสัมพันธ์ที่มีลำดับความสำคัญหรือ วินัยการบริการ- ชุดของประเภทการขัดจังหวะตัวประมวลผลที่เป็นไปได้ทั้งหมดคือ ระบบขัดจังหวะไมโครคอนโทรลเลอร์ วินัยการบริการจะกำหนดว่าคำขอใดที่ได้รับพร้อมกันจะถูกประมวลผลก่อน และตัวจัดการขัดจังหวะนี้หรือนั้นมีสิทธิ์ขัดจังหวะคำขอนี้หรือไม่
หากได้รับคำขอขัดจังหวะที่มีลำดับความสำคัญสูงกว่าในขณะที่กำลังประมวลผลการขัดจังหวะ การควบคุมจะถูกถ่ายโอนไปยังตัวจัดการขัดจังหวะที่มีลำดับความสำคัญสูงกว่า และตัวจัดการขัดจังหวะที่มีลำดับความสำคัญต่ำกว่าจะถูกระงับ เกิดขึ้น ขัดจังหวะการทำรัง- เรียกว่าจำนวนโปรแกรมสูงสุดที่สามารถระงับซึ่งกันและกันได้ ความลึกของการหยุดชะงัก.

หากคำขอขัดจังหวะไม่ได้รับการบริการตามเวลาที่คำขอใหม่มาถึงจากแหล่งเดียวกัน (ลำดับความสำคัญเท่ากัน) ดังนั้น ขัดขวางความอิ่มตัวของระบบ- ในกรณีนี้ คำขอขัดจังหวะบางอย่างจะหายไป ซึ่งไม่สามารถยอมรับได้สำหรับการทำงานปกติของไมโครคอนโทรลเลอร์

ลักษณะของระบบขัดจังหวะเป็น:

  • จำนวนคำขอขัดจังหวะทั้งหมด จำนวนแหล่งที่มาของคำขอขัดจังหวะ
  • ประเภทการแสดงการขัดจังหวะ - ตามกฎแล้วคำขอขัดจังหวะจะแสดงด้วยระดับสัญญาณลอจิคัล
  • ลำดับความสำคัญของการขัดจังหวะ - กำหนดลำดับการประมวลผลคำขอขัดจังหวะแต่ละรายการ ยิ่งมีลำดับความสำคัญสูงเท่าใด ความล่าช้าในการดำเนินการของโปรแกรมขัดจังหวะก็จะยิ่งสั้นลงเท่านั้น
  • เวลาตอบสนอง - ช่วงเวลาระหว่างการปรากฏตัวของคำขอขัดจังหวะและการเริ่มต้นการทำงานของโปรแกรมขัดจังหวะ
  • ความล่าช้าในการหยุดชะงัก - พิจารณาจากเวลารวมในการจัดเก็บและกู้คืนโปรแกรม
  • ความลึกมักจะเกิดขึ้นพร้อมกับจำนวนระดับความสำคัญในระบบขัดจังหวะ
  • ขัดจังหวะความอิ่มตัวของระบบ
  • ช่วงเวลาที่อนุญาตของการหยุดชะงักของโปรแกรม (โดยปกติจะเป็นการสิ้นสุดการดำเนินการของคำสั่งถัดไป)

ขัดจังหวะการมาสก์ใช้เพื่อบอกให้ไมโครคอนโทรลเลอร์ตอบสนองต่อการขัดจังหวะแต่ละประเภทหรือเพิกเฉย มาสก์ขัดจังหวะแสดงถึงรหัสไบนารี่ซึ่งมีบิตถูกแมปเพื่อขัดจังหวะแหล่งคำขอ บิตหนึ่งในรหัสไบนารี่บอกให้ไมโครคอนโทรลเลอร์จัดการกับการขัดจังหวะประเภทนี้ ในทางตรงกันข้าม ศูนย์บิตไม่อนุญาตให้ไมโครคอนโทรลเลอร์ดำเนินการประมวลผลการขัดจังหวะประเภทที่ระบุ
ตามกฎแล้ว นอกเหนือจากการปกปิดการขัดจังหวะแล้ว ยังมีบิตเปิดใช้งานการขัดจังหวะส่วนกลางด้วย ซึ่งค่าศูนย์จะปิดการใช้งานตัวจัดการการขัดจังหวะทั้งหมด (ยกเว้นการรีเซ็ตฮาร์ดแวร์และข้ามไปยังจุดเริ่มต้นของโปรแกรมที่รัน)
นอกจากรหัสไบนารี่ของมาสก์ขัดจังหวะแล้ว ยังมีรหัสไบนารี่อีกด้วย ขัดจังหวะธงซึ่งอนุญาตให้ตัวจัดการการขัดจังหวะตั้งค่าแหล่งที่มาของการขัดจังหวะหากมีหลายแหล่งที่มีการร้องขอที่ระบุในไมโครคอนโทรลเลอร์



 


อ่าน:


ใหม่

วิธีฟื้นฟูรอบประจำเดือนหลังคลอดบุตร:

วิธีรีเซ็ตรหัสผ่านผู้ดูแลระบบบน Mac OS X โดยไม่ต้องใช้แผ่นดิสก์การติดตั้ง

วิธีรีเซ็ตรหัสผ่านผู้ดูแลระบบบน Mac OS X โดยไม่ต้องใช้แผ่นดิสก์การติดตั้ง

แม้จะมีชื่อที่ไม่ชัดเจน แต่บทความนี้จะไม่เกี่ยวกับการแฮ็กบัญชีใน Mac OS X (คุณสามารถอ่านเกี่ยวกับเรื่องนี้ได้หากต้องการ...

การตั้งค่า Shadow Defender

การตั้งค่า Shadow Defender

และอื่นๆ อีกมากมาย โดยเฉพาะอย่างยิ่ง เราได้กล่าวถึงสิ่งต่างๆ เช่น (ซึ่งสามารถทำหน้าที่ป้องกันการติดเชื้อได้ หรืออย่างน้อยก็เป็นวิธีหนึ่งในการกลับมา...

ทำไมโปรเซสเซอร์ในคอมพิวเตอร์ของฉันถึงร้อนจัด?

ทำไมโปรเซสเซอร์ในคอมพิวเตอร์ของฉันถึงร้อนจัด?

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

โหมด "เทอร์โบ" ในเบราว์เซอร์สมัยใหม่คืออะไร: Chrome, Yandex, Opera

โหมด

เว็บเบราว์เซอร์ชื่อดังมากมาย เช่น Yandex.Browser มีโหมด “Turbo” พิเศษ ซึ่งสามารถเพิ่มความเร็วได้อย่างมาก...

ฟีดรูปภาพ อาร์เอสเอส