c - 类型转换和指针

标签 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;

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

最佳答案

您正在查看的代码看起来正在访问 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
    

    然后,该结果与 0xc0(11000000 二进制)进行 ORed,产生:

    0000000011ghijkl
    

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

    11ghijkl
    

    给来电者。

  3. 您的新示例:

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

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

关于c - 类型转换和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15096145/

相关文章:

c++ - 如何使用不同的数据类型达到最佳性能?

在我的插入排序程序中找不到错误

c - 递归复制功能将数据从套接字复制到文件。怎么了?

c++ - 如何计算最小公共(public)祖先算法的时间复杂度?

c - 为什么我的 fread 会返回一个空字符串?

c - PIC18F87f22(C 语言)上的冲突声明和类型重新声明问题

c - 为什么 c 数组声明为变量名而不是类型

java - 可以在 ServletContext 中存储 HashMap 吗?

c++ - float 减少 1

python - 这个选角任务是如何进行的?