aaarrr 69 27 марта Опубликовано 27 марта · Жалоба 7 hours ago, TOG said: Может из оси можно выйти ? Типа завершить работу, попасть снова в main и от туда уже передать управление другому приложению ? https://mcuoneclipse.com/2019/01/20/freertos-how-to-end-and-restart-the-scheduler/ 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 29 марта Опубликовано 29 марта · Жалоба On 3/27/2024 at 12:24 PM, jcxz said: 3. Сделать все необходимые дела в ISR. Кто мешает вам так сделать? Вроде как всё элементарно. Немного я затупил. Когда я делаю переход из обработчика прерывания в другое приложение, то флаг в "Interrupt Active Bit Register" остается висеть "Active". Получается, что я НЕ вышел из обработчика прерывания. И как результат, после перехода в другое приложение прерывание таймера не срабатывает, т.к. процессор думает, что мы из обработчика еще не вышли. Я не понимаю как процессор узнает, что мы выходим из обработчика прерывания ? Объясните пожалуйста на пальцах для тупого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 29 марта Опубликовано 29 марта · Жалоба Вот говорил же, захотелось вам всадить себе пулю в колено, а теперь рубашку на лоскуты режете. У процессора есть 2 внутренних режима: режим потока и режим обработчика прерывания. При входе в прерывание активизируется последний. При выходе из обработчика вы возвращаетесь в режим потока. Предположу, что jcxz имел в виду не тупо переходить на приложение из прерывания, а в прерывании подменить LR/PC/SP фреймстека так, чтобы вернуться в привелегированном режиме потока сразу на приложение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 29 марта Опубликовано 29 марта · Жалоба 5 часов назад, TOG сказал: Я не понимаю как процессор узнает, что мы выходим из обработчика прерывания ? Объясните пожалуйста на пальцах для тупого. Раз уж решили править стек и прочее, то может стоит сперва хотя-бы почитать как работает система прерываний в вашем CPU? Всё детально разжёвано в документации на ядро. И как происходит выход из прерывания, и какие есть режимы CPU, и переключение стеков (MSP/PSP) - всё там есть. Если нужно выйти из ISR в определённый адрес, то можно подменить в стеке адрес возврата и выйти штатным образом. Также можно отредактировать содержимое LR, чтобы изменить режим CPU и активный стек после выхода. Но совершенно непонятно - на кой это нужно? На кой вообще потребовалось править MSP при запущенной ОС? Складывается впечатление, что вы не понимаете как работает ОС в целом. Поэтому и такие странные хотелки. ЗЫ: "Объяснять на пальцах" всё это - невозможно. Раз уж решили заниматься системными вещами и вмешиваться в работу ОС, то нужно предварительно глубоко изучить функционирование CPU и научиться читать документацию. Также нужно знать и уметь писать на ассемблере. Иначе - лучше не заниматься не своим делом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 29 марта Опубликовано 29 марта · Жалоба Сделал. Почитал Джозефа Ю. Загрузил в стек нужные значения: 0xFFFFFFF9 (EXC_RETURN), 0x00000000 (R0), 0x00000000 (R1), 0x00000000 (R2), 0x00000000 (R3), 0x00000000 (R12), 0xFFFFFFFF (LR), AppAdr+1 (PC) (Адрес приложения), 0x010000000 (xPSR.ThreadMode = 1) и далее команда POP {PC} делает все остальное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться