|
本帖最后由 yangc9 于 2018-6-1 16:01 编辑 定义: #define ISR(irqn) void ISR_##irqn();\ __root void(* const pISR_##irqn)() @ 0x8000000 + (irqn+16) * 4 = ISR_##irqn;\ void ISR_##irqn() 使用: ISR(TIM2_IRQn) { //处理你的中断 } 在IAR环境有效.别的环境不知道. ##表示名字拼接. ISR(TIM2_IRQn)展开成: void ISR_TIM2_IRQn(); __root void(* const pISR_TIM2_IRQn)() @ 0x8000000 + (TIM2_IRQn+16) * 4 = ISR_TIM2_IRQn; void ISR_TIM2_IRQn() 第一行声明了一个函数,名为ISR_TIM2_IRQn. 第二行定义一个函数指针,放在0x8000000 + (TIM2_IRQn+16) * 4这个位置, 指向ISR_TIM2_IRQn.这正是中断向量表的位置. __root令连接器不可删除此变量,即使发现他没有被别的函数使用. const令编译器将初值直接放在目标位置,而不是在程序开始时赋值. 第3行与后面的大括号构成函数定义. |
微信公众号
手机版
楼主这个操作算很“骚”了,哈哈哈,对于理解了底层的攻城狮来说还是很容易明白的,但是对于初学者或者不熟悉底层的人来说就有点看不懂了。给楼主大胆尝试新方式操作mcu点个大赞