Перейти к содержанию
    

Стратегия размещения функций Keil

А вот мне тут подумалось. Кроме того что сказать линкеру разместить функцию в RAM, надо же еще где-то написать копирование данных из адреса флеш, в тот адрес где разместили функцию. Сама же она туда не перелезет.

Так собственно линкер это и делает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у кортексов встроена функция переброски памяти?

Линкер создаст таблицы и подцепит необходимое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в какой момент будет копирование? до ресета что ли?
Не знаю как делает Кейл (а вам влом посмотреть листинг?), я копирую заодно с инициализированными переменными.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в какой момент будет копирование? до ресета что ли?

До перехода на main(). Поинтересуйтесь, например, содержимым InRoot$$Sections.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю как делает Кейл (а вам влом посмотреть листинг?), я копирую заодно с инициализированными переменными.

В 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? ну да там же и все копировщики и инициализаторы вызываются, но текст их не доступен... означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

PS почти всегда пользовался автоматическим scatter'ом. Максимум, что мне надо было - "откусить" кусочек flash под загрузчик, это галками сделать легко.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

отгадка в том что __main - это не main? ну да там же и все копировщики и инициализаторы вызываются, но текст их не доступен...

Именно так: __main и main - это разные вещи.

 

означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть.

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

 

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

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

 

Структура у скаттера очень простая и наглядная. Возможные "хотелки" на раз находятся в документации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

линкер он кому принадлежит? Это же часть кейла? то есть у другой среды он может быть реализован иначе? Или же он как-то стандартизован на уровне ARM?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

линкер он кому принадлежит? Это же часть кейла? то есть у другой среды он может быть реализован иначе? Или же он как-то стандартизован на уровне ARM?

Линкер является частью RVCT, т.е. относится не только к Кейлу, но и к прочей продукции ARM.

У IAR, GNU, GreenHills и прочих решения свои, но общие принципы одинаковые.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но текст их не доступен... означает ли что если я делаю файл для линкера руками, то я должен и руками все эти копировщики поправить, а то беда может быть.

почему недоступен? отладчиком все прекрасно видно

ничего править руками не нужно. Как в скаттере расписано, так линкер сам и соберет в нужных областях. Что нужно - проинициализирует, что нужно - скопирует

а так оно да, __main != main, после как раз восстановления областей на своих местах управление передается на main()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...