Например TDA7294

Форум РадиоКот • Просмотр темы - Как поместить функцию по заданному адресу Flash памяти
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб дек 20, 2025 12:27:22

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 22 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 03:38:59 
Первый раз сказал Мяу!

Зарегистрирован: Вс июл 15, 2012 16:21:55
Сообщений: 25
Рейтинг сообщения: 0
Добрый день знатокам!
Использую среду разработки IAR и микроконтроллер STM32F103C8T6. Пытаюсь одну из функций проекта поместить по заранее заданному адресу Flash памяти, а не как себе «решит» компилятор, все остальные функции пусть располагает как он считает нужным.

При стандартном объявлении функции: void ReadUART1(void) {…}
после компиляции если смотреть в файле *.map, видно что эта функция помещается компилятором во Flash памяти по адресу 0x0800'01d7, что означает достаточно не далеко от начала Flash памяти.

После попытки объявления функции: void ReadUART1(void) @ "MYSEGMENT" {…}
после компиляции если смотреть в файле *.map, видно что эта функция переместилась компилятором во Flash памяти по адресу 0x0800'd929, а это уже по сути в самом конце проекта.

Не могу понять, ГДЕ и КАК задать "MYSEGMENT" необходимый адрес, например 0x0800'F000.

P.S. директива #pragma location = 0x0800F000 перед этой функцией не работает, так как по видимому она предназначена только для переменных


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 03:44:06 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
https://stackoverflow.com/questions/187 ... get-stored


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 04:28:15 
Первый раз сказал Мяу!

Зарегистрирован: Вс июл 15, 2012 16:21:55
Сообщений: 25
Рейтинг сообщения: 0
На основе приведенного примера в соответствующих разделах файла *.icf установил следующие строки:

define region MY_FUNC = mem:[from 0x0800F000 size 0x0800];

place in MY_FUNC { readonly MYSEGMENT };

но линкер выдает ошибку в последней строке Error[Lc003]: expected "}"
и судя по всему с параметром «readonly» недопустимы другие приставки/переменные и т.п.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 05:35:47 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Во-первых, в штатном icf посмотрите как сделано для секции .intvec. Она как раз по фиксированному адресу располагается.

Во-вторых, если вам потребовалось расположить функцию по фиксированному адресу, то вы явно что-то делаете не так!


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
В сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 07:53:11 
Друг Кота
Аватар пользователя

Карма: 17
Рейтинг сообщений: 467
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Сообщений: 5563
Откуда: Воронеж
Рейтинг сообщения: 0
Уж не таблицу ли векторов прерываний перенести нужно?

_________________
"Привет!" - соврал он.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 08:50:10 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Нет, самую главную функцию прошивки - ReadUART1(). Зачем, меня не спрашивайте.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 13:18:52 
Первый раз сказал Мяу!

Зарегистрирован: Вс июл 15, 2012 16:21:55
Сообщений: 25
Рейтинг сообщения: 0
Ваууу получилось!!! Спасибо огромное VladislavS!
И правильно догадались о чем идет речь, о бутлоадере … и я уже пошел чуть дальше, запихнул его в RAM память что бы не мешал перезаписывать всю Flash, вот только сейчас думаю над самым безопасным диапазоном в памяти (достаточно и 1К байта) что бы потом во время работы МК не заципили динамически выделяемые переменые, стек и всё такое


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 13:47:27 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
Какой смысл от загрузчика, который выключение питания не переживает, как им пользоваться?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 14:32:50 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
COKPOWEHEU, полагаю, имеется ввиду работа из ОЗУ, что даёт возможность перезаписать самого себя. Риск "окирпичивания" этим повышен в разы...
MarkTok писал(а):
над самым безопасным диапазоном в памяти (достаточно и 1К байта) что бы потом во время работы МК не заципили динамически выделяемые переменые, стек и всё такое
похоже на страдание ерундой, не?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 14:48:32 
Первый раз сказал Мяу!

