const 1 3 августа, 2023 Опубликовано 3 августа, 2023 (изменено) · Жалоба Привет Можно ли получить в код программы адрес и размер области переменных, которые обнуляются в startup? Я так понимаю компилятор их размещает рядом (непрерывно). И то же, для переменных, которые инициализируются начальными значениями отличными от нуля? Изменено 3 августа, 2023 пользователем haker_fox Тему переместил. Т.к. вопрос скорее по среде разработки, чем по самомой архитектуре. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба Вам нужно почитать документацию на линкер. Секция readwrite содержит переменные, которые будут инициализированы нулями. Получить адрес и размер этой секции можно так: адрес секции = __section_begin("readwrite"); размер секции = __section_size("readwrite"); P.S. Перепутал немного. Эта секция readwrite содержит переменные, которые вообще будут инициализированы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба 3 часа назад, const сказал: Можно ли получить в код программы адрес и размер области переменных, которые обнуляются в startup? Я так понимаю компилятор их размещает рядом (непрерывно). Компилятор размещает их туда, куда вы ему говорите. Самоуправством он не занимается. Потому и "получать" ничего не требуется. Требуется просто открыть командный файл компоновщика (*.icf) и посмотреть, что у вас там написано. И задать в нём нужное положение областей памяти и определить - какие секции программы в какие области памяти следует компоновать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба 31 minutes ago, jcxz said: Компилятор размещает их туда, куда вы ему говорите. Самоуправством он не занимается. Потому и "получать" ничего не требуется. Требуется просто открыть командный файл компоновщика (*.icf) и посмотреть, что у вас там написано. И задать в нём нужное положение областей памяти и определить - какие секции программы в какие области памяти следует компоновать. Своему ничего не говорил. Не было необходимости. Пользуюсь тем, что было с IAR-ом. Так что размещает он по указу мне незнакомых людей. Да и ладно 🙂 3 hours ago, haker_fox said: Вам нужно почитать документацию на линкер. Секция readwrite содержит переменные, которые будут инициализированы нулями. Получить адрес и размер этой секции можно так: адрес секции = __section_begin("readwrite"); размер секции = __section_size("readwrite"); P.S. Перепутал немного. Эта секция readwrite содержит переменные, которые вообще будут инициализированы. Спасибо, разобрался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба On 8/3/2023 at 11:41 AM, haker_fox said: которые вообще будут инициализированы. Тут конечно не указано о каком языке идет речь, но в Си абсолютно все глобальные переменные будут инициализированы в startup коде. Могу ошибаться, но в С++ глобальные переменные, не являющиеся членами классов, тоже будут проинициализированы в startup коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба Еще появился вопрос. Можно ли "перезапустить" МК без дерганья RESET (в т.ч. NVIC_SystemReset()), что бы проинициализированные регистры не сбрасывать? Как бы начать программу с Reset_Handler без сброса. Только, как понимаю, придётся еще проинициализировать СТЕК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба On 8/3/2023 at 4:31 PM, const said: Еще появился вопрос. Можно ли "перезапустить" МК без дерганья RESET (в т.ч. NVIC_SystemReset()), что бы проинициализированные регистры не сбрасывать? Как бы начать программу с Reset_Handler без сброса. Только, как понимаю, придётся еще проинициализировать СТЕК. Так в Reset_Handler и происходит инициализация глобальных переменных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба Just now, dimka76 said: Так в Reset_Handler и происходит инициализация глобальных переменных. Мне важно содержание регистров портов - их настройка и текущее состояние, оно не должно меняться при "мягком сбросе". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба 9 минут назад, const сказал: Еще появился вопрос. Можно ли "перезапустить" МК без дерганья RESET (в т.ч. NVIC_SystemReset()), что бы проинициализированные регистры не сбрасывать? Вы - изготовитель граблей? На которые потом будете наступать. Иначе не могу придумать ни одной вменяемой причины - зачем так делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба On 8/3/2023 at 4:41 PM, const said: Мне важно содержание регистров портов - их настройка и текущее состояние, оно не должно меняться при "мягком сбросе". Тогда NVIC_SystemReset() точно не подходит. Попробуйте goto Reset_Handler или Reset_Handler(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба 4 минуты назад, dimka76 сказал: Попробуйте goto Reset_Handler или Reset_Handler(); Прежде чем такое советовать, нужно узнать нет ли у ТС-а ОС? А также рассказать ему, что такое "стеки" и как они работают. Без этого такой совет скорее всего приведёт к зависанию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 3 августа, 2023 Опубликовано 3 августа, 2023 (изменено) · Жалоба 11 minutes ago, jcxz said: Прежде чем такое советовать, нужно узнать нет ли у ТС-а ОС? А также рассказать ему, что такое "стеки" и как они работают. Без этого такой совет скорее всего приведёт к зависанию. ОСи нет. Про стек я уже писал, кроме этого еще что то надо? И как проинициализировать стек, писать сразу в регисты или по адресу этих регистров? Решение временное, ПО будет переписываться. А пока оно тормозит проверку системы в целом. Наступание на "грабли" при проверки легко локализуется. Рассказывать про стеки вы будете или кому-то другому советуете? Изменено 3 августа, 2023 пользователем const Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба On 8/3/2023 at 5:03 PM, const said: писать сразу в регисты Да, так. В CMSIS есть функция __set_MSP Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба 2 hours ago, dimka76 said: но в Си абсолютно все глобальные переменные будут инициализированы в startup коде. Если не добавить ключевые слова типа __no_init, которые запретят их инициализировать. Но это уже тонкости. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 3 августа, 2023 Опубликовано 3 августа, 2023 · Жалоба 6 часов назад, const сказал: Мне важно содержание регистров портов - их настройка и текущее состояние, оно не должно меняться при "мягком сбросе". Тут увы - любой аппаратный сброс (в том числе и через запись в SCB->AIRCR) приводит к сбросу почти всех регистров (кроме backup domain и RCC->CSR). Остается только переход на вектор сброса, но при этому нужно помнить, что вся периферия продолжает работать - например, ПДП, если была настроена, продолжает складывать данные в память, а некоторую периферию просто физически невозможно программно привести в исходное состояние (WDT невозможно остановить, снять защиту GPIO->LCKR - это первое, что пришло в голову). Так что, наверное, стоит хорошенько подумать - а надо ли вам бороться с ошибками, вызванными таким "сбросом" или лучше сразу потратить это время на отладку "боевой" программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться