我有一段我不确定的代码,非常感谢它的工作原理。
第一点是关于类型转换。有人可以告诉我我是否正确阅读了以下代码:
#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 .
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 位值的指针,然后取消引用它”。您的第二个问题遵循相同的行为。有一个映射到
0xC0C0B000
的寄存器,调用Input_Time()
时会读取该寄存器。从该地址读取一个 16 位值,向下移动 4,然后屏蔽。假设这个例子是 16 位的值,用字母来唯一表示位:abcdefghijklmnop
降档 4:
0000abcdefghijkl
然后应用掩码(
3f
十六进制为00111111
二进制):0000000000ghijkl
然后,该结果与
0xc0
(11000000
二进制)进行 ORed,产生:0000000011ghijkl
该值存储回 8 位传入字节,返回:
11ghijkl
给来电者。
您的新示例:
#define OUT_TIME *(UINT_8 *)0xC0411297 OUT_TIME = Timer;
正在向该内存地址写入一个值。
关于c - 类型转换和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15096145/