3

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

4

0 回答 0