получить значение из оперативной памяти, когда адрес оперативной памяти хранится как u32 - PullRequest
0 голосов
/ 05 июля 2018

У меня проблема с получением значения по адресу оперативной памяти.

У меня есть некоторые ограничения, т. Е. Это должен быть код C, а адрес хранимой информации задается значением u32, например 0x001c0080.

Среда предназначена для ARM, и я использую eclipse sdk. Как я могу получить данные с этого адреса? У меня есть функция, которую нельзя изменить как:

u32 get_data(u32 address, u16 *status)
{
    ......
    u32 return_value ; 
    char cbuf[128];
    return_value= ?????   address ?????;
    sprintf(cbuf,"\tA:%x->%x",(int)address,(int)return_value);
    print (cbuf);
    return return_value; //here the u32 data stored in ram on address should be returned
}

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вы можете преобразовать адрес в указатель.

    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 не имеет значения.

0 голосов
/ 05 июля 2018

проблема решена, u32 * ptr = (u32 *) адрес; return_value = * ptr; отлично работает.

0 голосов
/ 05 июля 2018

Вы можете "typecast" u32 address в указатель нужного типа:

char *ptr = (char *)address;
sprint(cbuf, "\tC:%c", *ptr);

Или

u32 *ptr = (u32 *)address;
return_value = *ptr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...