找出特定地址上的对象是否是指针

时间:2018-03-14 11:31:05

标签: c pointers micrium infineon

我有一个通过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请求指针时发生,对于非指针,它只需要发回从给定地址读取的数据。 这就是为什么我需要知道所请求的数据是否是一个指针,希望有人可以帮助我。

0 个答案:

没有答案