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

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

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

Сообщение Eugene! » 25 июл 2022, 14:35

Здравствуйте!

Я осваиваю К1921ВК01Т, пользуясь вашими примерами, и у меня возникли вопросы по работе с памятью.

Во всех примерах происходит "Копирование некоторых функций и всех прерываний в RAM" (цитата из комментария к коду) с помощью memcpy.
Это делается независимо от того, какой режим выбран в build.ld.

И тут возникает вопрос:

Если мы выбрали INCLUDE niiet_ram.ld и поставили галку "Debug in RAM", то мы ведь и так работаем в оперативке, зачем что-то из флэши копировать? И что куда копируется в этом случае реально?

Второй вопрос, если мы таки запускаемся из флэш, и копируем таблицу прерываний ОЗУ, то как после этого копирования контроллер понимает, что таблица прерываний переместилась и её надо читать из ОЗУ?

Третий вопрос -- что значит в этом комментарии - "некоторых функций"? Как и где определяется то, какие функции будут скопированы, а какие нет, и как контроллер понимает -- в какой памяти по какому адресу какая функция лежит после этого?

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

Аватара пользователя
Лашкевич Максим
Сообщения: 342
Зарегистрирован: 30 дек 2015, 10:38

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

Сообщение Лашкевич Максим » 26 июл 2022, 11:30

1. В оперативку помещаются только простейшие примеры типа миганием светодиодом. Motorcontroldemo не помещается. Если проект и так размещен в оперативке, то, конечно, лишний раз ничего копировать в оперативку не надо.
2. Где расположена таблица прерываний задается в регистре SCB->VTOR, который присваивается указателю на g_pfnVectors, который указывает на таблицу в секции isr_vector (справедливо для motorcontroldemo).
3. Какие функции будут перенесены в оперативку задается атрибутами перед функцией, тогда она помещается в секцию памяти fastcode

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

#if defined (__GNUC__)
__attribute__((section(".fastcode")))
#endif
для этой секции в файле build.ld прописаны специальные правила.

И главное - для K1921BK01T выполнение из оперативки не даёт выигрыша по скорости, так что ничего в оперативку помещать не надо. Мы это делали по привычке от микроконтроллеров тексаса, где это действие ускоряет выполнение.
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

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

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

Сообщение Eugene! » 26 июл 2022, 11:58

Лашкевич Максим писал(а):
26 июл 2022, 11:30
1. В оперативку помещаются только простейшие примеры типа миганием светодиодом. Motorcontroldemo не помещается. Если проект и так размещен в оперативке, то, конечно, лишний раз ничего копировать в оперативку не надо.
2. Где расположена таблица прерываний задается в регистре SCB->VTOR, который присваивается указателю на g_pfnVectors, который указывает на таблицу в секции isr_vector (справедливо для motorcontroldemo).
В blinky кстати memcpy есть, а переназначения g_pfnVectors нету.
Лашкевич Максим писал(а):
26 июл 2022, 11:30
3. Какие функции будут перенесены в оперативку задается атрибутами перед функцией, тогда она помещается в секцию памяти fastcode

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

#if defined (__GNUC__)
__attribute__((section(".fastcode")))
#endif
для этой секции в файле build.ld прописаны специальные правила.

И главное - для K1921BK01T выполнение из оперативки не даёт выигрыша по скорости, так что ничего в оперативку помещать не надо. Мы это делали по привычке от микроконтроллеров тексаса, где это действие ускоряет выполнение.
То есть эти memcpy в начале main можно просто удалить и ничего не поменяется?
Или если удалить копирование векторов в оперативку, то и регистр SCB->VTOR и g_pfnVectors надо переинициализировать?
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.

Аватара пользователя
Лашкевич Максим
Сообщения: 342
Зарегистрирован: 30 дек 2015, 10:38

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

Сообщение Лашкевич Максим » 26 июл 2022, 13:00

Копирование fastcode можно удалить, если нет функций в проекте с этой секцией, а с g_pfnVectors надо разбираться, как аккуратно выкорчевать (если это очень надо).
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

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

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

Сообщение Eugene! » 26 июл 2022, 13:50

Лашкевич Максим писал(а):
26 июл 2022, 13:00
Копирование fastcode можно удалить, если нет функций в проекте с этой секцией, а с g_pfnVectors надо разбираться, как аккуратно выкорчевать (если это очень надо).
Я про таблицу прерываний, не про функции. Если таблицу прерываний не переносить в ОЗУ, что что должно быть в SCB->VTOR и g_pfnVectors?
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.

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

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

Сообщение Disona » 26 июл 2022, 16:49

