aaarrr 69 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба А вот мне тут подумалось. Кроме того что сказать линкеру разместить функцию в RAM, надо же еще где-то написать копирование данных из адреса флеш, в тот адрес где разместили функцию. Сама же она туда не перелезет. Так собственно линкер это и делает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба у кортексов встроена функция переброски памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба у кортексов встроена функция переброски памяти? Линкер создаст таблицы и подцепит необходимое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба А в какой момент будет копирование? до ресета что ли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба А в какой момент будет копирование? до ресета что ли?Не знаю как делает Кейл (а вам влом посмотреть листинг?), я копирую заодно с инициализированными переменными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба А в какой момент будет копирование? до ресета что ли? До перехода на main(). Поинтересуйтесь, например, содержимым InRoot$$Sections. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба Не знаю как делает Кейл (а вам влом посмотреть листинг?), я копирую заодно с инициализированными переменными. В 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? ну да там же и все копировщики и инициализаторы вызываются, но текст их не доступен... означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба Не надо ничего руками трогать, оно и так хорошо работает. Линкер создаёт специальные символы, по которым этот __main() инициализирует RAM. Помнится, в скаттер-файле можно легко ошибиться - всё собирается, но этот __main() копирует данные вечно. PS почти всегда пользовался автоматическим scatter'ом. Максимум, что мне надо было - "откусить" кусочек flash под загрузчик, это галками сделать легко. Для более сложной конфигурации (вспомнить бы, зачем мне потребовалось раскидывать функции по RAM, да ещё с жёстко заданными адресами..) пришлось изрядно почитать, и заработало оно не сразу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба отгадка в том что __main - это не main? ну да там же и все копировщики и инициализаторы вызываются, но текст их не доступен... Именно так: __main и main - это разные вещи. означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть. Нет, все сделает линкер. Помнится, в скаттер-файле можно легко ошибиться - всё собирается, но этот __main() копирует данные вечно. Ошибиться и в программе можно, но какой же это аргумент? Структура у скаттера очень простая и наглядная. Возможные "хотелки" на раз находятся в документации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба Нет, все сделает линкер. линкер он кому принадлежит? Это же часть кейла? то есть у другой среды он может быть реализован иначе? Или же он как-то стандартизован на уровне ARM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба линкер он кому принадлежит? Это же часть кейла? то есть у другой среды он может быть реализован иначе? Или же он как-то стандартизован на уровне ARM? Линкер является частью RVCT, т.е. относится не только к Кейлу, но и к прочей продукции ARM. У IAR, GNU, GreenHills и прочих решения свои, но общие принципы одинаковые. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба То есть на самом деле стандартизован на уровне ARM... спасибо за пояснения... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 29 апреля, 2015 Опубликовано 29 апреля, 2015 · Жалоба но текст их не доступен... означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть. почему недоступен? отладчиком все прекрасно видно ничего править руками не нужно. Как в скаттере расписано, так линкер сам и соберет в нужных областях. Что нужно - проинициализирует, что нужно - скопирует а так оно да, __main != main, после как раз восстановления областей на своих местах управление передается на main() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться