我有一个 PC 程序通过 TCP/IP 连接与嵌入式板(英飞凌 XE169(C166 系列))进行通信。
该 PC 程序请求将哪些数据存储在某个地址上。PC 程序是 uC/Probe,我无法更改该程序的工作方式。
例如 uC/Probe 发送此消息:
____________________________________________________________________________________________________________
| Prefix | Length |Pkt_nr|Unused| Format | read size | Address to read |Unused|Postfix|
|--------------------|-----------|------|------|-----------|-----------|----------------------|------|-------|
|0x75 0x43 0x50 0x72 | 0x00 0x08 | 0x00 | 0x00 | 0x02 0x00 | 0x04 0x00 | 0xDC 0x3E 0x61 0x00 | 0x00 | 0x2F |
|u C P r | 8 | 0 | 0 | 2 | 4 | 0x613EDC | 0 | / |
|____________________|___________|______|______|___________|___________|______________________|______|_______|
这是一条从地址 0x613EDC 请求数据并从那里读取 4 个字节的消息。
在查看 .map 文件时,我可以看到在这个位置放置了 OSTCBCurPtr 变量。这个变量是一个 OS_TCB* 因此在请求的地址是这个变量指向的地址。
我现在已经在 .map 文件中手动查看了地址上放置了什么样的变量。但是我可以通过嵌入式板上的 C 代码获得变量类型吗?我只想知道位于该特定位置的对象是否是指针,它是 uint16_t、uint8_t、char 还是对我来说不重要的东西。
背景资料,为什么我想知道这个
嵌入式板将请求的数据发送回 uC/Probe 程序。但是指针以一种奇怪的方式存储在 XE169 芯片中。上面示例的指针例如是这样存储的:
_______________________________________
| Address | 0 | 1 | 2 | 3 |
|-----------|------|------|------|------|
|0x00613EDC | 0xE6 | 0x1F | 0x84 | 0x01 |
|___________|______|______|______|______|
因为该值是小端存储的,这将导致数字 0x01841FE6。该号码目前正在发送回 uC/Probe。但是他的号码不是正确的位置,必须进行一些计算才能到达实际的地址位置。
我们必须把这个 32 位的数字拆开,分成 2 个 16 位的数字。然后我们得到:
Hex: 0x0184 and 0x1FE6
Bits: 0b0000000110000100 and 0001111111100110
现在高 16 位必须向右移动 2 位。这些高 16 位的 2 个最低有效位成为低 16 位的 2 个最高有效位。
这导致:
Hex: 0x0061 and 0x1FE6
Bits: 0b0000000001100001 and 0001111111100110
当我们将这 2 个 16 位数字粘贴回 32 位数字时,我们有指针指向的地址:0x00611FE6
这是我必须发送回 uC/Probe 的号码。这种计算只需要在 uC/Probe 请求指针时进行,对于非指针,它只需要发回从给定地址读取的数据。这就是为什么我需要知道请求的数据是否是指针,希望有人可以帮助我。