|
Стратегия размещения функций Keil, Как определяется какая функция попадет в RAM |
|
|
|
Apr 28 2015, 12:56
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Не знаю как делает Кейл (а вам влом посмотреть листинг?), я копирую заодно с инициализированными переменными. В IAR я тоже все руками делал, правда для 7 арма, а тут кортекс и с кейлом разленился. Цитата До перехода на main(). Поинтересуйтесь, например, содержимым InRoot$$Sections. Поглядел что на векторе ресета инициализация клоков и переход в маин. 2 функции вызываются одна за другой. Код Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main
LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP я не против того что и как по секциям линкером распределено, но когда питание выключено оно все во флэшке, а потом должно в рам перелезть, и вот в какой момент что-то я в замешательстве. UPD. отгадка в том что __main - это не main? ну да там же и все копировщики и инициализаторы вызываются, но текст их не доступен... означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть.
|
|
|
|
|
Apr 28 2015, 13:49
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Не надо ничего руками трогать, оно и так хорошо работает. Линкер создаёт специальные символы, по которым этот __main() инициализирует RAM. Помнится, в скаттер-файле можно легко ошибиться - всё собирается, но этот __main() копирует данные вечно.
PS почти всегда пользовался автоматическим scatter'ом. Максимум, что мне надо было - "откусить" кусочек flash под загрузчик, это галками сделать легко. Для более сложной конфигурации (вспомнить бы, зачем мне потребовалось раскидывать функции по RAM, да ещё с жёстко заданными адресами..) пришлось изрядно почитать, и заработало оно не сразу.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Apr 28 2015, 14:32
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Golikov A. @ Apr 28 2015, 15:56)  отгадка в том что __main - это не main? ну да там же и все копировщики и инициализаторы вызываются, но текст их не доступен... Именно так: __main и main - это разные вещи. Цитата(Golikov A. @ Apr 28 2015, 15:56)  означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть. Нет, все сделает линкер. Цитата(esaulenka @ Apr 28 2015, 16:49)  Помнится, в скаттер-файле можно легко ошибиться - всё собирается, но этот __main() копирует данные вечно. Ошибиться и в программе можно, но какой же это аргумент? Структура у скаттера очень простая и наглядная. Возможные "хотелки" на раз находятся в документации.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|