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

 
 
> вопросы по scmRTOS, вложенные мютексы и т.д.
jorikdima
сообщение Apr 6 2007, 16:10
Сообщение #1


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Пару вопросов по scmRTOS (да наверно в целом по РТОС).

1. Простой. Как в этой операционке получить индекс приоритета текущего процесса. Предположим есть функция и ее могут вызывать каждый из существующих процессов. Как узнать какой из них ее вызывает?

2. Предположим есть две функции, которые имеют дело с портом. Первая настраивает его скорость и прочее. Вторая... например просто делает enabled/disabled для порта, в принципе неважно. Функции могут вызываться каждым из процессов. По идее надо тело функции обрамлять mutex.Lock() mutex.Unlock(). Но ситуация такова, что например вторую функцию может вызывать не только любой из процессов непосредственно, но и первая функция (понятно, что в рамках какого то процесса). То есть при настройке порта я хочу еще сразу делать enable port. И при этом получается, что процесс в рамках вызова первой функции блокирует мютекс и вызывая вторую функцию, опять видит mutex.Lock и блокирует сам себя, навечно. Чую, тут самые такие азы всего этого дела, но не понимаю как поступают в таких случаях?

Спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dxp
сообщение Apr 6 2007, 16:49
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(jorikdima @ Apr 6 2007, 20:10) *
Пару вопросов по scmRTOS (да наверно в целом по РТОС).

1. Простой. Как в этой операционке получить индекс приоритета текущего процесса. Предположим есть функция и ее могут вызывать каждый из существующих процессов. Как узнать какой из них ее вызывает?

Зачем?

Цитата(jorikdima @ Apr 6 2007, 20:10) *
2. Предположим есть две функции, которые имеют дело с портом. Первая настраивает его скорость и прочее. Вторая... например просто делает enabled/disabled для порта, в принципе неважно. Функции могут вызываться каждым из процессов. По идее надо тело функции обрамлять mutex.Lock() mutex.Unlock(). Но ситуация такова, что например вторую функцию может вызывать не только любой из процессов непосредственно, но и первая функция (понятно, что в рамках какого то процесса). То есть при настройке порта я хочу еще сразу делать enable port. И при этом получается, что процесс в рамках вызова первой функции блокирует мютекс и вызывая вторую функцию, опять видит mutex.Lock и блокирует сам себя, навечно.

Мутексом надо обрамлять не вызов фунции, а обращение к совместно используемому ресурсу - к порту в данном случае. Внутри этого кода (защищаемого мутексом) Вы же не отдаете сами управление? Тогда как другой процесс будет что-то вызывать? А если там произойдет вытеснение и другой процесс попытается захватить мутекс, то он (процесс) наткнется на залоченное состояние и будет поставлен на ожидание анлока и управление снова вернется в наш процесс, откуда вытеснили. При выполнении анлока управление попадет в тот ожидающий более приоритетный процесс. Вот и разделение доступа к ресурсу.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Apr 6 2007, 17:10
Сообщение #3


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(dxp @ Apr 6 2007, 17:49) *
Мутексом надо обрамлять не вызов фунции, а обращение к совместно используемому ресурсу - к порту в данном случае.

Понимаю. Но внутри этой функции и идет собственно оьращение к ресурсу. А точнее обращение к регистру, которым включается/отключается UART.
Цитата(dxp @ Apr 6 2007, 17:49) *
Внутри этого кода (защищаемого мутексом) Вы же не отдаете сами управление? Тогда как другой процесс будет что-то вызывать? А если там произойдет вытеснение и другой процесс попытается захватить мутекс, то он (процесс) наткнется на залоченное состояние и будет поставлен на ожидание анлока и управление снова вернется в наш процесс, откуда вытеснили. При выполнении анлока управление попадет в тот ожидающий более приоритетный процесс. Вот и разделение доступа к ресурсу.

А речь даже не о другом процессе пока. Пока рассматриваем только один единственный. В нем вызвалась первая функция, работающая с портом, мютекс залочился. И затем вызвалась вторая , в которой тоже лочится мютекс. Вот тут и проблема. Скажете, а зачем во второй функции лочить мютекс, если она уже вызывается из того места где он залочен? Потому что эта вторая функция может вызываться не тока оттуда.

Я понимаю, что тут скорее всего ошибка проектирования... или чето в этом духе. Но хочется понять как правильно в такой ситуации поступать.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Apr 9 2007, 05:34
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(jorikdima @ Apr 6 2007, 20:10) *
Понимаю. Но внутри этой функции и идет собственно оьращение к ресурсу. А точнее обращение к регистру, которым включается/отключается UART.

А речь даже не о другом процессе пока. Пока рассматриваем только один единственный. В нем вызвалась первая функция, работающая с портом, мютекс залочился. И затем вызвалась вторая , в которой тоже лочится мютекс. Вот тут и проблема. Скажете, а зачем во второй функции лочить мютекс, если она уже вызывается из того места где он залочен?

Незачем. Если вы захватили ресурс, то работаете с ним, а потом освобождаете.

Цитата
Потому что эта вторая функция может вызываться не тока оттуда.

Если эта функция вызывается из другого процесса (задачи), то dxp все описал подробно с вытеснениями.
Или вы эту функцию хотите вызывать из первой функции, которая уже получила доступ к ресурсу, но из того же процесса?
Так просто делать не надо, напишите код по другому, иначе у вас получится deadlock.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 20:26
Рейтинг@Mail.ru


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