|
Прерывание в прерывании, Для реализации Super Simple Tasker |
|
|
|
 |
Ответов
|
Nov 7 2017, 17:28
|

Знающий
   
Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423

|
Смотрел я исходники ОС, но они все по похожему принципу сделаны - переключение между разными стеками. Вот например: для каждого потока выделен свой стек. Для переключения между двумя контекстами вызывается прерывание PendSV (при этом на стек складываются R0-R3) и в PendSV_Handler сохраняются оставшиеся регистры (R4-R11), потом вызывается функция os_context_switch_hook, которая возвращает указатель на стек другой задачи. С этого стека восстанавливаем (R11-R4) , переписываем LR и выходим из PendSV_Handler, при этом восстанавливаются (R3-R0). Всё, мы переключились на другую задачу/другой стек. А можете примерно так-же объяснить, что мне сделать для пререключения задач по методике SST? Выполняем мы задачу А. Так же через вызов прерывания PendSV хотим запустить более приоритетную задачу (запустить функцию). Попали в PendSV_Handler, сохранили (R4-R11) на текущем стеке. Всё, контекст задачи A сохранён. Как теперь правильно запустить задачу В? Сделать просто вызов LDR R1, =taskB, BLX R1 нельзя - функция будет выполняться в контексте прерывания. Как правильно сделать? Из прерывания если выйдем ( BX LR) мы попадём обратно в задачу А. Как мне выйти из прерывания и при этом запустить функцию taskB?
--------------------
|
|
|
|
|
Nov 7 2017, 21:33
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(arhiv6 @ Nov 7 2017, 19:28)  Смотрел я исходники ОС, но они все по похожему принципу сделаны - переключение между разными стеками. ... Да, примерно так и есть. Цитата(arhiv6 @ Nov 7 2017, 19:28)  А можете примерно так-же объяснить, что мне сделать для пререключения задач по методике SST? Выполняем мы задачу А. Так же через вызов прерывания PendSV хотим запустить более приоритетную задачу (запустить функцию). Попали в PendSV_Handler, сохранили (R4-R11) на текущем стеке. "На текущем" - это на каком? На стеке обработчиков прерываний что-ль? Вы имеете представление, что в ядре Cortex-M есть два стека (аппаратных) - MSP/PSP? И зачем так сделано? Цитата(arhiv6 @ Nov 7 2017, 19:28)  Всё, контекст задачи A сохранён. Как теперь правильно запустить задачу В? Сделать просто вызов LDR R1, =taskB, BLX R1 нельзя - функция будет выполняться в контексте прерывания. Как правильно сделать? Из прерывания если выйдем ( BX LR) мы попадём обратно в задачу А. Как мне выйти из прерывания и при этом запустить функцию taskB? Так Вы же читали как это делают переключатели задач РТОС - сделайте точно так же. Сохраните все регистры на стеке прерванной задачи, также в сегмент данных прерванной задачи сохраните её SP, загрузите SP новой задачи в PSP, восстановите со стека новой задачи ту часть регистров, которая программно сохраняется (R4-R11) и всё - можете выходить из прерывания в контекст уже новой задачи (так как на её стеке сейчас остались регистры, аппаратно сохраняемые при входе в ISR). Естественно - перед первым запуском каждой задачи, её стек нужно проинициализировать корректными значениями регистров расположенных именно в том порядке, в котором они сохраняются/восстанавливаются при входе и внутри PendSV. Если нужно возбуждать переключение задач из ISR аппаратного прерывания, то естественно в ядре Cortex-M для этого нужно программно возбудить PendSV, выйти из аппаратного ISR и уже в ISR PendSV переключить контекст. Именно такой метод и был задуман проектировщиками ядра. Чтобы такой механизм работал, необходимо чтобы приоритет PendSV был ниже приоритета любого аппаратного прерывания. И вот когда вы всё это проделаете, то получите стандартную РТОС для Cortex-M  Именно поэтому вам и пишут, что смысла изобретать свой лисапед нет никакого. Разве что в целях собственного ликбеза. Остаться внутри ISR аппаратного прерывания каким-то образом не выходя из него, а что-то там замутив со стеком - невозможно без нарушения работы всей системы прерываний - пока не выйдете из этого ISR это прерывание больше не вызовется (и менее приоритетные тоже). Так что такой способ, который Вы описали в первом сообщении, на Cortex-M - нереализуем. PS: И прежде, чем что-то подобное делать - настоятельно рекомендую изучить мануал на ядро. Особенно в части касаемой режимов процессора, входов и выходов в ISR.
|
|
|
|
Сообщений в этой теме
arhiv6 Прерывание в прерывании Nov 7 2017, 12:00 Forger Цитата(arhiv6 @ Nov 7 2017, 15:00) один и... Nov 7 2017, 13:02 Студент заборстроительного Цитата(Forger @ Nov 7 2017, 16:02) Цитата... Nov 8 2017, 16:41  Forger Цитата(Студент заборстроительного @ Nov 8 201... Nov 8 2017, 20:41   ig_z QUOTE (Forger @ Nov 8 2017, 22:41) С друг... Nov 9 2017, 20:15    Forger Цитата(ig_z @ Nov 9 2017, 23:15) в каждой... Nov 9 2017, 21:41 arhiv6 Как минимум, это интересно - попробовать разные по... Nov 7 2017, 13:17 Forger Цитата(arhiv6 @ Nov 7 2017, 16:17) А ещё ... Nov 7 2017, 13:30  DASM Цитата(Forger @ Nov 7 2017, 16:30) В мелк... Nov 7 2017, 14:28   Forger Цитата(DASM @ Nov 7 2017, 17:28) Я отказа... Nov 7 2017, 14:45   jcxz Цитата(DASM @ Nov 7 2017, 16:28) Я отказа... Nov 7 2017, 15:04 jcxz Цитата(arhiv6 @ Nov 7 2017, 15:17) Как ми... Nov 7 2017, 15:00 Obam Цитата(arhiv6 @ Nov 7 2017, 16:00) нужно ... Nov 7 2017, 13:44 AHTOXA Цитата(arhiv6 @ Nov 7 2017, 17:00) Как эт... Nov 7 2017, 14:17 ViKo Подтверждаю, RTX RTOS от Keil - весьма достойная п... Nov 7 2017, 14:52 DASM "прихожу лишь к одному выводу " - приход... Nov 7 2017, 14:53 jcxz Цитата(DASM @ Nov 7 2017, 16:53) Вы лучше... Nov 7 2017, 15:08 Forger Цитата(DASM @ Nov 7 2017, 17:53) "пр... Nov 7 2017, 15:18 scifi Гугл вводит на гитхаб. Возможно, всё украдено до н... Nov 7 2017, 15:04 DASM Так может Вы дадите совет, сколько памяти давать к... Nov 7 2017, 15:08 jcxz Цитата(DASM @ Nov 7 2017, 17:08) Так може... Nov 7 2017, 15:11  DASM Цитата(jcxz @ Nov 7 2017, 18:11) А в чём ... Nov 7 2017, 15:29   jcxz Цитата(DASM @ Nov 7 2017, 17:29) Тем, что... Nov 7 2017, 15:58 DASM Я немного преувеличил для ясности. Эти РТОС замеча... Nov 7 2017, 15:11 Forger Цитата(DASM @ Nov 7 2017, 18:11) Эти РТОС... Nov 7 2017, 15:38 DASM Да никто не хает, каждый до..ит как хочет. Просто ... Nov 7 2017, 15:39 Forger Цитата(DASM @ Nov 7 2017, 18:39) Ваши РТО... Nov 7 2017, 15:46 jcxz Цитата(DASM @ Nov 7 2017, 17:39) но навск... Nov 7 2017, 16:11  Forger Цитата(jcxz @ Nov 7 2017, 19:11) Чтобы по... Nov 7 2017, 16:13 arhiv6 Цитата(AHTOXA @ Nov 7 2017, 21:17) Здесь ... Nov 7 2017, 15:59 jcxz Цитата(arhiv6 @ Nov 7 2017, 17:59) Пожалу... Nov 7 2017, 16:16  Forger Цитата(jcxz @ Nov 7 2017, 19:16) Наверное... Nov 7 2017, 17:56 Forger Цитата(arhiv6 @ Nov 7 2017, 20:28) Как пр... Nov 7 2017, 18:27  arhiv6 Цитата(Forger @ Nov 8 2017, 01:27) Как бы... Nov 7 2017, 19:00 arhiv6 jcxz, Forger, я не знаю, как правильно сделать, по... Nov 7 2017, 18:14 DASM Меня устраивает карусель кооперативная на таймерах... Nov 7 2017, 18:50 Forger Цитата(DASM @ Nov 7 2017, 21:50) void Led... Nov 7 2017, 19:01 DASM Первое, что приходит в голову так: о как, у меня т... Nov 7 2017, 19:05 Forger Цитата(DASM @ Nov 7 2017, 22:02) Просто к... Nov 7 2017, 19:05  DASM Цитата(Forger @ Nov 7 2017, 22:05) Ну-ну,... Nov 7 2017, 19:08 arhiv6 Цитата(DASM @ Nov 8 2017, 02:05) Первое, ... Nov 7 2017, 19:08 Forger Цитата(DASM @ Nov 7 2017, 22:05) Первое, ... Nov 7 2017, 19:21 jcxz Цитата(DASM @ Nov 7 2017, 21:05) вы шину ... Nov 7 2017, 21:46 DASM Ну да , тут собственно у меня так и есть Nov 7 2017, 19:13 DASM @ Читайте матчасть по ARM Cortex.@ Ладно, спорить ... Nov 7 2017, 19:29 Forger Цитата(DASM @ Nov 7 2017, 22:29) @ Читайт... Nov 7 2017, 19:36  AlexandrY Цитата(Forger @ Nov 7 2017, 21:36) Для те... Nov 7 2017, 20:41   Forger Цитата(AlexandrY @ Nov 7 2017, 23:41) Да ... Nov 7 2017, 21:44  AVR Цитата(Forger @ Nov 7 2017, 22:36) ОК, сл... Nov 8 2017, 08:44   Forger Цитата(AVR @ Nov 8 2017, 11:44) Ради него... Nov 8 2017, 12:53  jcxz Цитата(Forger @ Nov 7 2017, 21:36) Для те... Nov 8 2017, 20:49   Forger Цитата(jcxz @ Nov 8 2017, 23:49) может ес... Nov 8 2017, 20:54 DASM А где тут DMA и что и куда оно грузит? Nov 7 2017, 21:01 AlexandrY Цитата(DASM @ Nov 7 2017, 23:01) А где ту... Nov 8 2017, 06:13 DASM Ну не знаю, у меня на Ардуино все проще, а на мали... Nov 7 2017, 22:35 DASM Да уж.. сколько чудных открытий человек недавно п... Nov 8 2017, 21:23 Forger Цитата(DASM @ Nov 9 2017, 00:23) склетон ... Nov 8 2017, 23:29 syoma Возвращаясь к оригинальной теме по поводу прерыван... Nov 17 2017, 10:45 Forger Цитата(syoma @ Nov 17 2017, 13:45) что AR... Nov 17 2017, 11:07 scifi Цитата(syoma @ Nov 17 2017, 13:45) Каково... Nov 17 2017, 11:15  Forger Цитата(scifi @ Nov 17 2017, 14:15) Всё он... Nov 17 2017, 11:37  syoma Цитата(scifi @ Nov 17 2017, 14:15) Всё он... Nov 17 2017, 12:02   Forger Цитата(syoma @ Nov 17 2017, 15:02) И мое ... Nov 17 2017, 12:17   Obam Цитата(syoma @ Nov 17 2017, 16:02) …Если ... Nov 17 2017, 13:03   AlexandrY Цитата(syoma @ Nov 17 2017, 14:02) Ну я н... Nov 17 2017, 13:42   jcxz Цитата(syoma @ Nov 17 2017, 14:02) Наскол... Nov 17 2017, 13:44 Timmy Цитата(syoma @ Nov 17 2017, 13:45) Каково... Nov 17 2017, 12:01 syoma Знающие люди подсказали такой вариант. У них работ... Nov 17 2017, 18:04 AlexandrY Цитата(syoma @ Nov 17 2017, 20:04) Знающи... Nov 17 2017, 18:56  syoma Цитата(AlexandrY @ Nov 17 2017, 21:56) Кт... Nov 17 2017, 20:51   AlexandrY Цитата(syoma @ Nov 17 2017, 22:51) Если б... Nov 17 2017, 21:35
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|