我有一段我不确定的代码会非常感谢它的工作原理。
第一点是关于类型铸造。如果我正确地阅读以下代码,有人可以告诉我:
#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
吗?这有什么作用?
答案 0 :(得分:2)
您正在查看的代码看起来正在访问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
二进制数)进行OR运算,产生:
0000000011ghijkl
该值存储回8位传入字节,返回:
11ghijkl
给来电者。
您的新示例:
#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 *)
的指针。