Программа должна работать в двух режимах: Режим1 или Режим2. Режим задаётся с ПК по USB. При этом для меня встала новая, мной не освоенная задача, связанная с памятью. Дело в том, что для каждого режима используется свой набор массивов в том числе и двумерных, размер которых желательно иметь максимальным по отношению к оставшейся от собственно программы памяти. (В дебри определения размера оставшейся памяти лезть не надо, это должно решаться на этапе проектирования). Для первого режима значения массивов могут меняться по ходу дела с ПК по USB, во втором - массивы статические, задаются один раз при переходе в этот режим и не меняются до его конца. По сегодняшнему состоянию моего понимания вопроса вижу такой вариант: Сразу определять массивы и первого и второго вариантов. Но в зависимости от варианта одни массивы делать с нулевым размером, а другие с требуемым. Вот как это делать я не представляю и, ели это возможно, то подскажите, пожалуйста, как. Ещё такой вариан крутится в голове: иметь вообще две программы и загружать их из с ПК по необходтимости. Что скажете? Но для этого надо как-то USB порт переопределять для использования его в качестве загрузчика. Этот вопрос надо ещё изучать, но есть надежда, что для моего МК (STM32h723) это возможно.
Добавлю пару вариантов навскидку:
- объявить один (или сколько требуется) массивов и переиспользовать их в разных режимах, то есть объявить массив(ы) максимально возможного/требуемого размера и одни и те же массивы использовать в разных режимах
- значения, которые не меняются во время работы разместить во flash-памяти
Добавлю пару вариантов навскидку:
- объявить один (или сколько требуется) массивов и переиспользовать их в разных режимах, то есть объявить массив(ы) максимально возможного/требуемого размера и одни и те же массивы использовать в разных режимах
Изначально так и думалось. Но массивы в одном случае двумерные, а в другом одномерные. Кроме того тип данных у них разный - вещественный и целый.
Тогда либо динамически выделять память, либо действительно в виде двух отдельных программ сделать - то есть каждый из режимов фактически будет представлять из себя отдельный проект, например:
- проект, который будет регулировать выбор режима при запуске помещается по адресу 0x08000000
- проект 1 размещается по адресу 0x08002000
- проект 2 размещается по адресу 0x0800C000 (адреса для примера)
- в отдельном месте flash хранится текущий выбранный режим
Допустим находимся в проекте 1, получаем команду для перехода в проект 2, пишем во flash код целевого режима (2), перезапускаем контроллер. После перезапуска попадаем по адресу 0x08000000, проект из пункта 1 считывает из flash код 2 и перебрасывает контроллер на адрес 0x0800C000, далее работает проект 2. При изменение режима все аналогично через перезапуск контроллера. Соответственно каждый из проектов использует весь спектр доступной оперативной памяти под свои данные - далее уже надо в зависимости от конкретной задачи прикинуть, целесообразно это или нет, но механизм рабочий.
@aveal Спасибо, интересный вариант. А программно можно перезагружать МК?
А какой процесс определяет запуск загрузчика программы с нужного места.
В смысле с 0x08000000?
С какого адреса запускать это понятно. Пока не знаю (надо изучать) как это осуществлять, что за программные строки это делают.В смысле с 0x08000000?
Спасибо.