Должен ли я отключать прерывания при выполнении кода из ОЗУ?

#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();
}