나는 현재 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
포인터를 제공 할 수 없기 때문에 벡터 테이블에 저장된 기능을 만들어야 합니다. 따라서이 문제를 해결하기 위해 pThis
내부에 정적 포인터가 있습니다 CInterruptVectorTable
. 정적 인터럽트 함수 중 하나를 입력하면 pThis
-pointer에 액세스하여의 한 객체의 멤버에 액세스 할 수 있습니다 CInterruptVectorTable
.
이제 프로그램에서를 사용하여 인터럽트가 발생할 때 호출 SetIsrCallbackfunction
되는 static
함수에 대한 함수 포인터를 제공 할 수 있습니다 . 포인터는에 저장됩니다 InterruptVectorTable_t virtualVectorTable
.
그리고 인터럽트 함수의 구현은 다음과 같습니다 :
void CInterruptVectorTable::IsrNMI(void) {
pThis->virtualVectorTable.IsrNMI();
}
따라서 static
다른 클래스 의 메소드를 호출 할 수 있습니다.이 클래스 private
는 다른 static
this
포인터를 포함 하여 해당 객체의 멤버 변수에 액세스 할 수 있습니다 (하나만).
IInterruptHandler
객체에 대한 포인터를 만들고 인터페이스 하고 저장할 수 있다고 생각 하므로 static
this
모든 클래스에서 포인터가 필요하지 않습니다 . (아마도 아키텍처의 다음 반복에서 시도해 볼 수 있습니다)
인터럽트 처리기를 구현할 수있는 유일한 객체는 하드웨어 추상화 계층 내부의 객체이기 때문에 다른 접근법은 우리에게 잘 작동합니다. 우리는 일반적으로 각 하드웨어 블록에 대해 하나의 객체 만 가지고 있으므로- static
this
포인터로 작업하는 것이 좋습니다. 하드웨어 추상화 계층은 인터럽트에 대한 또 다른 추상화를 제공하며,이 추상화 ICallback
는 하드웨어 위의 장치 계층에서 구현됩니다.
글로벌 데이터에 액세스하십니까? 물론, 필요한 전역 데이터의 대부분을- this
포인터 및 인터럽트 기능과 같은 개인용으로 만들 수 있습니다 .
방탄이 아니며 오버 헤드가 추가됩니다. 이 접근법을 사용하여 IO-Link 스택을 구현하는 데 어려움을 겪을 것입니다. 그러나 타이밍이 너무 빡빡하지 않으면 어디에서나 액세스 할 수있는 전역 변수를 사용하지 않고 모듈에서 유연한 인터럽트 및 통신 추상화를 얻을 수 있습니다.