我的uCOS都是基于arm来讲的。
今天看at91sam7s里面ucos移植代码,发现一段有趣的代码,反正以前没见到过,很是启发
BSP_InitIntCtrl函数,这个函数是bsp里面初始化中断向量表的一部分,先看代码
#define BSP_UNDEF_INSTRUCTION_VECTOR_ADDR (*(INT32U *)0x00000004L) #define BSP_SWI_VECTOR_ADDR (*(INT32U *)0x00000008L) #define BSP_PREFETCH_ABORT_VECTOR_ADDR (*(INT32U *)0x0000000CL) #define BSP_DATA_ABORT_VECTOR_ADDR (*(INT32U *)0x00000010L) #define BSP_IRQ_VECTOR_ADDR (*(INT32U *)0x00000018L) #define BSP_FIQ_VECTOR_ADDR (*(INT32U *)0x0000001CL)
#define BSP_IRQ_ISR_ADDR (*(INT32U *)0x00000038L) #define BSP_FIQ_ISR_ADDR (*(INT32U *)0x0000003CL)
static void BSP_IntCtrlInit (void)
{
INT16U i;
BSP_IRQ_VECTOR_ADDR = 0xE59FF018; /* LDR PC,[PC,#0x18] instruction */
BSP_IRQ_ISR_ADDR = (INT32U)OS_CPU_IRQ_ISR; /* IRQ exception vector address */
BSP_FIQ_VECTOR_ADDR = 0xE59FF018; /* LDR PC,[PC,#0x18] instruction */
BSP_FIQ_ISR_ADDR = (INT32U)OS_CPU_FIQ_ISR; /* FIQ exception vector address */
BSP_UNDEF_INSTRUCTION_VECTOR_ADDR = 0xEAFFFFFE; /* Jump to itself */
BSP_SWI_VECTOR_ADDR = 0xEAFFFFFE;
BSP_PREFETCH_ABORT_VECTOR_ADDR = 0xEAFFFFFE;
BSP_DATA_ABORT_VECTOR_ADDR = 0xEAFFFFFE;
BSP_FIQ_VECTOR_ADDR = 0xEAFFFFFE;
/* - END CODE RUNNING OUT OF RAM -- */
AT91C_BASE_AIC->AIC_EOICR = 0x00000000; /* End-of-interrupt command */
for (i = 0; i < 32; i++) { /* Disable all ISRs */
AT91C_BASE_AIC->AIC_SVR[i] = (INT32U)BSP_DummyISR_Handler;
AT91C_BASE_AIC->AIC_SMR[i] = 0;
}
}
|
由于arm7是冯诺依曼结构,数据和指令都是共用一个地址空间的,所以我们平时习惯是把地址空间里面的数据当做数据使用,几乎没有把他当做指令来想的。可是上面这段代码里面注意到
0xE59FF018类似的奇怪数据了吗,呵呵,他们可是指令哦,想到了这点就全明白了,注释后面也有。
很好的一个技巧,见识了。
阅读(2583) | 评论(0) | 转发(0) |