Копирование исполняемого кода из флэша в ОЗУ
Копирование исполняемого кода из флэша в ОЗУ
Здравствуйте!
Я осваиваю К1921ВК01Т, пользуясь вашими примерами, и у меня возникли вопросы по работе с памятью.
Во всех примерах происходит "Копирование некоторых функций и всех прерываний в RAM" (цитата из комментария к коду) с помощью memcpy.
Это делается независимо от того, какой режим выбран в build.ld.
И тут возникает вопрос:
Если мы выбрали INCLUDE niiet_ram.ld и поставили галку "Debug in RAM", то мы ведь и так работаем в оперативке, зачем что-то из флэши копировать? И что куда копируется в этом случае реально?
Второй вопрос, если мы таки запускаемся из флэш, и копируем таблицу прерываний ОЗУ, то как после этого копирования контроллер понимает, что таблица прерываний переместилась и её надо читать из ОЗУ?
Третий вопрос -- что значит в этом комментарии - "некоторых функций"? Как и где определяется то, какие функции будут скопированы, а какие нет, и как контроллер понимает -- в какой памяти по какому адресу какая функция лежит после этого?
Спаисбо!
Я осваиваю К1921ВК01Т, пользуясь вашими примерами, и у меня возникли вопросы по работе с памятью.
Во всех примерах происходит "Копирование некоторых функций и всех прерываний в RAM" (цитата из комментария к коду) с помощью memcpy.
Это делается независимо от того, какой режим выбран в build.ld.
И тут возникает вопрос:
Если мы выбрали INCLUDE niiet_ram.ld и поставили галку "Debug in RAM", то мы ведь и так работаем в оперативке, зачем что-то из флэши копировать? И что куда копируется в этом случае реально?
Второй вопрос, если мы таки запускаемся из флэш, и копируем таблицу прерываний ОЗУ, то как после этого копирования контроллер понимает, что таблица прерываний переместилась и её надо читать из ОЗУ?
Третий вопрос -- что значит в этом комментарии - "некоторых функций"? Как и где определяется то, какие функции будут скопированы, а какие нет, и как контроллер понимает -- в какой памяти по какому адресу какая функция лежит после этого?
Спаисбо!
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.
- Лашкевич Максим
- Сообщения: 342
- Зарегистрирован: 30 дек 2015, 10:38
Re: Копирование исполняемого кода из флэша в ОЗУ
1. В оперативку помещаются только простейшие примеры типа миганием светодиодом. Motorcontroldemo не помещается. Если проект и так размещен в оперативке, то, конечно, лишний раз ничего копировать в оперативку не надо.
2. Где расположена таблица прерываний задается в регистре SCB->VTOR, который присваивается указателю на g_pfnVectors, который указывает на таблицу в секции isr_vector (справедливо для motorcontroldemo).
3. Какие функции будут перенесены в оперативку задается атрибутами перед функцией, тогда она помещается в секцию памяти fastcode
для этой секции в файле build.ld прописаны специальные правила.
И главное - для K1921BK01T выполнение из оперативки не даёт выигрыша по скорости, так что ничего в оперативку помещать не надо. Мы это делали по привычке от микроконтроллеров тексаса, где это действие ускоряет выполнение.
2. Где расположена таблица прерываний задается в регистре SCB->VTOR, который присваивается указателю на g_pfnVectors, который указывает на таблицу в секции isr_vector (справедливо для motorcontroldemo).
3. Какие функции будут перенесены в оперативку задается атрибутами перед функцией, тогда она помещается в секцию памяти fastcode
Код: Выделить всё
#if defined (__GNUC__)
__attribute__((section(".fastcode")))
#endif
И главное - для K1921BK01T выполнение из оперативки не даёт выигрыша по скорости, так что ничего в оперативку помещать не надо. Мы это делали по привычке от микроконтроллеров тексаса, где это действие ускоряет выполнение.
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.
Re: Копирование исполняемого кода из флэша в ОЗУ
В blinky кстати memcpy есть, а переназначения g_pfnVectors нету.Лашкевич Максим писал(а): ↑26 июл 2022, 11:301. В оперативку помещаются только простейшие примеры типа миганием светодиодом. Motorcontroldemo не помещается. Если проект и так размещен в оперативке, то, конечно, лишний раз ничего копировать в оперативку не надо.
2. Где расположена таблица прерываний задается в регистре SCB->VTOR, который присваивается указателю на g_pfnVectors, который указывает на таблицу в секции isr_vector (справедливо для motorcontroldemo).
То есть эти memcpy в начале main можно просто удалить и ничего не поменяется?Лашкевич Максим писал(а): ↑26 июл 2022, 11:303. Какие функции будут перенесены в оперативку задается атрибутами перед функцией, тогда она помещается в секцию памяти fastcodeдля этой секции в файле build.ld прописаны специальные правила.Код: Выделить всё
#if defined (__GNUC__) __attribute__((section(".fastcode"))) #endif
И главное - для K1921BK01T выполнение из оперативки не даёт выигрыша по скорости, так что ничего в оперативку помещать не надо. Мы это делали по привычке от микроконтроллеров тексаса, где это действие ускоряет выполнение.
Или если удалить копирование векторов в оперативку, то и регистр SCB->VTOR и g_pfnVectors надо переинициализировать?
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.
- Лашкевич Максим
- Сообщения: 342
- Зарегистрирован: 30 дек 2015, 10:38
Re: Копирование исполняемого кода из флэша в ОЗУ
Копирование fastcode можно удалить, если нет функций в проекте с этой секцией, а с g_pfnVectors надо разбираться, как аккуратно выкорчевать (если это очень надо).
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.
Re: Копирование исполняемого кода из флэша в ОЗУ
Я про таблицу прерываний, не про функции. Если таблицу прерываний не переносить в ОЗУ, что что должно быть в SCB->VTOR и g_pfnVectors?Лашкевич Максим писал(а): ↑26 июл 2022, 13:00Копирование fastcode можно удалить, если нет функций в проекте с этой секцией, а с g_pfnVectors надо разбираться, как аккуратно выкорчевать (если это очень надо).
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.
Re: Копирование исполняемого кода из флэша в ОЗУ
Если вы удалите копирование таблицы векторов из Flash в RAM, тогда в sm_sys.init() вам нужно закомментить присваивание "SCB->VTOR". По умолчанию этот регистр указывает на адрес 0х00000000, где и лежит таблица векторов.
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.
Re: Копирование исполняемого кода из флэша в ОЗУ
Я взял пример с 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 нигде не инициализируется.
Как заставить запускаться из флеша? Ну, чтобы после ресета программа запускалась сама, без прошивки.
Он был настроен на работу из 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 нигде не инициализируется.
Как заставить запускаться из флеша? Ну, чтобы после ресета программа запускалась сама, без прошивки.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.
Re: Копирование исполняемого кода из флэша в ОЗУ
Если я правильно помню, галочку "Debug in RAM" мы всегда оставляем.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 -- одинаково не работает.
А это, возможно, бага. Проверим.
Вы имеете в виду без подключенного JTAG-а, просто на столе? По идее при выборе "Debug in FLASH" должна запускаться. Проверим.
Но если вы имеете в виду с JTAG-ом - то есть просто ресетнуть прогу, без перепрошивки - то так, к сожалению, нельзя сделать "по-простому".
Да, кстати, а вы на чём отлаживаетесь? Свой контроллер?
И ещё - что это за проект "...Timer" на BitBucket? Я что-то там такого не нашёл.
У нас есть такой в примерах со средой VectorIDE, но там инит g_pfnVectors есть.
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.
Re: Копирование исполняемого кода из флэша в ОЗУ
Но в файле 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/
______________________________________
/* После изменения конфигурации нужно поменять галочку 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/
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний.
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/
Кстати g_pfnVectors там инитится в функции "void Timer_and_interrupt_init ()".
С уважением,
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.
Дмитрий Шпак
Telegram: +79773608997
shpak@motorcontrol.ru
Инженер-программист ООО "НПФ Вектор", Москва.