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

Универсальный порт для Cortex-Mx (GCC) залит в репозиторий.

1 час назад, injen-d сказал:

Обнаружился следующий косяк:

Спасибо за сигнал!

1 час назад, injen-d сказал:

Решение:

заменить операцию выравнивания на 


uintptr_t sptr = (((uintptr_t)Stack - 8) & 0xFFFFFFF8UL) + 8;

В этом случае в PSP всегда будет записываться выровненное значение.

А то, что StackPointer у спящего процесса будет не выровненным, так это не имеет значения, так как при пробуждении будет восстановлен контекст и он выровняется перед записью его в PSP.

Хм... Сейчас покопал историю, и нашёл, что раньше так и было (см вот этот коммит). В этом коммите я сделал, чтобы стек был выровнен после сохранения контекста, и добавил комментарий:
 

Цитата

This means that we must get top of stack aligned _after_ context "pushing", at interrupt entry.

Откуда я это взял - сейчас с ходу не вспомню. Все источники, что я нашёл сейчас, говорят, что правильно было как раньше. Я ещё повспоминаю, потом отпишусь.

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


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

2 часа назад, jcxz сказал:

А почему в scmRTOS сохраняются только 17 регистров FPU, а не все 33?

17 - это не число регистров FPU, это размер начального контекста, без плавучих регистров.

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


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

Прочитать обсуждаемый исходный код лень, но поспорить по-прежнему хочется. Ок, разжёвываю (хотя мы вроде б не в теме для начинающих).

Обсуждаемая переменная используется ТОЛЬКО при старте ОС, при переключении задач работает совсем другой кусок кода. И семнадцать 32-битных (stack_item_t в 64 бита для кортекса-М. хаха) регистров отсчитываются только в этом случае и только на M4 с ВКЛЮЧЕННОЙ аппаратной плавучкой. Более того, если открыть исходный код (Антон даже ссылку давал. файл старый, но по сути ничего не поменялось), можно посмотреть, какие именно регистры туда "сохраняются".

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


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

3 hours ago, AHTOXA said:

Все источники, что я нашёл сейчас, говорят, что правильно было как раньше.

Я, конечно, так себе источник, но printf (что из большой newlib, что из newlib-nano) сейчас плавучку не печатают. При выравнивании стека "как раньше" проблемы нет.

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

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


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

36 минут назад, esaulenka сказал:

Я, конечно, так себе источник, но printf (что из большой newlib, что из newlib-nano) сейчас плавучку не печатают. При выравнивании стека "как раньше" проблемы нет.

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

Очень хорошо, что вы подтвердили наличие проблемы. Я ещё раз почитал ARM IHI 0046B, и уже почти уверен, что надо сделать как было, просто надеюсь, что в голове всплывут причины, побудившие меня сделать как сейчас. Ведь были же какие-то причины.

Если за пару дней не всплывут, то исправлю всё равно:)

ЗЫ. Уже сколько раз говорю себе, что надо подробнее записывать в commit message причины изменений...

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


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

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

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

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

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

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

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

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

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

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