1

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

第一点是关于类型转换。有人可以告诉我我是否正确阅读了以下代码:

#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;

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

4

2 回答 2

2

您正在查看的代码看起来像是在访问内存映射寄存器

  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;
    

    正在向该内存地址写入一个值。

于 2013-02-26T18:13:22.200 回答
0

的值B_TIME是类型的值UINT8

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

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

(UINT_8 *)(A_TIME + 0x00002909)

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

于 2013-02-26T18:07:16.150 回答