#c #ram
#c #ОЗУ
Вопрос:
Я создаю функцию обновления, которая полностью стирает мой программный код, который заканчивается из программы flash, и на его месте появляется новое изображение. Для этого необходимо скопировать функцию обновления в ОЗУ и перейти к ней в ее расположении в ОЗУ для выполнения фактических функций стирания / программирования.
void update(){
//Erase flash
//Program flash
}
void main(){
// ...
ramfunction = copytoram((int)update);
ramfunction();
}
Мне кажется, что этот процесс должен работать, но по какой-то причине, когда я его запускаю, он терпит неудачу. Кажется, я могу пройти через это с помощью отладчика, но при запуске он терпит неудачу.
Должен ли я защищать ramfunction();
, возможно, отключая прерывания? У меня есть другие задачи, выполняемые в фоновом режиме. Есть ли какие-либо другие возможные проблемы?
Большое спасибо!
Редактировать — Все остальные задачи выполняются из flash. Функция обновления также связана с запуском из flash, но я могу успешно скопировать ее в ОЗУ и перейти к ней. Я даже могу пройти через это (по крайней мере, код дизассемблирования), только когда я прогоняю его, у меня возникают проблемы.
Комментарии:
1. Я нахожу это очень интересным вопросом, хотя он может быть закрыт, потому что он довольно широкий.
2. @xxbbcc: предполагая, что будут добавлены необходимые детали, это все равно не будет применимо в целом. Для этой темы слишком много переменных.
3. Что я могу вам предоставить, чтобы сделать его более конкретным?
4. Выполняются ли другие задачи из flash? Переносят ли прерывания вектор в код во флэш-памяти? Является ли функция обновления независимой от положения или она была связана с запуском из ОЗУ, даже если она была загружена во флэш-памяти? Использует ли функция обновления (или любая другая задача) какие-либо константы, хранящиеся во flash? Это многоядерный процессор, где отключение прерываний не остановит задачи на других ядрах?
5. Да, все остальные задачи выполняются из flash. Функция обновления также связана с запуском из flash, но я могу успешно скопировать ее в ОЗУ и перейти к ней. Я даже могу пройти через это (по крайней мере, код дизассемблирования), только когда я прогоняю его, у меня возникают проблемы.
Ответ №1:
Если у вас одновременно выполняются другие задачи, возможно, они прерывают фазу программирования ramfunction. Это может привести к катастрофическому сбою. Я бы попробовал что-то вроде этого:
void main(){
// ...
ramfunction = copytoram((int)update);
disable_interrupts();
ramfunction();
enable_interrupts();
}