|
Вопрос по применению PendSV в простом планировщике |
|
|
|
Sep 25 2016, 08:52
|

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

|
Добрый день. Есть вопрос по правильному применению PendSV в Cortex-M4. Пару раз использовал простой планировщик, написанный на Си. В нем задачи - это простые функции, которые, в отличии от обычных вытесняющих OS, не содержат в своем теле бесконечного цикла, а выполняются до завершения. Решил добавить задачам приоритеты и добавить возможность более приоритетным задачам приостанавливать менее приоритетные, как в Super Simple Tasker (SST). Как я это вижу: Стек общий на все задачи. При выполнении задачи (A), если требуется передать управлении более приоритетной (B) - в кольцевой буфер кладём указатель на необходимую задачу и вызываем прерывание PendSV. Попадаем в обработчик прерывания PendSV_Handler (при этом стек предыдущей задачи сохранился, в него мы попадём при выходе из прерывания). В обработчике видим, что есть потребность исполнения более приоритетной задачи B -> вызываем её (как функцию), выполняем, возвращаемся в тело обработчика прерывания и выходим из прерывания, возвращаясь задачу A и продолжаем её выполнение. Проблема в том, что вызывая задачу В я остаюсь в контексте прерывания PendSV и я не смогу передать (если это потребуется) управление ещё более приоритетной задаче (С), т.к. нельзя ещё раз вызвать прерывание PendSV. Как-то можно это обойти?
Сообщение отредактировал arhiv6 - Sep 25 2016, 15:14
--------------------
|
|
|
|
|
 |
Ответов
|
Sep 25 2016, 11:24
|

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

|
Для совсем простых вещей работаю без ОС, для некоторых - хватает упомянутого планировщика, для чего-то сложнее - разумеется, использую готовую ОС. Появилась идея немного доработать планировщик, это скорее для самообразования (для этих же целей, например, писал простой кооперативный планировщик на setjmp/longjmp - чтобы научиться работать с setjmp/longjmp, чтобы на своём опыте попробовать карусельную ОС). Исходники смотрел. Например, scmRtos - на сколько хватает моего понимания - для каждой задачи выделяется в памяти своя область для хранения стека, в PendSV_Handler происходит сохранение текущего указателя на стек, сохранение регистров, восстановление значений регистров новой задачи, в регистр указателя стека записывается указатель на стек новой задачи и происходит выход из прерывания - и т.к. указатель на стек мы поменял -> автоматически переходим в новую задачу. Но, к сожалению, у меня не хватает знаний о том, какой алгоритм должен быть для переключения задач в моём случае. Первое, что пришло в голову - использование прерывания и работа в его контексте. При этом при вызове обработчика прерывания автоматически сохранится контекст текущей задачи, создастся новый - для обработчика прерывания. Даже ассемблер не нужен, всё сделает компилятор. Но, т.к. вложенные прерывания запрещены, все ограничивается одним уровнем приоритета. Какие есть средства обойти это? Только использовать подмену адреса в указателе на стек и выходить из обработчика прерывания? Или можно как-то сообщить ядру что обработка прерывания закончена и при этом остаться в контексте прерывания (по сути - разрешить вложенные прерывания)? Или как-то по другому?
--------------------
|
|
|
|
|
Sep 25 2016, 12:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(arhiv6 @ Sep 25 2016, 14:24)  Для совсем простых вещей работаю без ОС, для некоторых - хватает упомянутого планировщика, для чего-то сложнее - разумеется, использую готовую ОС По своему опыту уверенно скажу, что право на жизнь имеют тока первый и третий варианты, а второй вариант лучше забыть как кошмарный сон! В любой проект можно всунуть ОСь и также любой проект может жить без ОСи, но самодельные костыли в виде чего-то промежуточного принесут только горе и страдания  Некоторым, чтобы это понять, все же приходится городить эти костыли, но сука-жисть расставит все на свои места - рано или поздно костыли будут выброшены и навсегда забыты  Я так говорю, поскольку сам в свое время баловался этим ...
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 25 2016, 12:49
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(Forger @ Sep 25 2016, 15:15)  По своему опыту уверенно скажу, что право на жизнь имеют тока первый и третий варианты, а второй вариант лучше забыть как кошмарный сон! И в чем там кошмарный сон? Сам использую простой переключатель задач, без всяких очередей и прочих наворотов. Вполне хватает мьютексов и глобальных переменных или структур. ИМХО для себя считаю это простым и понятным. ЗЫ. на этих принципах написана своя графическая операционка, если кто считает, что сложные задачи так не пишутся.. "...Стек общий на все задачи. ..." - а вот это глупость, конечно, можно выделить какую-либо общую область памяти, причем статически, но указатели для каждой задачи должны быть свои.
|
|
|
|
Сообщений в этой теме
arhiv6 Вопрос по применению PendSV в простом планировщике Sep 25 2016, 08:52 Forger Цитата(arhiv6 @ Sep 25 2016, 11:52) Есть ... Sep 25 2016, 09:39 kolobok0 Цитата(arhiv6 @ Sep 25 2016, 11:52) ...Ст... Sep 25 2016, 10:22   Forger Цитата(mantech @ Sep 25 2016, 15:49) И в ... Sep 25 2016, 12:58 Непомнящий Евгений Цитата(arhiv6 @ Sep 25 2016, 14:24) Для с... Sep 26 2016, 12:13 AVI-crak Цитата(arhiv6 @ Sep 25 2016, 18:24) Даже ... Sep 26 2016, 12:31  Obam В "области хелпа" - я рекомендую размест... Sep 26 2016, 13:48
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|