2013-02-26 113 views
1

我有一段我不确定的代码会非常欣赏它的工作方式。类型转换和指针

第一点是关于类型转换。谁能告诉我,如果我正确地阅读下面的代码:

#define A_TIME   0xC0500000 
#define B_TIME   *(UINT_8 *)(A_TIME + 0x00002909) 

这是该B_TIME的输出是一个指向8位= 0×09的无符号整数? 我不确定类型铸造是如何工作的?它是否将8 LSB分配给B_TIME?另外,我很困惑*(UINT_8 *)?这到底意味着什么?它是一个指向8位无符号整数的指针?

第二部分可能会清楚地知道,一旦我知道上面,但无论如何,我会张贴:

UINT_8 Timer = 0; 
Input_Time (&Timer); 



#define C_TIME     *(UINT_16 *)0xC0C0B000 
#define MASK      0x003F 

void Input_Time (UINT_8 *Time) 
{ 
    *Time = 0xC0; 
    *Time |= (UINT_8)((C_TIME >> 4) & MASK); 

    return; 
} 

什么是*时间之后Input_Time功能的价值?有人能够通过代码并为我解释每一步吗?

道歉的新手(这是一个字?!)的问题。

非常感谢。 詹姆斯

编辑:

OK,我很高兴与以上。谢谢。现在我很困惑,在代码中碰巧以下,Input_Time()被调用后:

#define OUT_TIME *(UINT_8 *)0xC0411297 
OUT_TIME = Timer; 

这怎么可能?是不是OUT_TIME地址0XC0411297内的8位值?这是如何运作的?

回答

2

您正在查看的代码看起来像访问memory mapped registers

  1. B_TIME将访问位于地址A_TIME一个8位的寄存器加上指定的偏移量 - 在这种情况下,这意味着0xC0502909。实际读取的内容取决于您使用的硬件。让我们分解一下发生的事情。B_TIME,无论在何处使用,获取与文字代替:

    *(UINT_8 *)(A_TIME + 0x00002909) 
    

    而反过来,在A_TIME被替换为0xC0500000,得到以下特性:

    *(UINT_8 *)(0xC0500000 + 0x00002909) 
    

    一个小工作了运算得出:

    *(UINT_8 *)(0xC0502909) 
    

    这意味着“将0xC0502909视为指向8位值的指针,然后对其进行解引用”。

  2. 你的第二个问题遵循相同的行为。映射为0xC0C0B000的寄存器在调用Input_Time()时正在读取。从该地址读取16位值,向下降低4,然后被屏蔽。假设本实施例中的16位值,使用字母来唯一地表示该位:

    abcdefghijklmnop 
    

    降档以4:

    0000abcdefghijkl 
    

    然后掩模(3f六角是00111111二进制)施加:

    0000000000ghijkl 
    

    然后,该结果与0xc011000000二进制)进行“或”运算,得出:

    0000000011ghijkl 
    

    该值被存储回8位传入的字节,返回:

    11ghijkl 
    

    给调用者。

  3. 您的新例子:

    #define OUT_TIME *(UINT_8 *)0xC0411297 
    OUT_TIME = Timer; 
    

    写作一个值,内存地址。

+0

非常感谢你,这使得现在更有意义! 1.因此,B_TIME的值等于地址0xC0502909中存储的任何8位值(在RAM中)。 2.你清除了我对第1部分的理解之后,很直白地理解了。 我不得不感谢您抽出时间来解释这一点,尤其是考虑到它只有这么短的时间。 – James 2013-02-26 18:53:54

+0

@詹姆斯,它可能不是内存,但是。 – 2013-02-26 18:55:52

+0

@詹姆斯 - 用你的新问题的答案更新。 – 2013-02-26 21:19:19

0

B_TIME的值是UINT8类型的值。

#define B_TIME *(UINT_8 *)(A_TIME + 0x00002909) 

*操作者解除引用指针UINT8在下面的表达式:

(UINT_8 *)(A_TIME + 0x00002909)

在以上表达式中的整数常量表达式A_TIME + 0x00002909通过的平均值转换为指针UINT8演员(UINT8 *)