ฉันกำลังเขียนโปรแกรมสำหรับ Cortex M0 / M4 ในขณะนี้และวิธีการที่เราใช้ใน C ++ (ไม่มีแท็ก C ++ ดังนั้นคำตอบนี้อาจไม่เป็นหัวข้อ) คือ:
เราใช้คลาสCInterruptVectorTable
ที่มีรูทีนการบริการขัดจังหวะทั้งหมดซึ่งเก็บไว้ในเวกเตอร์อินเตอร์รัปต์จริงของคอนโทรลเลอร์:
#pragma location = ".intvec"
extern "C" const intvec_elem __vector_table[] =
{
{ .__ptr = __sfe( "CSTACK" ) }, // 0x00
__iar_program_start, // 0x04
CInterruptVectorTable::IsrNMI, // 0x08
CInterruptVectorTable::IsrHardFault, // 0x0C
//[...]
}
คลาสนี้CInterruptVectorTable
ใช้นามธรรมของเวกเตอร์ขัดจังหวะดังนั้นคุณสามารถผูกฟังก์ชันที่แตกต่างกับเวกเตอร์ขัดจังหวะในระหว่างรันไทม์
อินเทอร์เฟซของคลาสนั้นมีลักษณะดังนี้:
class CInterruptVectorTable {
public :
typedef void (*IsrCallbackfunction_t)(void);
enum InterruptId_t {
INTERRUPT_ID_NMI,
INTERRUPT_ID_HARDFAULT,
//[...]
};
typedef struct InterruptVectorTable_t {
IsrCallbackfunction_t IsrNMI;
IsrCallbackfunction_t IsrHardFault;
//[...]
} InterruptVectorTable_t;
typedef InterruptVectorTable_t* PinterruptVectorTable_t;
public :
CInterruptVectorTable(void);
void SetIsrCallbackfunction(const InterruptId_t& interruptID, const IsrCallbackfunction_t& isrCallbackFunction);
private :
static void IsrStandard(void);
public :
static void IsrNMI(void);
static void IsrHardFault(void);
//[...]
private :
volatile InterruptVectorTable_t virtualVectorTable;
static volatile CInterruptVectorTable* pThis;
};
คุณต้องสร้างฟังก์ชั่นที่เก็บไว้ในตารางเวกเตอร์static
เนื่องจากคอนโทรลเลอร์ไม่สามารถจัดเตรียมthis
-pointer เนื่องจากตารางเวกเตอร์ไม่ใช่วัตถุ ดังนั้นเพื่อให้ได้แก้ไขปัญหาที่เรามีคงpThis
-pointer CInterruptVectorTable
ภายใน เมื่อเข้าสู่หนึ่งคงขัดจังหวะการทำงานก็สามารถเข้าถึงpThis
-pointer CInterruptVectorTable
การเข้าถึงให้กับสมาชิกของวัตถุหนึ่งของ
ตอนนี้ในโปรแกรมคุณสามารถใช้SetIsrCallbackfunction
เพื่อให้ตัวชี้ฟังก์ชั่นกับstatic
ฟังก์ชั่นที่จะถูกเรียกเมื่อเกิดขัดจังหวะ InterruptVectorTable_t virtualVectorTable
ชี้ถูกเก็บไว้ใน
และการใช้ฟังก์ชั่นอินเตอร์รัปต์มีลักษณะดังนี้:
void CInterruptVectorTable::IsrNMI(void) {
pThis->virtualVectorTable.IsrNMI();
}
ดังนั้นจะเรียกใช้static
เมธอดของคลาสอื่น (ซึ่งอาจเป็นprivate
) ซึ่งจากนั้นสามารถมีตัวstatic
this
ชี้อีกอันเพื่อเข้าถึงสมาชิกตัวแปรของวัตถุนั้น (เพียงอันเดียว)
ฉันเดาว่าคุณสามารถสร้างและอินเทอร์เฟซเช่นIInterruptHandler
และเก็บพอยน์เตอร์กับวัตถุดังนั้นคุณไม่จำเป็นต้องใช้static
this
-pointer ในคลาสเหล่านั้นทั้งหมด (บางทีเราอาจลองในการทำซ้ำครั้งถัดไปของสถาปัตยกรรมของเรา)
วิธีการอื่น ๆ ใช้งานได้ดีสำหรับเราเนื่องจากวัตถุเดียวที่ได้รับอนุญาตให้ใช้ตัวจัดการขัดจังหวะคือสิ่งที่อยู่ในเลเยอร์นามธรรมที่เป็นฮาร์ดแวร์และเรามักจะมีเพียงหนึ่งวัตถุสำหรับแต่ละบล็อกฮาร์ดแวร์จึงทำงานได้ดีกับตัวstatic
this
ชี้ และเลเยอร์ abstraction ของฮาร์ดแวร์นั้นเป็นอีกสิ่งหนึ่งที่ทำให้อินเทอร์รัปต์เรียกว่าICallback
ซึ่งถูกนำไปใช้ในเลเยอร์อุปกรณ์ด้านบนฮาร์ดแวร์
คุณเข้าถึงข้อมูลทั่วโลกหรือไม่ แน่นอนว่าคุณทำได้ แต่คุณสามารถใช้ประโยชน์จากข้อมูลทั่วโลกที่เป็นส่วนตัวเช่นตัวthis
ชี้และฟังก์ชั่นอินเตอร์รัปต์
มันไม่ได้เป็นกระสุนและมันเพิ่มค่าใช้จ่าย คุณจะพยายามใช้กองซ้อน IO-Link โดยใช้วิธีนี้ แต่ถ้าคุณไม่เข้มงวดกับการกำหนดเวลาการทำงานนี้ค่อนข้างดีที่จะได้รับการขัดจังหวะโดยอัตโนมัติของการขัดจังหวะและการสื่อสารในโมดูลโดยไม่ต้องใช้ตัวแปรทั่วโลกซึ่งสามารถเข้าถึงได้จากทุกที่