Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 找出特定地址上的对象是否为指针_C_Pointers_Micrium_Infineon - Fatal编程技术网

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

C 找出特定地址上的对象是否为指针,c,pointers,micrium,infineon,C,Pointers,Micrium,Infineon,我有一个PC程序,它通过TCP/IP连接与嵌入式板(Infineon XE169(C166系列))通信 此PC程序请求在特定地址上存储哪些数据。 PC程序是uC/Probe,我无法更改此程序的工作方式 例如,uC/Probe发送以下消息: ____________________________________________________________________________________________________________ | Prefix

我有一个PC程序,它通过TCP/IP连接与嵌入式板(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\u t、uint8\u t、char或对我来说不重要的任何东西

背景信息,我为什么想知道这个

嵌入式电路板将请求的数据发送回uC/Probe程序。但是指针以一种奇怪的方式存储在XE169芯片中。 例如,上面示例的指针存储如下:

 _______________________________________
| Address   |  0   |   1  |  2   |  3   |
|-----------|------|------|------|------|
|0x00613EDC | 0xE6 | 0x1F | 0x84 | 0x01 |
|___________|______|______|______|______|
由于值的存储为小endian,因此会产生数字 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请求指针时发生,对于非指针,它只需要发送回从给定地址读取的数据。
这就是为什么我需要知道请求的数据是否是指针,希望有人能帮我解决这个问题

͏+͏1͏,唉,虽然没有便携的方式来判断(我会选择内联汇编)。任何解决方案都取决于编译器和体系结构。你能用简单的术语指定吗?这个.map文件是可读的ASCII码?然后你可以编写一个小的C程序来解析它,并将与你相关的信息存储在一个数据结构中,你可以用它来分析你从电路板上得到的数据。“我们必须把这个32位的数字拆分成2个16位的数字。现在16位的高位必须向右移动2位。”这称为段偏移寻址。(这几天我们为Intels 8086编程时,我对这个做了很多修改。)我发现了一个与此相关的Q/a:。只是为了你的利益……恐怕你是在倒退。uC/Probe了解图像布局和数据类型。查看
格式
字段,并相应地设置回复的格式。@Bathsheba太糟糕了,没有一种可移植的方法来解决这个问题。用简单的术语指定编译器和体系结构设置的确切含义是什么?该芯片是C166系列之一。不确定这是否是您的意思,但这是我的编译器选项: