【发布时间】:2014-06-05 17:50:14
【问题描述】:
我刚刚在使用 msp430f5529(TI 启动板)时遇到了一个有趣的现象。在尝试了不同的方法后,我找到了解决方案,但我不明白这里发生了什么。
此代码是定时器中断服务程序 (ISR) 的一部分。特殊功能寄存器 (SFR) TA0IV 应该保存触发 ISR 的中断号的值。
1 unsigned int index;
2
3 index = TA0IV; // Gives wrong value: 19874
4 index = *((volatile unsigned int *) TA0IV_); // Correct value: 4
TA0IV 在这里用宏定义:
5 #define sfrw_(x,x_) volatile __MSPGCC_PERIPHERAL__ unsigned int x __asm__("__" #x)
6 #define sfrw(x,x_) extern sfrw_(x,x_)
7 #define TA0IV_ 0x036E /* Timer0_A5 Interrupt Vector Word */
8 sfrw(TA0IV, TA0IV_);
-
第 5 行第一个宏的这部分是做什么的?
asm("__" #x)
-
为什么第 5 行宏的右侧没有“x_”?
-
最后也是最重要的问题:为什么第 4 行的常规类型转换按预期工作,但第 3 行的类型转换却没有?
顺便说一句,我使用 gcc-4.7.0。
编辑:更多信息
9 #define __MSPGCC_PERIPHERAL__ __attribute__((__d16__))
【问题讨论】:
标签: c gcc macros interrupt msp430