Кто определяет адрес указателя стека - PullRequest
0 голосов
/ 20 февраля 2019

Что касается микроконтроллеров и встроенных систем с кодом запуска C, одной из функций кода запуска C является инициализация указателя стека.

Этот начальный адрес указателя стека и код запуска C обычно определяются и предоставляются поставщиком микросхемы?

Или мы, разработчики программного обеспечения / программного обеспечения, можем вручную модифицировать или создать Cкод запуска и указать указатель стека?Эта часть меня смущает.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Расположение стека в ОЗУ почти всегда настраивается с помощью программного обеспечения.В вашем скрипте компоновщика для цепочки инструментов будет область с именем .stack или аналогичная, которую вы можете разместить по определенному адресу или задать определенный размер.Это только часть отображения памяти.

Первое, что нужно сделать в любом коде запуска, - установить указатель стека.Это должно быть сделано через ассемблер, так как C не имеет средств для прямой записи в указатель стека.На некоторых ядрах, таких как ARM, указатель стека автоматически устанавливается аппаратно после сброса, исходя из значения, которое ваш скрипт компоновщика поместил в таблицу векторов и запрограммировал во флэш-памяти.

Таким образом, обычно поставщик кремния почти всегдаоставляет это полностью на усмотрение программиста.Однако ядро ​​определяет, есть ли стек с повышением или понижением.Самым распространенным на сегодняшний день является обратный отсчет, но в некоторых архитектурах странных персонажей есть стеки с повышающим счетом (наиболее известный PIC).

Что касается того, где установлен указатель стека, вы найдете его очень рано встартовый код («CRT»), если такой код поставляется с вашей цепочкой инструментов.Как правило, он принимает значение, полученное из скрипта компоновщика, но вы также можете жестко его кодировать, если хотите.Это должно быть сделано до того, как будет выполнен любой код C, поскольку C любит использовать стек.

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

0 голосов
/ 20 февраля 2019

Каждая архитектура делает это по-своему.У контроллеров ARM Cortex начальное местоположение указателя стека хранится как первое 32-битное значение в векторной таблице.Это значение загружается оборудованием при загрузке UC.Таким образом, этот адрес полностью контролируется программистом.

Тогда процедура запуска может изменить его или установить двойной стек (один для потока, другой для привилегированного режима).

...