Eugene! писал(а):
26 июл 2022, 11:58
То есть эти memcpy в начале main можно просто удалить и ничего не поменяется?
Или если удалить копирование векторов в оперативку, то и регистр SCB->VTOR и g_pfnVectors надо переинициализировать?
Если вы удалите копирование таблицы векторов из Flash в RAM, тогда в sm_sys.init() вам нужно закомментить присваивание "SCB->VTOR". По умолчанию этот регистр указывает на адрес 0х00000000, где и лежит таблица векторов.
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.

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

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

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

Я взял пример с bitbucket, который называется "K1921VK01T_Timer".
Он был настроен на работу из RAM (INCLUDE niiet_ram.ld в build.ld и Debug in RAM в Startup).
Я закомментил в нём копирование в рам:
//копируем функции секции fastcode из флеша в оперативку
//memcpy(&__fastcode_ram_start, &__fastcode_flash_start,((Uint32)(&__fastcode_ram_end) - (Uint32)(&__fastcode_ram_start)));
//копируем таблицу векторов прерываний isr_vector из флеша в оперативку, чтобы быстрее работало
//memcpy(&__isr_vector_ram_start, &__isr_vector_flash_start,((Uint32)(&__isr_vector_ram_end) - (Uint32)(&__isr_vector_ram_start)));
и всё окей работало.

Но после того, как я переключил на INCLUDE niiet_flash.ld в build.ld и снял галку Debug in RAM в Startup - у меня всё стало вылетать с ошибкой:
"Break at address "0xc9a4" with no debug information available, or outside of program code."
закомментированы или раскомментированы memcpy -- одинаково не работает.

Хотя в этом проекте (в отличии от проекта с векторным управлением) g_pfnVectors нигде не инициализируется.

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

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

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

Сообщение Disona » 27 июл 2022, 09:59

Eugene! писал(а):
27 июл 2022, 09:45

Но после того, как я переключил на INCLUDE niiet_flash.ld в build.ld и снял галку Debug in RAM в Startup - у меня всё стало вылетать с ошибкой:
"Break at address "0xc9a4" with no debug information available, or outside of program code."
закомментированы или раскомментированы memcpy -- одинаково не работает.
Если я правильно помню, галочку "Debug in RAM" мы всегда оставляем.
Eugene! писал(а):
27 июл 2022, 09:45
Хотя в этом проекте (в отличии от проекта с векторным управлением) g_pfnVectors нигде не инициализируется.
А это, возможно, бага. Проверим.
Eugene! писал(а):
27 июл 2022, 09:45
Как заставить запускаться из флеша? Ну, чтобы после ресета программа запускалась сама, без прошивки.
Вы имеете в виду без подключенного JTAG-а, просто на столе? По идее при выборе "Debug in FLASH" должна запускаться. Проверим.
Но если вы имеете в виду с JTAG-ом - то есть просто ресетнуть прогу, без перепрошивки - то так, к сожалению, нельзя сделать "по-простому".

Да, кстати, а вы на чём отлаживаетесь? Свой контроллер?

И ещё - что это за проект "...Timer" на BitBucket? Я что-то там такого не нашёл.
У нас есть такой в примерах со средой VectorIDE, но там инит g_pfnVectors есть.
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.

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

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

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

Но в файле build.ld есть камент:
______________________________________
/* После изменения конфигурации нужно поменять галочку Debug in RAM
во вкладке Startup окна Debug Configurations, а также дать команду на
пересборку проекта */

/*INCLUDE niiet_ram.ld*/
INCLUDE niiet_flash.ld
______________________________________
Я имею в виду, что я прошил во флеш и вышел из отладки -- а программа продолжает работать. И с отключенным отладчиком после перезапуска стартует. Без JTAG-а. Просто зашить один раз и чтобы всегда работало, как это обычно и делается в готовом устройстве
______________________________________
Прошу прощения, пример timer не на BitBucket, а очевидно установился со средой Vector IDE, скачанной тут https://motorcontrol.ru/production/soft/vector-ide/
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.

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

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

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

Eugene! писал(а):
27 июл 2022, 10:27
Но в файле build.ld есть камент:
______________________________________
/* После изменения конфигурации нужно поменять галочку Debug in RAM
во вкладке Startup окна Debug Configurations, а также дать команду на
пересборку проекта */

/*INCLUDE niiet_ram.ld*/
INCLUDE niiet_flash.ld
______________________________________
Я имею в виду, что я прошил во флеш и вышел из отладки -- а программа продолжает работать. И с отключенным отладчиком после перезапуска стартует. Без JTAG-а. Просто зашить один раз и чтобы всегда работало, как это обычно и делается в готовом устройстве
______________________________________
Прошу прощения, пример timer не на BitBucket, а очевидно установился со средой Vector IDE, скачанной тут https://motorcontrol.ru/production/soft/vector-ide/
Понял. Сейчас проверю проект.
Кстати g_pfnVectors там инитится в функции "void Timer_and_interrupt_init ()".
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.

Ответить