|
Stack, 8-byte alligment, откуда ноги? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Aug 1 2018, 16:09
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Цитата(aaarrr @ Aug 1 2018, 18:54)  LDRD/STRD, работа с 64-битными данными. Ну хорошо, я решил свою проблему, создав сегмент с аллигн 8 и поместив в него стеки задач ос. Но до того, обычный проект совершенно, у него стек просто на конец озу чипа, в сегменте с алигн4. Почему работает? Да и все равно не совсем ясно, если в стек пушить 4байтные данные, то ведь станет криво. Чего то не понимаю я. Или арм при заталкивании в стек, допустим одного байта, на самом деле меняет указатель стека на 8? Компа нет под рукой, но стало интересно
|
|
|
|
|
Aug 1 2018, 17:50
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(DASM @ Aug 1 2018, 19:35)  То есть компилер при вызове примет меры для выравнивания, зная что стек в 8байтном сегменте? Да, примет. Цитата(DASM @ Aug 1 2018, 19:35)  А во всех этих хелло ворд как такое соблюдается? Просто потому что конец озу и так кратен 8 ? Про всякие хелло ворды ничего не скажу, но требованию уже много лет.
|
|
|
|
|
Aug 2 2018, 07:16
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 19-07-18
Пользователь №: 106 151

|
Это связано с выравниванием стекового фрейма к двойному слову. Это можно отключить в NVIC регистр CCR бит STKALIGN, после чего выравнивание будет к слову. Но отключать можно не во всех МК, m7 нельзя точно. По идее падало во время переключения задач, т.е. при вызове прерывания.
Сообщение отредактировал MasterElectric - Aug 2 2018, 07:19
|
|
|
|
|
Aug 2 2018, 10:18
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(DASM @ Aug 1 2018, 18:48)  В доках Арм что то о требовании такого выравнивания для внешней памяти. Но тут то внутренняя. Откуда ноги, ткните плз. Они ссылаются на LDRD, STRD, причём в разных вариантах архитектуры ARM эффект может быть или не быть, но сделали стандартом, чтобы не путаться. Тут. Цитата(DASM @ Aug 1 2018, 18:48)  Оказалось в итоге что это меняет положение стека задач в оське, и если он не 8allign то рушится. Компилятор, зная, что стек выравнен на 8 байт, может использовать такую арифметику с адресами, которая ломается при отсутствии выравнивания. Вот пример.
|
|
|
|
|
Aug 2 2018, 16:03
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(DASM @ Aug 2 2018, 18:55)  Итого в линкер файлах того же gcc мина лежит? Там везде стек а аллигн4 сегментах. Мина. Но такая, что вряд ли когда рванет. Цитата(DASM @ Aug 2 2018, 18:55)  И еще тупой вопрос. Сегменты с аллигнами это ведь для линкера. Компилятор вообще в курсе? А как он может быть в курсе? Он просто считает, что стек выровнен на 2 слова.
|
|
|
|
|
Aug 3 2018, 04:47
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Добавлю лишь, что в компиляторах ключ PRESERVE8 или подобный говорит, чтобы этот самый компилятор следил за выравниванием на 8 байт перед и после вызова функций. Бит STACKALIGN в регистрах управления NVIC влияет на корректировку адреса стека только при входе в исключение, поскольку они асинхронны и могут произойти между вызовами функций, где стек может быть, собственно, не выровнен на требуемую границу.
P.S. DASM, вот в FreeRTOS, например, даже простейший диспетчер динамической памяти будет выровнен независимо от положения самого статического массива Heap. Там проверяется, находится ли он по границе, если нет - обрезает первые элементы кучи, чтобы действительный адрес кучи был выровнен. А дальше при каждом выделении обеспечивается механизм "добития" запрашиваемого количества до выровненного.
Сообщение отредактировал Arlleex - Aug 3 2018, 04:52
|
|
|
|
|
Aug 3 2018, 07:08
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(DASM @ Aug 2 2018, 18:55)  Итого в линкер файлах того же gcc мина лежит? Там везде стек а аллигн4 сегментах. Либо его библиотеки и соглашения о вызовах нечуствительны к этому, а fault я получаю потому что ucOS что то там упускает? Сталкивался с тем, что sprintf на плавучке глючил, когда нет выравнивания. Выдавал не то, что нужно, но не валился. Уже не припомню, был это яр или gcc. Моя версия: компилятор может использовать факт, что SP кратен 8, при генерации кода в адресной арифметике. Кстати, плохая адресная арифметика к разным вещам может приводить. Может тихо глюкануть, а может и глобально всё поломать.
|
|
|
|
|
Aug 3 2018, 09:40
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(DASM @ Aug 1 2018, 19:09)  Ну хорошо, я решил свою проблему, создав сегмент с аллигн 8 и поместив в него стеки задач ос. В принципе не обязательно для стеков задач создавать отдельный сегмент со своим выравниваем. Иначе придется размер стека каждой задачи делать кратным 8 байт. Но можно сделать с нужным выравниваем стек каждой задачи, попутно "вынудив" компилятор выравнивать еще и размер стека автоматом. Например, я делаю так (лишнее "вырезал"): Код class AbstractThread { public: .... using StackItem = uint64_t; using StackSize = uint32_t; ... }
....
template <AbstractThread::StackSize STACK_SIZE = THREAD_DEFAULT_STACK_SIZE> class Thread : public AbstractThread { .... private: StackItem stack[STACK_SIZE/(sizeof(StackItem))] __attribute__ ((aligned(sizeof(StackItem)))); }; Используется расширения самого компилятора, в данном случаем речь про __attribute__ ((aligned(....))))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Aug 3 2018, 22:38
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ Aug 4 2018, 00:30)  И что это реально так сильно нужно - задавать размер стека с точностью до слова? Зачем?? "Слово" в данном случае = int64, т.е. 8 байт. Или я не понял вопроса? Цитата Выравнивание на 8 и размер кратным 8 и нечего впустую мудрить. Что я и делаю (см. пример выше). Сегмент, по-моему, имеет смысл выделять под стеки, если камень имеет отдельное спец. быстрое ОЗУ, "прикрученное" к ядру специально для подобных целей. Туда же еще смысл класть обработчики прерываний вместе с самой таблицей векторов.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|