Узнайте, является ли объект по определенному адресу указателем

У меня есть программа для ПК, которая обменивается данными через соединение TCP/IP со встроенной платой (Infineon XE169 (семейство C166)).

Эта программа ПК запрашивает, какие данные хранятся по определенному адресу. Программа для ПК - это 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 бита вправо. 2 младших значащих бита этих старших 16 бит становятся 2 старшими значащими младшими 16 битами.

Это приводит к:

Hex:  0x0061             and 0x1FE6
Bits: 0b0000000001100001 and 0001111111100110

Когда мы вставляем эти 2 16-битных числа обратно в 32-битное число, у нас есть адрес, на который указывает указатель: 0x00611FE6

И это номер, который я должен отправить обратно в UC/Probe. Это вычисление должно происходить только тогда, когда uC / Probe запрашивает указатели, для не указателей ему просто нужно отправить обратно данные, считанные с данного адреса. Вот почему мне нужно знать, является ли запрашиваемые данные указателем, надеюсь, кто-то может мне помочь с этим.

0 ответов

Другие вопросы по тегам