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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Stack, 8-byte alligment, откуда ноги?
DASM
сообщение Aug 1 2018, 15:48
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Вчера ловил интересный глюк, с UcOS, достаточно добавить переменную любую почти в любом месте кода и все рушилось. Но если добавить ещё одну - снова работало. Оказалось в итоге что это меняет положение стека задач в оське, и если он не 8allign то рушится. В доках Арм что то о требовании такого выравнивания для внешней памяти. Но тут то внутренняя. Откуда ноги, ткните плз. Просто ради интереса
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 1 2018, 15:54
Сообщение #2


Гуру
******

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



Цитата(DASM @ Aug 1 2018, 18:48) *
Откуда ноги, ткните плз. Просто ради интереса

LDRD/STRD, работа с 64-битными данными.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 1 2018, 16:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(aaarrr @ Aug 1 2018, 18:54) *
LDRD/STRD, работа с 64-битными данными.

Ну хорошо, я решил свою проблему, создав сегмент с аллигн 8 и поместив в него стеки задач ос. Но до того, обычный проект совершенно, у него стек просто на конец озу чипа, в сегменте с алигн4. Почему работает? Да и все равно не совсем ясно, если в стек пушить 4байтные данные, то ведь станет криво. Чего то не понимаю я. Или арм при заталкивании в стек, допустим одного байта, на самом деле меняет указатель стека на 8? Компа нет под рукой, но стало интересно
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 1 2018, 16:19
Сообщение #4


Гуру
******

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



Цитата(DASM @ Aug 1 2018, 19:09) *
Да и все равно не совсем ясно, если в стек пушить 4байтные данные, то ведь станет криво.

При вызове функции должно быть ровно, в остальное время все равно.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 1 2018, 16:35
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



То есть компилер при вызове примет меры для выравнивания, зная что стек в 8байтном сегменте? А во всех этих хелло ворд как такое соблюдается? Просто потому что конец озу и так кратен 8 ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 1 2018, 17:50
Сообщение #6


Гуру
******

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



Цитата(DASM @ Aug 1 2018, 19:35) *
То есть компилер при вызове примет меры для выравнивания, зная что стек в 8байтном сегменте?

Да, примет.

Цитата(DASM @ Aug 1 2018, 19:35) *
А во всех этих хелло ворд как такое соблюдается? Просто потому что конец озу и так кратен 8 ?

Про всякие хелло ворды ничего не скажу, но требованию уже много лет.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 2 2018, 03:10
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Ясно, спасибо.
Go to the top of the page
 
+Quote Post
MasterElectric
сообщение Aug 2 2018, 07:16
Сообщение #8


Участник
*

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



Это связано с выравниванием стекового фрейма к двойному слову. Это можно отключить в NVIC регистр CCR бит STKALIGN, после чего выравнивание будет к слову. Но отключать можно не во всех МК, m7 нельзя точно. По идее падало во время переключения задач, т.е. при вызове прерывания.

Сообщение отредактировал MasterElectric - Aug 2 2018, 07:19
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 2 2018, 09:31
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aaarrr @ Aug 1 2018, 18:54) *
LDRD/STRD, работа с 64-битными данными.

Это не так. LDRD/STRD требуют выравнивания только на 4.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2018, 09:55
Сообщение #10


Гуру
******

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



Цитата(jcxz @ Aug 2 2018, 12:31) *
Это не так. LDRD/STRD требуют выравнивания только на 4.

- Не на всех архитектурах это разрешено по умолчанию (ARMv5TE, ARMv6)
- Эффективнее работать с выравниванием (ARMv7-M)
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 2 2018, 10:18
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(DASM @ Aug 1 2018, 18:48) *
В доках Арм что то о требовании такого выравнивания для внешней памяти. Но тут то внутренняя. Откуда ноги, ткните плз.

Они ссылаются на LDRD, STRD, причём в разных вариантах архитектуры ARM эффект может быть или не быть, но сделали стандартом, чтобы не путаться. Тут.

Цитата(DASM @ Aug 1 2018, 18:48) *
Оказалось в итоге что это меняет положение стека задач в оське, и если он не 8allign то рушится.

Компилятор, зная, что стек выравнен на 8 байт, может использовать такую арифметику с адресами, которая ломается при отсутствии выравнивания. Вот пример.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 2 2018, 15:55
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Итого в линкер файлах того же gcc мина лежит? Там везде стек а аллигн4 сегментах. Либо его библиотеки и соглашения о вызовах нечуствительны к этому, а fault я получаю потому что ucOS что то там упускает? Она явно написана с требованием аллигн8, в вариантах под IAR везде pragma locaton stacks, и он в icf отдельно обьявлен с аллигн8. Хотелось бы понять, причина в ОСи такой, или все же аллигн8 необязателен без нее?

И еще тупой вопрос. Сегменты с аллигнами это ведь для линкера. Компилятор вообще в курсе?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2018, 16:00
Сообщение #13


Гуру
******

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



Цитата(DASM @ Aug 2 2018, 18:52) *
Хотелось бы понять, причина в ОСи такой, или все же аллигн8 необязателен без нее?

Обязателен, т.к. это требование прописано в ATPCS/AAPCS с 2000 года (после введения ARMv5).
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 2 2018, 16:03
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Gcc не в курсе? Или кто делает lds файлы.. честно даже не знаю. Ну нет там аллигн8 (насколько помню), с телефона пишу, не посмотреть
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2018, 16:03
Сообщение #15


Гуру
******

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



Цитата(DASM @ Aug 2 2018, 18:55) *
Итого в линкер файлах того же gcc мина лежит? Там везде стек а аллигн4 сегментах.

Мина. Но такая, что вряд ли когда рванет.

Цитата(DASM @ Aug 2 2018, 18:55) *
И еще тупой вопрос. Сегменты с аллигнами это ведь для линкера. Компилятор вообще в курсе?

А как он может быть в курсе? Он просто считает, что стек выровнен на 2 слова.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 7th July 2025 - 09:37
Рейтинг@Mail.ru


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