Перейти к содержанию
    

IAR 8 STM32F407 адреса переменных

Привет

Можно ли получить в код программы адрес и размер области переменных, которые обнуляются в startup? Я так понимаю компилятор их размещает рядом (непрерывно).

И то же, для переменных, которые инициализируются начальными значениями отличными от нуля?

Изменено пользователем haker_fox
Тему переместил. Т.к. вопрос скорее по среде разработки, чем по самомой архитектуре.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам нужно почитать документацию на линкер.

Секция readwrite содержит переменные, которые будут инициализированы нулями. Получить адрес и размер этой секции можно так:

адрес секции = __section_begin("readwrite");
размер секции = __section_size("readwrite");

 

P.S. Перепутал немного. Эта секция readwrite содержит переменные, которые вообще будут инициализированы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, const сказал:

Можно ли получить в код программы адрес и размер области переменных, которые обнуляются в startup? Я так понимаю компилятор их размещает рядом (непрерывно).

Компилятор размещает их туда, куда вы ему говорите. Самоуправством он не занимается. Потому и "получать" ничего не требуется. Требуется просто открыть командный файл компоновщика (*.icf) и посмотреть, что у вас там написано. И задать в нём нужное положение областей памяти и определить - какие секции программы в какие области памяти следует компоновать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 minutes ago, jcxz said:

Компилятор размещает их туда, куда вы ему говорите. Самоуправством он не занимается. Потому и "получать" ничего не требуется. Требуется просто открыть командный файл компоновщика (*.icf) и посмотреть, что у вас там написано. И задать в нём нужное положение областей памяти и определить - какие секции программы в какие области памяти следует компоновать.

Своему ничего не говорил. Не было необходимости. Пользуюсь тем, что было с IAR-ом. Так что размещает он по указу мне незнакомых людей. Да и ладно 🙂

3 hours ago, haker_fox said:

Вам нужно почитать документацию на линкер.

Секция readwrite содержит переменные, которые будут инициализированы нулями. Получить адрес и размер этой секции можно так:

адрес секции = __section_begin("readwrite");
размер секции = __section_size("readwrite");

 

P.S. Перепутал немного. Эта секция readwrite содержит переменные, которые вообще будут инициализированы.

Спасибо, разобрался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/3/2023 at 11:41 AM, haker_fox said:

которые вообще будут инициализированы.

Тут конечно не указано о каком языке идет речь, но в Си абсолютно все глобальные переменные будут инициализированы в startup коде.

Могу ошибаться, но в С++ глобальные переменные, не являющиеся членами классов, тоже будут проинициализированы в startup коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще появился вопрос. Можно ли "перезапустить" МК без дерганья RESET (в т.ч. NVIC_SystemReset()), что бы проинициализированные регистры не сбрасывать?

Как бы начать программу с Reset_Handler без сброса. Только, как понимаю, придётся еще проинициализировать СТЕК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/3/2023 at 4:31 PM, const said:

Еще появился вопрос. Можно ли "перезапустить" МК без дерганья RESET (в т.ч. NVIC_SystemReset()), что бы проинициализированные регистры не сбрасывать?

Как бы начать программу с Reset_Handler без сброса. Только, как понимаю, придётся еще проинициализировать СТЕК.

Так в Reset_Handler и происходит инициализация глобальных переменных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, dimka76 said:

Так в Reset_Handler и происходит инициализация глобальных переменных.

Мне важно содержание регистров портов - их настройка и текущее состояние, оно не должно меняться при "мягком сбросе".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, const сказал:

Еще появился вопрос. Можно ли "перезапустить" МК без дерганья RESET (в т.ч. NVIC_SystemReset()), что бы проинициализированные регистры не сбрасывать?

Вы - изготовитель граблей? :biggrin: На которые потом будете наступать. Иначе не могу придумать ни одной вменяемой причины - зачем так делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/3/2023 at 4:41 PM, const said:

Мне важно содержание регистров портов - их настройка и текущее состояние, оно не должно меняться при "мягком сбросе".

Тогда NVIC_SystemReset() точно не подходит.

Попробуйте 

goto Reset_Handler

или

Reset_Handler();

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, dimka76 сказал:

Попробуйте 

goto Reset_Handler

или

Reset_Handler();

 

Прежде чем такое советовать, нужно узнать нет ли у ТС-а ОС? А также рассказать ему, что такое "стеки" и как они работают. Без этого такой совет скорее всего приведёт к зависанию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, jcxz said:

Прежде чем такое советовать, нужно узнать нет ли у ТС-а ОС? А также рассказать ему, что такое "стеки" и как они работают. Без этого такой совет скорее всего приведёт к зависанию.

ОСи нет. Про стек я уже писал, кроме этого еще что то надо? И как проинициализировать стек, писать сразу в регисты или по адресу этих регистров?

Решение временное, ПО будет переписываться. А пока оно тормозит проверку системы в целом. Наступание на "грабли" при проверки легко локализуется.

Рассказывать про стеки вы будете или кому-то другому советуете?

Изменено пользователем const

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/3/2023 at 5:03 PM, const said:

 писать сразу в регисты

Да, так.

В CMSIS есть функция __set_MSP

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, dimka76 said:

но в Си абсолютно все глобальные переменные будут инициализированы в startup коде.

Если не добавить ключевые слова типа __no_init, которые запретят их инициализировать. Но это уже тонкости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, const сказал:

Мне важно содержание регистров портов - их настройка и текущее состояние, оно не должно меняться при "мягком сбросе".

Тут увы - любой аппаратный сброс (в том числе и через запись в SCB->AIRCR) приводит к сбросу почти всех регистров (кроме backup domain и RCC->CSR). Остается только переход на вектор сброса, но при этому нужно помнить, что вся периферия продолжает работать - например, ПДП, если была настроена, продолжает складывать данные в память, а некоторую периферию просто физически невозможно программно привести в исходное состояние (WDT невозможно остановить, снять защиту GPIO->LCKR - это первое, что пришло в голову). Так что, наверное, стоит хорошенько подумать - а надо ли вам бороться с ошибками, вызванными таким "сбросом" или лучше сразу потратить это время на отладку "боевой" программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...