Узнайте, является ли объект по определенному адресу указателем
У меня есть программа для ПК, которая обменивается данными через соединение 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 запрашивает указатели, для не указателей ему просто нужно отправить обратно данные, считанные с данного адреса. Вот почему мне нужно знать, является ли запрашиваемые данные указателем, надеюсь, кто-то может мне помочь с этим.