Как я выполняю функцию от RAM на Коре-M3 (STM32)?

Я пытаюсь выполнить функцию от RAM на процессоре (STM32) Cortex-M3. Функция стирает и переписывает внутреннюю флэш-память, таким образом, я определенно должен быть в RAM, но как я делаю это?

То, что я попробовал, является этим: Скопируйте функцию в массив байтов в RAM с помощью memcpy (проверяющий, что это выравнивается правильно), устанавливая указатель функции для указания на массив байтов на затем вызов функция (указатель).

Это хорошо работает для, возможно, 10 инструкций (я могу следовать за выполнением с отладчиком), но затем я получаю ошибку шины и сброс процессора. Ошибка шины происходит на второй передаче через цикл, таким образом, код должен быть прекрасным (поскольку это работает первичная обработка). Я думаю, что более быстрый доступ RAM пачкает шину, синхронизирующую в некотором роде...

Так или иначе существует ли корректный способ сделать это? Как точечный файл был бы похож, который помещает функцию в RAM автоматически (я использую Keil uVision для Коры-M3)?

Править: Подробнее: Набор инструментальных средств: компилятор V 4.10 MDK-ARM RealView: Ассемблер Armcc v4.0.0.728: компоновщик Armasm v4.0.0.728: процессор ArmLink v4.0.0.728: STM32F103ZE

IMPRECISERR укусил, установлен в регистре отказа шины, когда сброс происходит.

7
задан Chris 3 May 2014 в 00:19
поделиться

2 ответа

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

Я считаю, что вы можете пометить функцию, которая будет правильно скомпилирована и скопирована в ОЗУ с помощью CARM, добавив __ ram директива к определению функции. Инструкции о том, как сделать то же самое с компилятором RealView, см. В статье технической поддержки ВЫПОЛНЕНИЕ ФУНКЦИЙ В ОЗУ :

µVision позволяет находить модули к определенным областям памяти, которые введен в диалоге Проект - Параметры - Цель . Для этого правильно щелкните исходный файл (или группу файлов) и откройте диалоговое окно Параметры - Свойства . Затем выберите память области под Назначение памяти .

Пример находится в папке ARMExamplesRAM_Function .

Это должно сгенерировать код запуска, который позаботится о копировании функции в ОЗУ и правильной привязке вызовов к этому месту. В противном случае, если вам нужно динамически копировать произвольные функции в ОЗУ, изучите возможность компиляции позиционно-независимого кода (PIC) с помощью RealView.

7
ответ дан 6 December 2019 в 21:10
поделиться

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

2
ответ дан 6 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: