Top.Mail.Ru
Уведомления
Очистить все

Переопределение размера массива?

(@yuriy)
Level 2

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

Цитата
Создатель темы Размещено : 10.01.2025 22:29
Aveal
(@aveal)
Top level Admin

Добавлю пару вариантов навскидку:

  • объявить один (или сколько требуется) массивов и переиспользовать их в разных режимах, то есть объявить массив(ы) максимально возможного/требуемого размера и одни и те же массивы использовать в разных режимах
  • значения, которые не меняются во время работы разместить во flash-памяти
ОтветитьЦитата
Размещено : 11.01.2025 12:05
(@yuriy)
Level 2

Запись от: @aveal

Добавлю пару вариантов навскидку:

  • объявить один (или сколько требуется) массивов и переиспользовать их в разных режимах, то есть объявить массив(ы) максимально возможного/требуемого размера и одни и те же массивы использовать в разных режимах

Изначально так и думалось. Но массивы в одном случае двумерные, а в другом одномерные. Кроме того тип данных у них разный - вещественный и целый.

 

ОтветитьЦитата
Создатель темы Размещено : 11.01.2025 19:52
Aveal
(@aveal)
Top level Admin

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

  1. проект, который будет регулировать выбор режима при запуске помещается по адресу 0x08000000
  2. проект 1 размещается по адресу 0x08002000
  3. проект 2 размещается по адресу 0x0800C000 (адреса для примера)
  4. в отдельном месте flash хранится текущий выбранный режим

Допустим находимся в проекте 1, получаем команду для перехода в проект 2, пишем во flash код целевого режима (2), перезапускаем контроллер. После перезапуска попадаем по адресу  0x08000000, проект из пункта 1 считывает из flash код 2 и перебрасывает контроллер на адрес 0x0800C000, далее работает проект 2. При изменение режима все аналогично через перезапуск контроллера. Соответственно каждый из проектов использует весь спектр доступной оперативной памяти под свои данные - далее уже надо в зависимости от конкретной задачи прикинуть, целесообразно это или нет, но механизм рабочий.

ОтветитьЦитата
Размещено : 13.01.2025 12:55
(@yuriy)
Level 2

@aveal Спасибо, интересный вариант. А программно можно перезагружать МК?

ОтветитьЦитата
Создатель темы Размещено : 13.01.2025 22:54
Aveal
(@aveal)
Top level Admin

@yuriy да, через NVIC_SystemReset();

ОтветитьЦитата
Размещено : 14.01.2025 12:40
(@yuriy)
Level 2

А какой процесс определяет запуск загрузчика программы с нужного места.

ОтветитьЦитата
Создатель темы Размещено : 14.01.2025 21:32
Aveal
(@aveal)
Top level Admin

В смысле с 0x08000000?

ОтветитьЦитата
Размещено : 14.01.2025 21:52
(@yuriy)
Level 2

Запись от: @aveal

В смысле с 0x08000000?

С какого адреса запускать это понятно. Пока не знаю (надо изучать) как это осуществлять, что за программные строки это делают.

 

ОтветитьЦитата
Создатель темы Размещено : 14.01.2025 22:00
Aveal
(@aveal)
Top level Admin

Здесь вот - ссылка - есть пример перехода по адресу и сброса тоже.

ОтветитьЦитата
Размещено : 14.01.2025 22:02
(@yuriy)
Level 2

Спасибо.

ОтветитьЦитата
Создатель темы Размещено : 14.01.2025 22:09
Поделиться: