Jump to content
    

Универсальный порт для 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.

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

3 hours ago, AHTOXA said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...