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

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


Гуру
******

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



Цитата(aaarrr @ Aug 2 2018, 19:00) *
2000 года (после введения ARMv5).

Господи, как время летит. Вчера же делали плату на AT91M55800A, бешеные 33 МГц, аж 8к озу и интерфейс к внешней. Так и не доделали. А он еще и in production. Доделать и в музей )). То есть если в lds написать размер сегмента (что был) минус 4 байта - и привет hard fault?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2018, 16:13
Сообщение #17


Гуру
******

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



Цитата(DASM @ Aug 2 2018, 19:07) *
Господи, как время летит. Вчера же делали плату на AT91M55800A, бешеные 33 МГц, аж 8к озу и интерфейс к внешней. Так и не доделали. А он еще и in production. Доделать и в музей ))

55800 - это возмутительный свежак, то ли дело 40800. У меня, возможно, еще где-то лежат. А платы вот выкинул.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 2 2018, 16:18
Сообщение #18


Гуру
******

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



Точно уже не помню, может и 40800, 2002 год был, с ShiphT собирались, мегаджон в курсе наверное
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 2 2018, 17:07
Сообщение #19


Гуру
******

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



Цитата(DASM @ Aug 2 2018, 19:03) *
Gcc не в курсе? Или кто делает lds файлы.. честно даже не знаю. Ну нет там аллигн8 (насколько помню), с телефона пишу, не посмотреть

Уже потратили кучу времени на написание множества сообщений, а просто взять и потратить пару минут на проверку - не судьба?
Ещё ни в одном из использованных Cortex-M я не сталкивался с исключением на LDRD/STRD из-за выравнивания всего на 32 бита. И Вашем МК я думаю эти исключения на 90% не из-за этого.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 2 2018, 18:09
Сообщение #20


Гуру
******

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



Не сталкивались и хорошо. А мне интересно кто сталкивался. Может и еще что узнаю. А то в М7 ещё и линии кэша есть, а паре с restrict может стать совсем весело. И кстати, были не исключения, в хард фалт не валился, просто частично не работал. И отследить как и почему не очень понятно мне как
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 3 2018, 04:47
Сообщение #21


Местный
***

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



Добавлю лишь, что в компиляторах ключ PRESERVE8 или подобный говорит, чтобы этот самый компилятор следил за выравниванием на 8 байт перед и после вызова функций.
Бит STACKALIGN в регистрах управления NVIC влияет на корректировку адреса стека только при входе в исключение, поскольку они асинхронны и могут произойти между вызовами функций, где стек может быть, собственно, не выровнен на требуемую границу.

P.S. DASM, вот в FreeRTOS, например, даже простейший диспетчер динамической памяти будет выровнен независимо от положения самого статического массива Heap. Там проверяется, находится ли он по границе, если нет - обрезает первые элементы кучи, чтобы действительный адрес кучи был выровнен. А дальше при каждом выделении обеспечивается механизм "добития" запрашиваемого количества до выровненного.

Сообщение отредактировал Arlleex - Aug 3 2018, 04:52
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 3 2018, 07:08
Сообщение #22


Гуру
******

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



Цитата(DASM @ Aug 2 2018, 18:55) *
Итого в линкер файлах того же gcc мина лежит? Там везде стек а аллигн4 сегментах. Либо его библиотеки и соглашения о вызовах нечуствительны к этому, а fault я получаю потому что ucOS что то там упускает?

Сталкивался с тем, что sprintf на плавучке глючил, когда нет выравнивания. Выдавал не то, что нужно, но не валился. Уже не припомню, был это яр или gcc. Моя версия: компилятор может использовать факт, что SP кратен 8, при генерации кода в адресной арифметике. Кстати, плохая адресная арифметика к разным вещам может приводить. Может тихо глюкануть, а может и глобально всё поломать.
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 3 2018, 09:40
Сообщение #23


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

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 3 2018, 21:30
Сообщение #24


Гуру
******

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



Цитата(Forger @ Aug 3 2018, 12:40) *
В принципе не обязательно для стеков задач создавать отдельный сегмент со своим выравниваем. Иначе придется размер стека каждой задачи делать кратным 8 байт.

И что это реально так сильно нужно - задавать размер стека с точностью до слова? Зачем??
Выравнивание на 8 и размер кратным 8 и нечего впустую мудрить.
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 3 2018, 22:38
Сообщение #25


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

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



Цитата(jcxz @ Aug 4 2018, 00:30) *
И что это реально так сильно нужно - задавать размер стека с точностью до слова? Зачем??

"Слово" в данном случае = int64, т.е. 8 байт. Или я не понял вопроса?

Цитата
Выравнивание на 8 и размер кратным 8 и нечего впустую мудрить.

Что я и делаю (см. пример выше).

Сегмент, по-моему, имеет смысл выделять под стеки, если камень имеет отдельное спец. быстрое ОЗУ, "прикрученное" к ядру специально для подобных целей.
Туда же еще смысл класть обработчики прерываний вместе с самой таблицей векторов.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

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

 


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


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