реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Стратегия размещения функций Keil, Как определяется какая функция попадет в RAM
aaarrr
сообщение Apr 28 2015, 10:38
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 28 2015, 12:16) *
А вот мне тут подумалось. Кроме того что сказать линкеру разместить функцию в RAM, надо же еще где-то написать копирование данных из адреса флеш, в тот адрес где разместили функцию. Сама же она туда не перелезет.

Так собственно линкер это и делает.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 28 2015, 10:53
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



у кортексов встроена функция переброски памяти?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 28 2015, 10:58
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 28 2015, 13:53) *
у кортексов встроена функция переброски памяти?

Линкер создаст таблицы и подцепит необходимое.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 28 2015, 11:04
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А в какой момент будет копирование? до ресета что ли?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2015, 11:19
Сообщение #35


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Golikov A. @ Apr 28 2015, 14:04) *
А в какой момент будет копирование? до ресета что ли?
Не знаю как делает Кейл (а вам влом посмотреть листинг?), я копирую заодно с инициализированными переменными.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 28 2015, 11:45
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 28 2015, 14:04) *
А в какой момент будет копирование? до ресета что ли?

До перехода на main(). Поинтересуйтесь, например, содержимым InRoot$$Sections.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 28 2015, 12:56
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 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? ну да там же и все копировщики и инициализаторы вызываются, но текст их не доступен... означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 28 2015, 13:49
Сообщение #38


Профессионал
*****

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



Не надо ничего руками трогать, оно и так хорошо работает. Линкер создаёт специальные символы, по которым этот __main() инициализирует RAM.
Помнится, в скаттер-файле можно легко ошибиться - всё собирается, но этот __main() копирует данные вечно.

PS почти всегда пользовался автоматическим scatter'ом. Максимум, что мне надо было - "откусить" кусочек flash под загрузчик, это галками сделать легко.
Для более сложной конфигурации (вспомнить бы, зачем мне потребовалось раскидывать функции по RAM, да ещё с жёстко заданными адресами..) пришлось изрядно почитать, и заработало оно не сразу.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 28 2015, 14:32
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 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() копирует данные вечно.

Ошибиться и в программе можно, но какой же это аргумент?

Структура у скаттера очень простая и наглядная. Возможные "хотелки" на раз находятся в документации.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 28 2015, 15:42
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Нет, все сделает линкер.

линкер он кому принадлежит? Это же часть кейла? то есть у другой среды он может быть реализован иначе? Или же он как-то стандартизован на уровне ARM?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 28 2015, 16:18
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 28 2015, 18:42) *
линкер он кому принадлежит? Это же часть кейла? то есть у другой среды он может быть реализован иначе? Или же он как-то стандартизован на уровне ARM?

Линкер является частью RVCT, т.е. относится не только к Кейлу, но и к прочей продукции ARM.
У IAR, GNU, GreenHills и прочих решения свои, но общие принципы одинаковые.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 28 2015, 17:11
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



То есть на самом деле стандартизован на уровне ARM...

спасибо за пояснения...
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 29 2015, 08:05
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Golikov A. @ Apr 28 2015, 15:56) *
но текст их не доступен... означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть.

почему недоступен? отладчиком все прекрасно видно
ничего править руками не нужно. Как в скаттере расписано, так линкер сам и соберет в нужных областях. Что нужно - проинициализирует, что нужно - скопирует
а так оно да, __main != main, после как раз восстановления областей на своих местах управление передается на main()
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 23:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01469 секунд с 7
ELECTRONIX ©2004-2016