输入铸造和指针

时间:2013-02-26 18:06:16

标签: c types casting

我有一段我不确定的代码会非常感谢它的工作原理。

第一点是关于类型铸造。如果我正确地阅读以下代码,有人可以告诉我:

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

B_TIME的输出是否是指向无符号整数8位= 0x09的指针? 我不确定类型铸造是如何工作的?它是否将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函数后的* Time的值是多少?有人可以逐步完成代码并为我解释每一步吗?

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

非常感谢。 詹姆斯

编辑:

好的,我对上面的内容很满意。谢谢。我现在对在调用Input_Time()之后在代码中发生的以下内容感到困惑:

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

这怎么可能?地址0XC0411297中的{8}值不是OUT_TIME吗?这有什么作用?

2 个答案:

答案 0 :(得分:2)

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

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

    *(UINT_8 *)(A_TIME + 0x00002909)
    

    反过来,A_TIME0xC0500000取代,产生:

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

    算术运算有点:

    *(UINT_8 *)(0xC0502909)
    

    这意味着“将0xC0502909视为指向8位值的指针,然后取消引用它”。

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

    abcdefghijklmnop
    

    降低4:

    0000abcdefghijkl
    

    然后应用掩码(3f十六进制为00111111二进制):

    0000000000ghijkl
    

    然后,该结果与0xc011000000二进制数)进行OR运算,产生:

    0000000011ghijkl
    

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

    11ghijkl
    

    给来电者。

  3. 您的新示例:

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

    值写入该内存地址。

答案 1 :(得分:0)

B_TIME的值是UINT8类型的值。

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

*运算符在以下表达式中取消引用指向UINT8的指针:

(UINT_8 *)(A_TIME + 0x00002909)

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