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

 
 
> Процесс, ограниченный по времени, помогите советом
_Pasha
сообщение May 24 2008, 05:17
Сообщение #1


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Доброго времени!
Требуется соорудить такую конструкцию:
предположим, у нас выполняется некий процесс. Считаем что-то, короче.
По наступлению прерывания от таймера необходимо из этого процесса выйти, да так, чтобы запомнить его состояние и впоследствии вернуться и продолжить его выполнение.
На ассемблере это делается элементарно.
Проблема в реализации этой конструкции на C - мешает нереентерабельность функций, огромные сохраняемые контексты.
Пока что представляю, как это сделать в рамках main() - с помощью setjump() и такой-то матери.smile.gif
Как это сделать в любой другой функции - как эти функции заточить по правильному - не имею понятия.
В идеале хочу выйти на что-то типа
Код
TIME_LIMITED_BLOCK(T_100us)
{/*code*/
}


взяв за основу for() как ATOMIC_BLOCK в WINAVR.

В общем,если есть какие-то советы, милости просим.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Pasha
сообщение May 25 2008, 02:29
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Леонид Иванович @ May 24 2008, 23:58) *
вместо вытесняющей многозадачности возможно применение кооперативной многозадачности.


Кооперативка, реализованная на С, настолько некрасива, по сравнению, например,с таким подходом на асме , что у меня язык не поворачивается называть эти все switch(state) процессом. smile.gif

Цитата(rezident @ May 25 2008, 00:22) *
Я аналогично делаю. Есть единый счетчик тиков...


Дык это ужЕ аксиома. Имеем "длинный" счетчик с тиком 10 мс (или 1мс, но 32-бита), с флагом предупреждения об "атомарности" доступа (т.е. он выскочит когда значение младшего байта равно 0xfe и снимется - когда будет 0x01), после чего жаба за ресурсы не удушит, также быстрый 8-битный с тиком переполнений от 8-битного таймера.

По теме.
Решил пойти от обратного. Имеем априорно известное максимально допустимое время выполнения программы, выше которого все развалится. Поскольку ограничивать по времени надо процессы с наименьшим приоритетом, можно замерять и фиксировать максимальное время выполнения процесса, а затем перед следующим вызовом проверять, успеет оно поработать или нет. Если не успевает - то не вызывать. Количество не-вызовов тоже подсчитываем и, если их много, сбрасываем измеренное время выполнения в ноль. И на все 3-4 байт на задачу.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 04:25
Рейтинг@Mail.ru


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