Считывание данных из памяти

#c #exception #pointers

#c #исключение #указатели

Вопрос:

У меня есть API для чтения данных:

ROM_READ_PAGE(BLOCK_NO, PAGE_NO, *READ_BUFFER);

Размер страницы равен 2048, и вы можете прочитать ТОЛЬКО ВСЮ страницу за раз.

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

Например:

 char *readPtr;
char readBuff[128]; //(Can not use 2048 due to stack overflow)

readPtr = readBuff;

ROM_READ_PAGE(BLOCK_NO, PAGE_NO, readPtr); // SMX doesn't like this and shows some exception
  

Любая другая идея или я упускаю что-то важное.

Комментарии:

1. Рекомендуется добавить исключение к вашему сообщению.

2. Можете ли вы вместо этого выделить память в куче (с помощью malloc )? Вы сами сказали, что размер страницы равен 2048, и вам нужно прочитать всю страницу сразу.

3. @pmg // SMX это не нравится, и он показывает какое-то исключение., не забудьте прокрутить вправо 🙂

4. При написанном коде C не гарантирует, что вы получите какой-либо хороший результат ошибки. У ROM_READ_PAGE нет возможности узнать, что readPtr не указывает на достаточное количество памяти — он скопирует кучу байтов по всему вашему стеку (и, по-видимому, мимо него).

5. @Joe: Ах! Я вижу 🙂 @Punit: C не имеет исключений. Возможно, SMX скомпилирован с помощью C компилятора?

Ответ №1:

Если ваш стек не может быть 2048, это не означает, что вы освобождены от предоставления блока размером 2048 байт

 char *readPtr = malloc(2048);
ROM_READ_PAGE(BLOCK_NO, PAGE_NO, readPtr);
// do whatever you need
free(readPtr);
  

Комментарии:

1. Не приводите возвращаемое значение malloc() в C.

2. Итак, я никак не могу избежать чтения меньше 2048? Это встроенная система, поэтому хотелось избежать динамической памяти. Тем не менее, это работает.

3. @размотка завершена. Сначала я делал это таким образом, затем изменил его. Вы можете редактировать ответы, чтобы сделать их лучше.

4. @Punit — Ваше описание ROM_READ_PAGE и его параметры не допускают частичного чтения. Есть ли в документации другие вызовы API, которые выполняют частичное чтение? Поиск в Google по запросу ROM_READ_PAGE ничего не дает, и я никогда об этом не слышал.

Ответ №2:

Вы можете динамически распределять буфер и избегать переполнения стека. вам также нужно будет освободить буфер

 char *readBuff;
readBuff = (char *) malloc(2048);
free(readBuff);
  

Комментарии:

1. Не приводите возвращаемое значение malloc() в C.

Ответ №3:

Не используйте стек. Если ваш компилятор использует стек для автоматических переменных, вы можете либо изменить способ работы вашего компилятора с автоматическими переменными (маловероятно), либо использовать какой-либо другой тип переменной.

Обычно компиляторы помещают статические переменные хранилища в область, отличную от автоматических переменных. Возможно, вы захотите попробовать это.

Или попробуйте динамическое выделение памяти.