Arm 在运行时篡改位带映射地址的原因
我使用位绑定来设置和清除LPC1857的GPIO6[1],使用Keil 位带区域到setGPIO6[1]的映射地址为0x43EC4304 位带区域中到clearGPIO6[1]的映射地址为0x43EC5384 GPIO设置成功,但未清除 在调试器上选中时,可以观察到清除GPIO6[1]的映射地址被设置为0x43EC5000。因此,GPIO并不清晰 有人能帮助理解为什么会发生这种情况吗? 如何在运行时将此映射地址设置解析为错误的地址 以下是代码片段:Arm 在运行时篡改位带映射地址的原因,arm,embedded,cortex-m3,keil,Arm,Embedded,Cortex M3,Keil,我使用位绑定来设置和清除LPC1857的GPIO6[1],使用Keil 位带区域到setGPIO6[1]的映射地址为0x43EC4304 位带区域中到clearGPIO6[1]的映射地址为0x43EC5384 GPIO设置成功,但未清除 在调试器上选中时,可以观察到清除GPIO6[1]的映射地址被设置为0x43EC5000。因此,GPIO并不清晰 有人能帮助理解为什么会发生这种情况吗? 如何在运行时将此映射地址设置解析为错误的地址 以下是代码片段: /*In "main.c"*/ int ma
/*In "main.c"*/
int main()
{
... //System initialization
... //GPIO init
...
Toggle_Peri();
}
/*In "Peri.c"*/
/* Bit band PERIPHERAL definitions */
#define BITBAND_PERI_REF 0x40000000 //Start Address of PeripheRALS
#define BITBAND_PERI_BASE 0x42000000 //Start Address of Peripheral Bit Band Alias Region
/* Basic bit band function definition */
#define BITBAND_PERI(a,b) ((BITBAND_PERI_BASE + ((a-BITBAND_PERI_REF)*(0x20)) + (b*(0x04)))) // Convert GPIO address
#define BITBAND_PERI_SetClearBit(a,b) ((*(volatile uint32_t *) (BITBAND_PERI(a,b))) = 1)
/*Note: Base Address of GPIO = 0x400F 4000*/
#define PERI_GPIO_ADDRESS_S 0x400F6218 //For GPIO6[1] set
#define PERI_GPIO_ADDRESS_C 0x400F629C //For GPIO6[1] clear
#define PERI_GPIO_BIT 1
...
...
...
...
void Toggle_Peri(void)
{
BITBAND_PERI_SetClearBit(PERI_GPIO_ADDRESS_S,PERI_GPIO_BIT); //Set the pin
Delay(0xFFFF);
BITBAND_PERI_SetClearBit(PERI_GPIO_ADDRESS_C,PERI_GPIO_BIT); //Clear the pin
Delay(0xFFFF);
}
对于无符号长字符,应使用
ul
定义所有整数文本。e、 g.0x40000000ul
@Rishi谢谢。完成了。考虑到有单独的set和clear寄存器避免了非原子的读-修改-写,在任何情况下使用位绑定的目的是什么?@Clifford:它是为了对位绑定I2C协议进行延迟补偿。@SonamKhullar:不,我的意思是,与简单地将适当的位掩码写入各自的get/set寄存器相比,有什么好处呢?对于无符号长寄存器,所有整数文本都应该用ul
定义。e、 g.0x40000000ul
@Rishi谢谢。完成了。考虑到有单独的set和clear寄存器避免了非原子的读-修改-写,在任何情况下使用位绑定的目的是什么?@Clifford:它是为了对位绑定I2C协议进行延迟补偿。@SonamKhullar:不,我的意思是,与简单地将适当的位掩码写入各自的get/set寄存器相比,有什么优势。