嵌入式代码常用编程技巧:一

6 篇文章 0 订阅

根据SOC Addr 去定义一个相关结构体,取得硬件中断信息。
#define INTCON (*(volatile intcon_t *) MAKE_IMU_REG(GFX_IMU_PIC_INT_MASK))

#define MAKE_IMU_REG(reg) (PIF_BASE_ADDRESS + (mm##reg))

typedef struct {
uint32_t InterruptMask;
uint32_t InterruptLevel;
uint32_t InterruptEdge;
uint8_t InterruptPriority[NUM_INTCON_INPUTS];
uint32_t InterruptPending;
uint32_t InterruptLine;
uint32_t InterruptID;
} intcon_t;

union GFX_IMU_PIC_INT_MASK {
struct {
#if defined(LITTLEENDIAN_CPU)
uint32_t MASK_0 : 1;
uint32_t MASK_1 : 1;
uint32_t MASK_2 : 1;
uint32_t MASK_3 : 1;
uint32_t MASK_4 : 1;
uint32_t MASK_5 : 1;
uint32_t MASK_6 : 1;
uint32_t MASK_7 : 1;
uint32_t MASK_8 : 1;
uint32_t MASK_9 : 1;
uint32_t MASK_10 : 1;
uint32_t MASK_11 : 1;
uint32_t MASK_12 : 1;
uint32_t MASK_13 : 1;
uint32_t MASK_14 : 1;
uint32_t MASK_15 : 1;
uint32_t MASK_16 : 1;
uint32_t MASK_17 : 1;
uint32_t MASK_18 : 1;
uint32_t MASK_19 : 1;
uint32_t MASK_20 : 1;
uint32_t MASK_21 : 1;
uint32_t MASK_22 : 1;
uint32_t MASK_23 : 1;
uint32_t MASK_24 : 1;
uint32_t MASK_25 : 1;
uint32_t MASK_26 : 1;
uint32_t MASK_27 : 1;
uint32_t MASK_28 : 1;
uint32_t MASK_29 : 1;
uint32_t MASK_30 : 1;
uint32_t MASK_31 : 1;
#elif defined(BIGENDIAN_CPU)
uint32_t MASK_31 : 1;
uint32_t MASK_30 : 1;
uint32_t MASK_29 : 1;
uint32_t MASK_28 : 1;
uint32_t MASK_27 : 1;
uint32_t MASK_26 : 1;
uint32_t MASK_25 : 1;
uint32_t MASK_24 : 1;
uint32_t MASK_23 : 1;
uint32_t MASK_22 : 1;
uint32_t MASK_21 : 1;
uint32_t MASK_20 : 1;
uint32_t MASK_19 : 1;
uint32_t MASK_18 : 1;
uint32_t MASK_17 : 1;
uint32_t MASK_16 : 1;
uint32_t MASK_15 : 1;
uint32_t MASK_14 : 1;
uint32_t MASK_13 : 1;
uint32_t MASK_12 : 1;
uint32_t MASK_11 : 1;
uint32_t MASK_10 : 1;
uint32_t MASK_9 : 1;
uint32_t MASK_8 : 1;
uint32_t MASK_7 : 1;
uint32_t MASK_6 : 1;
uint32_t MASK_5 : 1;
uint32_t MASK_4 : 1;
uint32_t MASK_3 : 1;
uint32_t MASK_2 : 1;
uint32_t MASK_1 : 1;
uint32_t MASK_0 : 1;
#endif
} bitfields, bits;
uint32_t u32All;
int32_t i32All;
float f32All;
};

当中断函数发生时,可以用中断函数表来调用相应的中断函数:

typedef void (*IsrPtr)(void);

IsrPtr IsrPICTable[NUM_INTCON_INPUTS];

IsrPICTableCurrentInterruptID;

IsrPtr IsrPICTable[NUM_INTCON_INPUTS] = {
&UnassignedIsr, // 0
&UnassignedIsr, // 1
&UnassignedIsr, // 2
&UnassignedIsr, // 3
&UnassignedIsr, // 4
&UnassignedIsr, // 5
&UnassignedIsr, // 6
&UnassignedIsr, // 7
&UnassignedIsr, // 8
&UnassignedIsr, // 9
&UnassignedIsr, // 10
&UnassignedIsr, // 11
&UnassignedIsr, // 12
&UnassignedIsr, // 13
&UnassignedIsr, // 14
&UnassignedIsr, // 15
&UnassignedIsr, // 16
&UnassignedIsr, // 17
&UnassignedIsr, // 18
&UnassignedIsr, // 19
&UnassignedIsr, // 20
&UnassignedIsr, // 21
&UnassignedIsr, // 22
&UnassignedIsr, // 23
&UnassignedIsr, // 24
&UnassignedIsr, // 25
&UnassignedIsr, // 26
&UnassignedIsr, // 27
&UnassignedIsr, // 28
&UnassignedIsr, // 29
&UnassignedIsr, // 30
&UnassignedIsr, // 31
};

typedef struct {
int8_t InterruptId; // Interrupt ID of this interrupt level
uint8_t IntrDefaultStatus; // Interrupt on by default PIC_DEFAULT_INTR_e
uint8_t IntrTriggerType; // level or edge, PIC_TRIGGER_TYPE_e
//uint8_t IntrClearType; // Clear interrupt before being processed, PIC_INTR_CLEAR_TYPE_e
uint8_t Reserved;
IsrPtr IsrHandler;
} InterruptConfig_t;

const InterruptConfig_t InterruptConfig[] =
{
{ .InterruptId = PIC_LOCAL_DOORBELL_GFXOFF, .IntrDefaultStatus = PIC_DEFAULT_INTR_ON, .IntrTriggerType = PIC_TRIGGER_EDGE, .IsrHandler = &IsrGfxDoorbellHandler },
{ .InterruptId = PIC_RLC_TO_IMU_MSG, .IntrDefaultStatus = PIC_DEFAULT_INTR_ON, .IntrTriggerType = PIC_TRIGGER_EDGE, .IsrHandler = &IsrRLCMsg },
{ .InterruptId = PIC_GFX_ACCESS_GFXOFF, .IntrDefaultStatus = PIC_DEFAULT_INTR_ON, .IntrTriggerType = PIC_TRIGGER_EDGE, .IsrHandler = &IsrGfxAccessViolation },
{ .InterruptId = PIC_C2PMSG0, .IntrDefaultStatus = PIC_DEFAULT_INTR_ON, .IntrTriggerType = PIC_TRIGGER_EDGE, .IsrHandler = &IsrMP1Msg },
{ .InterruptId = INTERRUPT_CONFIG_LIST_TERMINATOR, }, // Termination token (zero taken for PIC[0])
};

for (i = 0; INTERRUPT_CONFIG_LIST_TERMINATOR != InterruptConfig[i].InterruptId; i++) {
InterruptID = (uint32_t) InterruptConfig[i].InterruptId; //casting is safe, only negative value should be INTERRUPT_CONFIG_LIST_TERMINATOR
RegisterPicInterrupt(InterruptID, InterruptConfig[i].IntrDefaultStatus, InterruptConfig[i].IntrTriggerType, InterruptConfig[i].IsrHandler);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值