Зарегистрирован: Вс июл 15, 2012 16:21:55
Сообщений: 25
Рейтинг сообщения: 0
Martian, о риске «окирпичивания» уже начал догадываться, а Вы подтвердили это, спасибо значит нужно вернуться во Flash, там же и организовать проверку на правильность перезаписи (оставлять некую метку об успешности операции)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 16:00:28 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
MarkTok, похоже на страдание ерундой. Делаете отдельным проектом бутлоадер, который видя целостность прошивки передаёт на неё управление. Основная прошивка просто с другого начального адреса линкуется и всё. Единственное, она должна правильно таблицу векторов прерываний настроить и переферию более надёжно сбросить перед инициализацией. Больше никакой разницы из-под бутлоадера прошивка работает или без нет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Вт окт 24, 2023 17:55:15 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
Согласен. Но это иногда неудобно. Но зависит от конечной цели устройства...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Ср окт 25, 2023 10:44:38 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
COKPOWEHEU, полагаю, имеется ввиду работа из ОЗУ, что даёт возможность перезаписать самого себя. Риск "окирпичивания" этим повышен в разы...

Нет, ну применений-то много можно придумать. Например, код загрузчика в реальном времени передается по какому-то интерфейсу, сохраняется в оперативку, после чего выполняется оттуда. Но это не меньшее извращение.
VladislavS писал(а):
MarkTok, похоже на страдание ерундой. Делаете отдельным проектом бутлоадер, который видя целостность прошивки передаёт на неё управление. Основная прошивка просто с другого начального адреса линкуется и всё. Единственное, она должна правильно таблицу векторов прерываний настроить

Можно даже хитрее сделать. Пусть сам бутлоадер располагается ближе к концу флешки, а по нулевому адресу идет переход на него. Далее загрузчик уже сам перемещает себе таблицу векторов. А при собственно прошивке подменяет нулевой адрес из прошивки на свой, а адрес старта сохраняет к себе. Да, алгоритм получается чуть сложнее, но прозрачнее для юзерского кода.
MarkTok писал(а):
там же и организовать проверку на правильность перезаписи (оставлять некую метку об успешности операции)
Зависит от алгоритма прошивальщика. Он может проверять корректность записи каждой страницы.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Ср окт 25, 2023 13:43:08 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
если загрузчик не успеет чего-то там подменить, то снова "кирпич". Не, расположение его изначально первым практически исключает риск.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Ср окт 25, 2023 17:11:25 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
если загрузчик не успеет чего-то там подменить, то снова "кирпич". Не, расположение его изначально первым практически исключает риск.

Как он может не успеть что-то подменить?! Там же нет никакой гонки.
Ну и удобство писать потом код как будто никакого загрузчика нет, не стоит исключать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Ср окт 25, 2023 17:27:15 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
ну фиг знает. питание скакнёт или ещё что, и криво переписал.
а вообще, разве в STM32 уже нет всяких бутлоадеров внутре?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Ср окт 25, 2023 21:27:33 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
Есть, конечно. В f103 можно прошиваться по UART, а в более сложных и по USB. Но это надо дергать BOOT0 и RESET, что не всегда удобно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Ср окт 25, 2023 21:41:49 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
сплошное неудобство. вектор переназначить - неудобно, выводы замкнуть - неудобно... ну, дёрните их программно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Чт окт 26, 2023 01:28:20 
Первый раз сказал Мяу!

Зарегистрирован: Вс июл 15, 2012 16:21:55
Сообщений: 25
Рейтинг сообщения: 0
Вы все однозначно более профессиональны в данном вопросе, поэтому я возможно просто ещё не вижу скрытых камней на своем пути, хочу сначала попробовать то что задумал, а потом уже сказать что получилось … ну или не получилось ))) Но уже даже сейчас можно сказать что Martian прав, вероятность «окирпичивания» в момент прошивания всё таки будет при скачке питания или т.п.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить функцию по заданному адресу Flash памяти
СообщениеДобавлено: Чт окт 26, 2023 01:54:26 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
на мой взгляд, написание бутлоадера - это очень хорошая практика независимо от результата


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y