Tôi đang làm việc trong bộ điều khiển vi mô bằng cách sử dụng ngôn ngữ C. Trong vi cụ thể này, các ngắt phải được xác định bằng #pragma
theo cách sau:#pragma bên trong #define
static void func();
#pragma INTERRUPT func <interrupt_address> <interrupt_category>
static void func() { /* function body */ }
Các <interrupt_address>
là địa chỉ của ngắt trong bảng vector. Các <interrupt_category>
là 1 hoặc 2. Ví dụ, để xác định một ngắt ở Port 0 pin 0:
static void _int_p00();
#pragma INTERRUPT _int_p00 0x10 1
static void _int_p00() { (*isr_p00)(); }
Chúng ta định nghĩa dịch vụ thường xuyên ngắt thực tế ở nơi khác và trỏ chức năng sử dụng (như isr_p00
trong ví dụ) để thực hiện chúng.
Sẽ thuận tiện nếu các ngắt có thể được xác định bằng macro. Tôi muốn làm định nghĩa một macro theo cách sau:
#define DECLARE_INTERRUPT(INT_NAME, INT_CAT) \
static void _int_##INT_NAME(); \
#pragma INTERRUPT _int_##INT_NAME INT_NAME##_ADDR INT_CAT \
static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }
Trình biên dịch ném lỗi sau:
Formal parameter missing after '#'
cho thấy dòng sau:
static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }
Tôi đoán chỉ thị tiền xử lý không thể được sử dụng trong #define
s? Có bất kỳ công việc xung quanh?
Vi điều khiển và trình biên dịch nào? Nếu nó dựa trên GCC, có thể có macro thuộc tính đặc biệt mà yo có thể sử dụng, như trong C32 của Microchip: 'void __ISR (_TIMER_5_VECTOR) SomeISR (void)' – detly
Vi là OKI 431 và trình biên dịch là từ OKI: IDEU8. – Donotalo