Невозможно выделить память на встроенном устройстве - PullRequest
1 голос
/ 12 марта 2019

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

Это код, выполнение которого я нахожу слегка озадачивающим:

    uint8_t * buffer;  // pointer to buffer                           
    uint8_t * buffer1; // pointer to buffer1 
    uint8_t * buffer2; // pointer to buffer2 

    buffer  = malloc(400 * sizeof(uint8_t));    // size of buffer
    buffer1 = malloc(400 * sizeof(uint8_t));    // size of buffer1
    buffer2 = malloc(400 * sizeof(uint8_t));    // size of buffer2  

Это контрольные окна для значений указателей в начале выполнения отладки.

enter image description here

После выполнения до точки останова, расположенной после конца приведенного выше фрагмента кода.

enter image description here

При пошаговом использовании отладчика после строк malloc я вижу, что в первой строке будет выделен адрес для указателя buffer. Это будет сделано только для buffer, но не для buffer1 или buffer2.

Это верно при изменении порядка выделения памяти, как показано в коде ниже:

    uint8_t * buffer;  // pointer to buffer                           
    uint8_t * buffer1; // pointer to buffer1 
    uint8_t * buffer2; // pointer to buffer2 

    buffer1 = malloc(400 * sizeof(uint8_t));    // size of buffer
    buffer  = malloc(400 * sizeof(uint8_t));    // size of buffer1
    buffer2 = malloc(400 * sizeof(uint8_t));    // size of buffer2  

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

enter image description here

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

    uint8_t * buffer;  // pointer to buffer
    uint8_t * buffer1; // pointer to buffer1 
    uint8_t * buffer2; // pointer to buffer2 

    buffer1 = malloc(400 * sizeof(uint8_t));    // size of buffer1
    buffer  = malloc(400 * sizeof(uint8_t));    // size of buffer
    buffer1 = malloc(400 * sizeof(uint8_t));    // size of buffer1  

Код падает ниже по строке, когда assert () выполняется для пустого значения указателя, когда инициализируется структура с одним из буферов.

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

Хотя я не новичок в вещах, связанных с указателями / памятью, это удивляет меня чаще, чем нет. Я предполагаю, что я совершенно не понимаю, как распределяется память (или нет) или как окна отладчика и окна наблюдения обновляют значения указателя.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 12 марта 2019

При использовании предоставленного шаблона проекта в Keil ARM-MDK выделенный размер кучи обычно довольно мал. Вам необходимо установить его размер для вашего приложения.

Ваш проект будет включать в себя код ассемблера для запуска, называемый startup_stm32xxxxx.s (где xxxxx относится к конкретной части). Этот файл содержит комментарии разметки, которые распознаются редактором uVision, поэтому при открытии файла окна редактора будут иметь две вкладки внизу - одну для источника и одну для конфигурации. Вы можете изменить размер стека и кучи через любой.

Пример ниже (для части, отличной от вашей, поэтому параметры могут отличаться, но по крайней мере будут присутствовать стек и куча): enter image description here

...