Читать память в C - PullRequest
       2

Читать память в C

1 голос
/ 03 июля 2019

Я работаю на микроконтроллере и хочу прочитать содержимое памяти после выполнения кода.Я знаю адрес памяти для чтения и размер, который я пробовал этим методом:

    const volatile unsigned char *const mem_start = 0xd0000000;

    #define size ((ptrdiff_t)0x1c000)

    unsigned char buff[size];
    ptrdiff_t j;

    for(j =0 ; j< sizeof(buff) ; j++)
    buff[i]= *(mem_start + j);

Я ищу другой способ чтения памяти, не копируя ее в буфер, в ту же память, которую я хочучтобы прочитать это, рискуйте сокрушить то, что я ищу.и что бафф может перекрываться из-за недостатка места

Ответы [ 3 ]

4 голосов
/ 03 июля 2019

В заявлении

...= *(mem_start + j);

Вы читаете память. Так что еще ты хочешь?


Кстати, почему вы не использовали

mem_start[j]; ??
2 голосов
/ 03 июля 2019

Вы можете выделить память с malloc() или, как у вас, в стеке. Между двумя нет совпадений. memmove() может использоваться, если у вас есть перекрытие между источником и назначением; в противном случае memcpy() будет достаточно.

0 голосов
/ 03 июля 2019

Выражение:

*(mem_start + j)

или более обычное

mem_start[j]

является операцией «чтения», когда она используется, скажем, направая часть присваивания или как параметр в вызове функции.

Итак, вместо вашей собственной строки кода:

buff[j] = *(mem_start + j);    // I'm assuming 'buff[i]' was a typo

, которая считывает из одной ячейки памяти в другую,Вы можете сделать что-то вроде:

printf("%hhx", mem_start[j]);

, который будет считывать байт из mem_start со смещением j и выводить его в stdout как шестнадцатеричное представление значения байта.Поместите это в цикл (как у вас уже есть), и вы будете эффективно читать из памяти, без копирования того, что вы читаете, во второй буфер.

На основании некоторых ваших комментариев,Я предполагаю, что отображение содержимого памяти на экране будет соответствовать вашим потребностям.И исходя из того, что вы говорите, память, которую вы хотите отобразить, будет, я предполагаю, что шестнадцатеричный вывод подходит.Но есть и другие варианты, такие как чтение из исходного буфера памяти в файл или вывод необработанных байтовых значений (вместо представления этих значений) и т. Д.

Обратите внимание, что не каждая комбинация ввода и выводаполезно, хотя.Вывод необработанных байтовых значений на экран терминала может привести к менее чем полезным результатам, и в зависимости от того, что вы хотите делать с считанными данными, файл, заполненный шестнадцатеричным представлением исходных байтов, также может оказаться бесполезным.Выберите выходной пункт назначения и выходной формат в соответствии с вашими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...