Arm 在运行时篡改位带映射地址的原因

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

我使用位绑定来设置和清除LPC1857的GPIO6[1],使用Keil

位带区域到setGPIO6[1]的映射地址为0x43EC4304

位带区域中到clearGPIO6[1]的映射地址为0x43EC5384

GPIO设置成功,但未清除

在调试器上选中时,可以观察到清除GPIO6[1]的映射地址被设置为0x43EC5000。因此,GPIO并不清晰

有人能帮助理解为什么会发生这种情况吗? 如何在运行时将此映射地址设置解析为错误的地址

以下是代码片段:

/*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寄存器相比,有什么优势。