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

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

11 минут назад, injen-d сказал:

Вот здесь рассказано, что s0-s15 сохраняются автоматически, и как узнать, что FPU использовался на момент прерывания

Я (в отличие от Вас) знаю как сохраняются регистры FPU при прерывании. Но какое это имеет отношение к задачам ОС?

Это во-первых, а во-вторых - при прерывании сохраняются только регистры FPSCR,S0...S15 (и тоже кстати - опционально). Вы хотя-бы сами прочитайте то, на что ссылаетесь.

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


Ссылка на сообщение
Поделиться на другие сайты
3 minutes ago, jcxz said:

Я (в отличие от Вас) знаю как сохраняются регистры FPU при прерывании. Но какое это имеет отношение к задачам ОС?

Это во-первых, а во-вторых - при прерывании сохраняются только регистры FPSCR,S0...S15 (и тоже кстати - опционально). Вы хотя-бы сами прочитайте то, на что ссылаетесь.

Вам просто пообщаться хочется? К чему эти вопросы ни о чем и эмоции?

Если у вас есть претензии к реализации данного порта scmRTOS, то вы немного не по адресу вопросы задаете.

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


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, injen-d сказал:

Если у вас есть претензии к реализации данного порта scmRTOS, то вы немного не по адресу вопросы задаете.

Так если Вы не знаете как реализовано сохранение контекста в scmRTOS, то зачем тогда рассказываете как оно там сделано? Разве не Ваши слова:

Цитата

Проблема в том, что для включенной аппаратной плавучке мы имеем CONTEXT_SIZE = 17 * sizeof(stack_item_t)

Почему 17, а не 33 или 34?

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


Ссылка на сообщение
Поделиться на другие сайты
1 minute ago, jcxz said:

Так если Вы не знаете как реализовано сохранение контекста в scmRTOS, то зачем тогда рассказываете как оно там сделано? Разве не Ваши слова:

Почему 17, а не 33 или 34?

С чего вы взяли, что я вам здесь должен что-то объяснять? Я писал автору данного порта scmRTOS. Он знает как устроена scmRTOS и он поймет о чем я. (в отличие от вас ;)

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


Ссылка на сообщение
Поделиться на другие сайты
20 минут назад, injen-d сказал:

С чего вы взяли, что я вам здесь должен что-то объяснять? Я писал автору данного порта scmRTOS. Он знает как устроена scmRTOS и он поймет о чем я. (в отличие от вас ;)

А с чего вы взяли что я спрашивал вас? Я спрашивал того, кто знает (в отличие от вас).

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


Ссылка на сообщение
Поделиться на другие сайты
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, это размер начального контекста, без плавучих регистров.

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


Ссылка на сообщение
Поделиться на другие сайты
1 hour ago, jcxz said:

Так если Вы не знаете как реализовано сохранение контекста в scmRTOS, то зачем тогда рассказываете как оно там сделано?

Встречный вопрос. Если Вы не знаете, как это реализовано в scmRTOS, более того, не удосужились прочитать обсуждаемый исходник, что Вы делаете в данной теме? Строите теории по двум строчкам, вырванным из контекста?

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


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, esaulenka сказал:

Встречный вопрос. Если Вы не знаете, как это реализовано в scmRTOS, более того, не удосужились прочитать обсуждаемый исходник, что Вы делаете в данной теме? Строите теории по двум строчкам, вырванным из контекста?

Если бы Вы удосужились прочитать именно мой исходный вопрос, то могли бы заметить, что мой вопрос касался конкретной фразы injen-d:

Цитата

Проблема в том, что для включенной аппаратной плавучке мы имеем CONTEXT_SIZE = 17 * sizeof(stack_item_t)

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

И встречный вопрос - если Вам нечего сказать по заданному вопросу, то зачем тогда отвечаете? AHTOXA уже вполне достаточно всё объяснил: указанный размер контекста для случая без аппаратной плавучки.

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


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

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

Обсуждаемая переменная используется ТОЛЬКО при старте ОС, при переключении задач работает совсем другой кусок кода. И семнадцать 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 причины изменений...

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация