AHTOXA 25 October 12, 2018 Posted October 12, 2018 · Report post 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. Откуда я это взял - сейчас с ходу не вспомню. Все источники, что я нашёл сейчас, говорят, что правильно было как раньше. Я ещё повспоминаю, потом отпишусь. Quote Share this post Link to post Share on other sites More sharing options...
AHTOXA 25 October 12, 2018 Posted October 12, 2018 · Report post 2 часа назад, jcxz сказал: А почему в scmRTOS сохраняются только 17 регистров FPU, а не все 33? 17 - это не число регистров FPU, это размер начального контекста, без плавучих регистров. Quote Share this post Link to post Share on other sites More sharing options...
esaulenka 10 October 12, 2018 Posted October 12, 2018 · Report post Прочитать обсуждаемый исходный код лень, но поспорить по-прежнему хочется. Ок, разжёвываю (хотя мы вроде б не в теме для начинающих). Обсуждаемая переменная используется ТОЛЬКО при старте ОС, при переключении задач работает совсем другой кусок кода. И семнадцать 32-битных (stack_item_t в 64 бита для кортекса-М. хаха) регистров отсчитываются только в этом случае и только на M4 с ВКЛЮЧЕННОЙ аппаратной плавучкой. Более того, если открыть исходный код (Антон даже ссылку давал. файл старый, но по сути ничего не поменялось), можно посмотреть, какие именно регистры туда "сохраняются". Quote Share this post Link to post Share on other sites More sharing options...
esaulenka 10 October 12, 2018 Posted October 12, 2018 · Report post 3 hours ago, AHTOXA said: Все источники, что я нашёл сейчас, говорят, что правильно было как раньше. Я, конечно, так себе источник, но printf (что из большой newlib, что из newlib-nano) сейчас плавучку не печатают. При выравнивании стека "как раньше" проблемы нет. Ну и здравый смысл говорит, что указатель стека важен только в момент вызова этих функций, а не в момент переключения контекста. Quote Share this post Link to post Share on other sites More sharing options...
AHTOXA 25 October 12, 2018 Posted October 12, 2018 · Report post 36 минут назад, esaulenka сказал: Я, конечно, так себе источник, но printf (что из большой newlib, что из newlib-nano) сейчас плавучку не печатают. При выравнивании стека "как раньше" проблемы нет. Ну и здравый смысл говорит, что указатель стека важен только в момент вызова этих функций, а не в момент переключения контекста. Очень хорошо, что вы подтвердили наличие проблемы. Я ещё раз почитал ARM IHI 0046B, и уже почти уверен, что надо сделать как было, просто надеюсь, что в голове всплывут причины, побудившие меня сделать как сейчас. Ведь были же какие-то причины. Если за пару дней не всплывут, то исправлю всё равно:) ЗЫ. Уже сколько раз говорю себе, что надо подробнее записывать в commit message причины изменений... Quote Share this post Link to post Share on other sites More sharing options...
AHTOXA 25 October 29, 2018 Posted October 29, 2018 · Report post Я не забыл, просто времени нет. Обязательно исправлю. Quote Share this post Link to post Share on other sites More sharing options...