Вы можете преобразовать адрес в указатель.
return_value = *(u32 *) address;
Кроме того, рекомендуется использовать <stdint.h>
вместо пользовательских типов. Ваш код может выглядеть так:
#include <stdint.h>
#include <stdio.h>
uint32_t get_data(uint32_t address, uint16_t *status)
{
// …
uint32_t return_value;
char cbuf[128];
return_value = *(uint32_t *) address;
sprintf(cbuf, "\tA:%x->%x", (int) address, (int) return_value);
printf(cbuf);
return return_value;
}
Будьте осторожны! Рано или поздно ваш проект может перейти на 64-битный процессор. Ваш код не будет переносимым. Передача адресов в виде целых чисел вместо указателей - плохая идея, и еще хуже, если принять размер указателя. Вы должны проверить среду вызова вашей функции get_data()
, чтобы убедиться, что адрес может быть передан как указатель. Если адрес должен быть передан как целочисленное значение, а не как указатель, используйте вместо него uintptr_t
, он автоматически будет иметь правильный размер.
Кроме того, ваш формат не должен требовать приведения. Вы можете использовать форматы <inttypes.h>
, чтобы избежать приведения аргументов форматной строки.
Скажем, ваш абонент call_get_data
, а адрес 0x001c0080
исходит из макроса в заголовочном файле.
#include <foo.h> // Header which defines ADDRESS to be 0x001c0080 via #define ADDRESS 0x001c0080
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
uint32_t get_data(uint32_t *address, uint16_t *status)
{
// …
uint32_t return_value;
char cbuf[128];
return_value = *address;
sprintf(cbuf, "\tA:" PRIxPTR "->" PRIx32, address, return_value);
printf(cbuf);
return return_value;
}
void call_get_data(void)
{
uint32_t addressValue = ADDRESS;
uint32_t *address = (uint32_t *) addressValue;
// …
uint32_t returnValue = get_data(address, /* … */);
// …
}
Примечание. Среда для ARM и использование Eclipse SDK не имеет значения.