Цитата(FFFF @ Sep 1 2018, 18:21)

А меня жаба душит транжирить SVC на такое... Вообще не хочу, чтобы FreeRTOS использовала SVC.
а Вы как бы распорядились SVC?
Сам факт того, что это прерывание используется только 1 раз... Ужас.
Даже если оно мне не нужно - у меня внутренний когнитивный диссонанс
Цитата(jcxz @ Sep 1 2018, 19:27)

Что-то у Вас мухи с котлетами намешаны

Зачем ещё и указатель стека прерываний на начало стека из таблицы прерываний ставить?
Это вобщем-то не относится к данной задаче. Хотя конечно хозяин - барин.
...
Опять мухи с котлетами. Тогда сюда ещё до кучи и инициализацию пинов впендюрить можно.
...
Зачем?
Не мое. Это я сейчас порт на Cortex-M4 открыл и сюда вставил

Нужно оно там или не нужно - это другой вопрос, конечно же.
Цитата
Да и вроде - невозможно так записать что-то в CONTROL. Нужно юзать EXC_RETURN.
В привилегированном режиме можно. EXC_RETURN используется при входе в прерывание и выходе из него.
Цитата
Ну вообще-то тут R0-R3,R12,LR,XPSR совершенно лишние.
Вроде как достаточно восстановить R4-R11, занести в LR нужное значение и сделать BX LR (сымитировать возврат из прерывания с переключением на нужный стек и в нужный режим).
В этом и фишка, что я хочу полностью избавиться от SVC, передать управление на первую задачу без использования прерывания. Поэтому я и предложил восстановить весь регистровый стек, потому как мы не в прерывании еще находимся, поэтому R0-R3, R12, LR, XPSR восстановить нужно будет.
Интересно вот, что будет если в привилегированном режиме
потока записать EXC_RETURN в LR со значениями (PSP + Thread Mode) и сделать BX LR... Какой-нибудь Usage Fault, скорее всего.
Цитата
В результате режим процессора Вы не переключили и он остался в handler-режиме.
Для переключения нужно юзать BX LR с правильным значением в нём.
И опять же - ISB тут лишняя.
Повторюсь, что режим процессора должен оставаться в Thread. Если бы прерывание было - как в исходном примере, то я не задался бы целью обойти использование SVC
ISB лишняя, да... Там весь порт кривущий, но работает. Вычищаю потихоньку, что нужно мне. Вот и решил заморочиться, избавившись от такого не очень, на мой взгляд, разумного использования SVC. Я еще понимаю, если бы оно вызывалось раз в день. Но тут только при старте приложения...
Цитата
PS: Да и, как видно по приведённому Вами коду, FreeRTOS использует не всю SVC, а только SVC 0. Остальные 255 - свободны. Неужто Вам 255 не хватит? Для чего???
Мне-то хватит. Просто хочу свои SVC как можно короче сделать, без лишних телодвижений. А подход, предложенный индусами-портировщиками, мне не очень нравится. Поэтому и гадаю, как красиво сделать
Цитата
В uCOS вообще не заморачиваются: они изначально заносят в PSP=0, а потом просто программно возбуждают PendSV (как для любого программного переключения контекста), а в ISR PendSV делают проверку если PSP==0 (начальный старт первой задачи) - просто пропускают сохранение контекста сразу переходя к восстановлению контекста самой приоритетной задачи.
Конечно при этом в переключатель контекста добавляется одна лишняя команда, но имхо - это несущественно.
Воот. Вот это уже другое дело. Я тоже рассматривал такой вариант, но как раз лишние пару инструкций проверки травят душу перфекциониста
Вот и думаю, что это сделать, скорее всего, можно без прерываний и лишних телодвижений в переключателе контекста (я хотел бы, чтобы он был как можно короче и быстрее). Просто нужно исхитриться и восстановить весь контекст выполнения первой запускаемой задачи.