Копирование исполняемого кода из флэша в ОЗУ

Встраиваемые микроконтроллеры для систем управления приводом и автоматизации
Аватара пользователя
Eugene!
Сообщения: 25
Зарегистрирован: 18 июл 2022, 12:42
Откуда: Питер

Re: Копирование исполняемого кода из флэша в ОЗУ

Сообщение Eugene! » 27 июл 2022, 10:37

Disona писал(а):
27 июл 2022, 09:59
Если я правильно помню, галочку "Debug in RAM" мы всегда оставляем.
Тогда работает. Но только при условии копирования в память.
Если закомментить memcpy то не работает.
Пишет:
Break at address "0x1000" with no debug information available, or outside of program code.

Как сделать чтоб работало без копирования памяти?

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

Аватара пользователя
Eugene!
Сообщения: 25
Зарегистрирован: 18 июл 2022, 12:42
Откуда: Питер

Re: Копирование исполняемого кода из флэша в ОЗУ

Сообщение Eugene! » 27 июл 2022, 10:40

Ой, нашёл, наверное вот это надо закаментить: SCB->VTOR = (uint32_t)(&g_pfnVectors);//Sets the vector table location and Offset.|

Теперь всё работает.

Но не очень понятно, почему вектор устанавливается в инициализации таймера...
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.

Аватара пользователя
Disona
Сообщения: 92
Зарегистрирован: 28 ноя 2015, 22:03
Откуда: Москва

Re: Копирование исполняемого кода из флэша в ОЗУ

Сообщение Disona » 27 июл 2022, 10:48

Eugene! писал(а):
27 июл 2022, 10:40
Ой, нашёл, наверное вот это надо закаментить: SCB->VTOR = (uint32_t)(&g_pfnVectors);//Sets the vector table location and Offset.
Да, можно так.
Я посмотрел проект, а именно ld-файлы линкера.
Они у нас сделаны так, что независимо от того, какую конфигурацию вы выбираете, таблица векторов во время работы программы всё равно размещается линкером в RAM.
То есть она записывается во Flash, но программа предполагает, что в ините эта таблица будет скопирована в RAM.
Поэтому тут три варианта:
1. Оставить memcpy(), который копирует таблицу векторов.
2. Убрать инит VTOR (нежелательный вариант)
3. Исправить скрипт линкера, убрав оттуда размещение таблицы в RAM:

Надо исправить последнюю строчку в этом блоке:

Код: Выделить всё

  .isr_vector :
  {
    . = ALIGN(4); /* выравнивание по 4 байта */
    __isr_vector_flash_start = LOADADDR (.isr_vector); /* Берем адрес, где на флеше лежит эта таблица */
    __isr_vector_ram_start = .;
    KEEP(*(.isr_vector)) /* Startup code - KEEP запрещает удалить секцию сборщику мусора */
    . = ALIGN(4);
    __isr_vector_ram_end = .; /* конец оперативки, куда будет скопирован код */
  } >RAM AT>FLASH
Вместо ">RAM AT>FLASH" написать ">FLASH":

Код: Выделить всё

  .isr_vector :
  {
    . = ALIGN(4); /* выравнивание по 4 байта */
    __isr_vector_flash_start = LOADADDR (.isr_vector); /* Берем адрес, где на флеше лежит эта таблица */
    __isr_vector_ram_start = .;
    KEEP(*(.isr_vector)) /* Startup code - KEEP запрещает удалить секцию сборщику мусора */
    . = ALIGN(4);
    __isr_vector_ram_end = .; /* конец оперативки, куда будет скопирован код */
  } >FLASH
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.

Аватара пользователя
Disona
Сообщения: 92
Зарегистрирован: 28 ноя 2015, 22:03
Откуда: Москва

Re: Копирование исполняемого кода из флэша в ОЗУ

Сообщение Disona » 27 июл 2022, 10:49

Eugene! писал(а):
27 июл 2022, 10:40
Но не очень понятно, почему вектор устанавливается в инициализации таймера...
Ну можно, например, сказать, что раз функция называется "Timer_and_INTERRUPT_init", то почему бы в ней не настроить и всё, что касается прерываний.
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.

Аватара пользователя
Eugene!
Сообщения: 25
Зарегистрирован: 18 июл 2022, 12:42
Откуда: Питер

Re: Копирование исполняемого кода из флэша в ОЗУ

Сообщение Eugene! » 20 сен 2022, 10:44

Лашкевич Максим писал(а):
26 июл 2022, 11:30
И главное - для K1921BK01T выполнение из оперативки не даёт выигрыша по скорости, так что ничего в оперативку помещать не надо. Мы это делали по привычке от микроконтроллеров тексаса, где это действие ускоряет выполнение.
К сожалению оказалось, что всё-таки надо.
В документе errata_K1921VK01T_170419.pdf пункт 4 гласит, что:

_____________________________________________
4. Операции с внутренней flash
Описание
При попытке записи или стирания внутренней flash из кода во флэш происходит сбой на
системной шине.
Условия
Исполнение кода из внутренней flash.
Последствия
Сбой работы микроконтроллера, переход в неопределенное состояние.
Рекомендации и способы обхода
Не совершать операции с внутренней flash во время выполнения из нее кода.
Модификация flash возможна лишь при исполнения кода из внутренней RAM или из
внешней памяти при загрузке с внешней памяти.
_____________________________________________

То есть, если я хочу хранить какие-то параметры в определённой области флеша, то те процедуры, которые выполняют чтение и запись этих параметров во флеш, я должен поместить в RAM, я правильно понял?
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.

Аватара пользователя
Disona
Сообщения: 92
Зарегистрирован: 28 ноя 2015, 22:03
Откуда: Москва

Re: Копирование исполняемого кода из флэша в ОЗУ

Сообщение Disona » 20 сен 2022, 10:53

Eugene! писал(а):
20 сен 2022, 10:44
Лашкевич Максим писал(а):
26 июл 2022, 11:30
И главное - для K1921BK01T выполнение из оперативки не даёт выигрыша по скорости, так что ничего в оперативку помещать не надо. Мы это делали по привычке от микроконтроллеров тексаса, где это действие ускоряет выполнение.
К сожалению оказалось, что всё-таки надо.
В документе errata_K1921VK01T_170419.pdf пункт 4 гласит, что:

_____________________________________________
4. Операции с внутренней flash
Описание
При попытке записи или стирания внутренней flash из кода во флэш происходит сбой на
системной шине.
Условия
Исполнение кода из внутренней flash.
Последствия
Сбой работы микроконтроллера, переход в неопределенное состояние.
Рекомендации и способы обхода
Не совершать операции с внутренней flash во время выполнения из нее кода.
Модификация flash возможна лишь при исполнения кода из внутренней RAM или из
внешней памяти при загрузке с внешней памяти.
_____________________________________________

То есть, если я хочу хранить какие-то параметры в определённой области флеша, то те процедуры, которые выполняют чтение и запись этих параметров во флеш, я должен поместить в RAM, я правильно понял?
Ну такое вполне возможно, но мы обычно храним параметры в пользовательской флеш.
Она как раз для этого и предназначена - там маленькие страницы (по 256 байт, кажется), что позволяет меньше расходовать ресурс флешки при частом изменении параметров, так как (практически) при любом изменении данных потребуется полностью стереть страницу.

Но отвечая конкретно на ваш вопрос - да, видимо придётся эти функции размещать в RAM. Кроме того, на время этих операций нужно будет блокировать прерывания, если их код лежит во флеше.
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.

Аватара пользователя
Eugene!
Сообщения: 25
Зарегистрирован: 18 июл 2022, 12:42
Откуда: Питер

Re: Копирование исполняемого кода из флэша в ОЗУ

Сообщение Eugene! » 20 сен 2022, 11:17

Disona писал(а):
20 сен 2022, 10:53
Ну такое вполне возможно, но мы обычно храним параметры в пользовательской флеш.
Она как раз для этого и предназначена - там маленькие страницы (по 256 байт, кажется), что позволяет меньше расходовать ресурс флешки при частом изменении параметров, так как (практически) при любом изменении данных потребуется полностью стереть страницу.
А эта "пользовательская флеш" может читаться и писаться при работе программы из обычной флеш-памяти? То есть чтобы её использовать, то не надо код в RAM копировать, можно просто туда писать?

Это у вас реализовано в V_UserMemory, да?

Спасибо, почитаем )
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.

Аватара пользователя
Disona
Сообщения: 92
Зарегистрирован: 28 ноя 2015, 22:03
Откуда: Москва

Re: Копирование исполняемого кода из флэша в ОЗУ

Сообщение Disona » 20 сен 2022, 11:18

Eugene! писал(а):
20 сен 2022, 11:17
А эта "пользовательская флеш" может читаться и писаться при работе программы из обычной флеш-памяти? То есть чтобы её использовать, то не надо код в RAM копировать, можно просто туда писать?

Это у вас реализовано в V_UserMemory, да?

Спасибо, почитаем )
Да, да и да.
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.

Ответить