我有一个通过TCP / IP连接与嵌入式板通信的PC程序(Infineon 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请求指针时发生,对于非指针,它只需要发回从给定地址读取的数据。 这就是为什么我需要知道所请求的数据是否是一个指针,希望有人可以帮助我。