【问题标题】:Type casting and pointers类型转换和指针
【发布时间】:2013-02-12 07:39:07
【问题描述】:

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

首先是关于类型转换。谁能告诉我我是否正确阅读了以下代码:

#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位值吗?它是如何工作的?

【问题讨论】:

    标签: c types casting


    【解决方案1】:

    B_TIME 的值是UINT8 类型的值。

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

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

    (UINT_8 *)(A_TIME + 0x00002909)

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

    【讨论】:

      【解决方案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 二进制文件)进行或运算,得到:

        0000000011ghijkl
        

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

        11ghijkl
        

        致调用者。

      3. 你的新例子:

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

        正在写入一个值到那个内存地址。

      【讨论】:

      • 非常感谢,现在这更有意义了! 1. 所以 B_TIME 的值等于存储在地址 0xC0502909 的任何 8 位值(在 RAM 中)。 2. 在你澄清了我对 1. 部分 2. 的理解之后,就很容易理解了。我必须感谢您花时间解释这一点,特别是考虑到它才出现这么短的时间。
      • @James,它可能不是 RAM,但是是的。
      猜你喜欢
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2021-09-20
      • 2016-06-28
      • 1970-01-01
      • 2020-06-15
      • 2015-02-14
      相关资源
      最近更新 更多