реклама на сайте
подробности

 
 
> Как остановить переключение процессов?, порт для Cortex-M3
sonycman
сообщение Aug 22 2010, 13:21
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Доброго времени суток!

Насколько я понял, переключение задач в порте для кортексов осуществляется вызовом программного прерывания.
То есть, чтобы остановить переключение задач, достаточно просто запретить все прерывания?

К примеру, в программе возникла аварийная ситуация, и потребовалось отобразить информацию на ЖКИ и остановить процессор:

1. LCD_Mutex.Lock(); - так как ЖКИ расшаренный ресурс, ждём его освобождения
2. __disable_irq(); - запрещаем прерывания
3. LCD.Print(); - выводим на дисплей, в процессе будет несколько раз выполняться LCD_Mutex.Unlock()
4. while (1); - остановка процессора.

Возможно ли переключение на другой процесс после вызова LCD_Mutex.Unlock() при запрещённых прерываниях?

ЗЫ:чёрт, посмотрел в исходниках ОС - переключение задач производится не зависимо от того, разрешены прерывания или нет.

Как же мне заставить систему не переключаться? sad.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Aug 22 2010, 16:05
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Aug 22 2010, 19:21) *
ЗЫ:чёрт, посмотрел в исходниках ОС - переключение задач производится не зависимо от того, разрешены прерывания или нет.

Это как это?! rolleyes.gif
Цитата
Как же мне заставить систему не переключаться? sad.gif

Вот вопрос на засыпку: в критической секции - система переключается? smile.gif



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 22 2010, 16:13
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(AHTOXA @ Aug 22 2010, 20:05) *
Это как это?! rolleyes.gif

А просто - выполняя Mutex.Unlock() попадаем в планировщик - TKernel::Sched(), который разрешает прерывания для форсирования переключения задач.

То есть пофигу - были запрещены до этого прерывания или нет - система будет переключать задачи sad.gif
А мне бы этого избежать...

То есть в идеале тут нужно либо удалить все задачи, кроме одной текущей, либо установить приоритет текущей задачи на максимум.
К сожалению, эти механизмы тут отсутствуют.

Пока что вышел из ситуации запрещением в приложении использования сервисов ОС после того, как прерывания были запрещены.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 03:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.02366 секунд с 7
ELECTRONIX ©2004-2016