内存映射地址和C ++中的偏移量的十六进制加法不正确

时间:2018-01-01 16:14:05

标签: c++ hex

让我们从我能够工作的东西开始,然后开始工作,然后希望社区可以帮助我找出原因。

我们说我有以下课程:

#define BASE        0x20200000 /* base GPIO address in memory mapped IO*/
#define GPSET0      0x1c    /* Pin Output Set */
#define GPCLR0      0x28    /* Pin Output Clear */
class LedDriver
{
    void set_bit(int value) 
    {
        if (value) {
           reg = GPSET0;
        } else {
           reg = GPCLR0;
        }
        // set bit 15 based on the register being used
        volatile int* address = ((volatile int*) (BASE+reg);
        *(address) |= (1 << 15);
    }
}

这很好用,最终结果是LED闪烁。太好了!

现在我想使用类成员,例如:

class LedDriver
{
    // some class members
   volatile const int BASE          = 0x20200000; /* base GPIO address in memory mapped IO*/
   volatile const int GPSET0        = 0x1c; /* Pin Output Set */
   volatile const int GPCLR0        = 0x28; /* Pin Output Clear */

    void set_bit(int value) 
    {
        if (value) {
            reg = GPSET0;
        } else {
            reg = GPCLR0;
        }
        // set bit 15 based on the register being used
        volatile int* address = ((volatile int*) (BASE+reg);
        *(address)|= (1 << 15);
    }
}

但这不起作用。我在C ++中没有足够的经验知道原因,但我确实认为它与十六进制加法有关,或者某种程度上变量的处理方式与宏不同。

我的假设是否正确?如果是这样,有没有办法使它工作,或者它不打算以这种方式工作?

最后一点说明:为了学习,我故意用编译器标志-nostdlib来避免任何stdlib函数。

0 个答案:

没有答案