Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Функции setjmp/longjmp
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
_Артём_
Подумалось вдруг: а нельзя ли с помощью этих функций сделать нечто вреде кооперативной ОС?
Поискал в гугле, не нашёл подобного. Почему? Плохо искал или оно для этого не приспосабливаемо?
Спасибо.
Idle
гугли "cooperative multitasking longjump"
http://en.wikipedia.org/wiki/Setjmp.h#Coop...ve_multitasking
http://my.execpc.com/~geezer/code/setjmp.c
ссылок много
_Pasha
Цитата(_Артём_ @ Jan 19 2012, 01:28) *
Подумалось вдруг: а нельзя ли с помощью этих функций сделать нечто вреде кооперативной ОС?

Для кооперативной - слишком шикарно выходит. Зачем там нужен полный контекст?
Вот для примочек а-ля "вытесняющая ось" на фоне общей кооперативной - это может быть.
Не всегда, правда - там, где разные указатели стеков для режимов юзер и прерывания, - не пойдет.
Но это не страшно - поскольку всё будет завязано на низкоуровневые операции, заботиться о переносимости контекстопереключателя на сабже нет смысла.
ReAl
Цитата(_Pasha @ Jan 19 2012, 08:03) *
Для кооперативной - слишком шикарно выходит. Зачем там нужен полный контекст?
Чтобы передавать управление откуда-то из глубины вызова функций.
Для такой кооперативки стеков нужно практически как для вытеснялки.
У longjmp контекст таки немного меньше, чем полный контекст для вытеснялки, так что стеков и времени на переключение у такой коператвивки нужно меньше. Но несущественно на фоне использовани ястека самими процессами.
Поэтому я не сильно понимаю смысл таких кооперативок. Но они есть, именно на longjmp (надо таки найти в завалах у себя архив «мобильной реализации сопроцесов» из софтпанорамы года так 1993-95 — первое, что я на этом видел).

_Pasha
Цитата(ReAl @ Jan 19 2012, 13:00) *
Чтобы передавать управление откуда-то из глубины вызова функций.
Для такой кооперативки стеков нужно практически как для вытеснялки.

Но свелось жеж к некоей процедурке, с подавлением возможности рекурсивных вызовов? Понятно, что общий случай проигрывает, когда все вызваны ранее, а мы из последнего вызываем эту процедуру и пытаемся оттудава выкачать ну хоть одно событие. Но это маловероятно. Усилиями программистовsm.gif
_Артём_
Цитата(ReAl @ Jan 19 2012, 11:00) *
Для такой кооперативки стеков нужно практически как для вытеснялки.
У longjmp контекст таки немного меньше, чем полный контекст для вытеснялки, так что стеков и времени на переключение у такой коператвивки нужно меньше.


Что так много ОЗУ надо? и экономия невелика?

Цитата(ReAl @ Jan 19 2012, 11:00) *
Поэтому я не сильно понимаю смысл таких кооперативок.



Есть ещё какие-то ограничения?
_Артём_
Чтоб но плодить темы спрошу тут.
Какие есть кооперативные OS для АВР и поддержкой С++?
dxp
QUOTE (_Артём_ @ Jan 23 2012, 00:16) *
Чтоб но плодить темы спрошу тут.
Какие есть кооперативные OS для АВР и поддержкой С++?

Вы имели в виду кооперативные RTOS, реализованные на С++? Скорее всего таких нет. А поддержку С++ осуществляет не ОС, а рабочая среда (компилятор и остальное). Т.ч. ничего не мешает взять писанную на С кооперативу и писать свой код на плюсах. Если уж очень хочется, то можно и вокруг сервисов ОС понаделать плюсовых обёрток.
_Артём_
Цитата(dxp @ Jan 23 2012, 09:14) *
Вы имели в виду кооперативные RTOS, реализованные на С++? Скорее всего таких нет.

Не обязательно реализованные.

Цитата(dxp @ Jan 23 2012, 09:14) *
А поддержку С++ осуществляет не ОС, а рабочая среда (компилятор и остальное).

Да согласен

Цитата(dxp @ Jan 23 2012, 09:14) *
Т.ч. ничего не мешает взять писанную на С кооперативу и писать свой код на плюсах. Если уж очень хочется, то можно и вокруг сервисов ОС понаделать плюсовых обёрток.

Поподались только оси, где прямо говорилось: С++ не поддерживается (например OSA).
А хотелось чтобы просто компилированись и работали с С++ .


dxp
QUOTE (_Артём_ @ Jan 23 2012, 18:07) *
Поподались только оси, где прямо говорилось: С++ не поддерживается (например OSA).
А хотелось чтобы просто компилированись и работали с С++ .

Что мешает компилировать С код компилятором С++, учитывая, что С является подмножеством С++? Попробуйте взять рабочий пример из OSA и собрать его в С++ режиме.
_Артём_
Цитата(dxp @ Jan 23 2012, 18:55) *
Что мешает компилировать С код компилятором С++, учитывая, что С является подмножеством С++?

Логично.
Отпугнули они меня этой фразой (может были у них какие-то основания для неё, не знаю):
Цитата
IAR (AVR and STM8)

Работает только в режиме C (не C++).

Оптимизация cross-call должна быть отключена.


Цитата(dxp @ Jan 23 2012, 18:55) *
Попробуйте взять рабочий пример из OSA и собрать его в С++ режиме.


Да, попытка не пытка. Попробую.

Цитата
Да, попытка не пытка. Попробую.


Боятся они ++:
Цитата
Fatal Error[Pe035]: #error directive: "OSA: This is CPLUSPLUS mode!!!" c:\osa\port\avr\osa_avr_iar.h 36

dxp
QUOTE (_Артём_ @ Jan 24 2012, 00:41) *
Боятся они ++:

Во, как! sm.gif Директивка-то не иаровская, а авторами вставлена. Интересно, какие для этого основания? Попробуйте её закомментарить и собрать.
_Артём_
Цитата(dxp @ Jan 24 2012, 05:30) *
Во, как! sm.gif Директивка-то не иаровская, а авторами вставлена.


Точно:
Цитата
#ifdef __cplusplus
#error "OSA: This is CPLUSPLUS mode!!!"
#endif


Цитата(dxp @ Jan 24 2012, 05:30) *
Попробуйте её закомментарить и собрать.


Собрать пока не получается: другие ошибки лезут (поменял cpu на М128, чтоб наверняка С++ можно применять)
Цитата(dxp @ Jan 24 2012, 05:30) *
Интересно, какие для этого основания?

Да, интересно.

Цитата
С является подмножеством С++

Может есть у них основания не согласится с фразой?
_Pasha
Посмотрел на ужас низкоуровневого подхода в портах осы. Подумалось - не проще ли такие микро-оси размещать в стартапах?
dxp
QUOTE (_Артём_ @ Jan 24 2012, 20:14) *
Может есть у них основания не согласится с фразой?

Строго говоря, С и С++ не 100% совместимы. Есть несколько моментов, где поведение отличается. Например, в отношении констант и перечислений - у С++ подход более здравый (это и понятно, он позже шёл, учёл недостатки), есть некоторые нюансы с объявлениями переменных, но в целом в С++ нет ничего такого, что требовало бы сборки кода строго по сишным правилам. Очень интересно узнать мотивы авторов на этот счёт.

Вообще, код ОС и пользовательский код почти ортогональны по языку. Например, можно взять ось, писанную на плюсах, и использовать со своим кодом, полностью написанным на С (конечно, придётся использовать выражения вроде object_name.function_name() при обращении к примитивам ОС, но я бы не назвал это использованием С++ в пользовательском коде). А можно наоборот взять написанную на С ось и лабать свой код на ++ вплоть до написания плюсовых обёрток над примитивами ОС. Единственным более-менее обоснованным аргументом для сознательного отказа/запрета С++ в этом случае является использование каких-то жизненно необходимых "плюшек", которые есть в С и которых нет в С++ - например, incomplete arrays.
_Артём_
Цитата(dxp @ Jan 24 2012, 17:02) *
Единственным более-менее обоснованным аргументом для сознательного отказа/запрета С++ в этом случае является использование каких-то жизненно необходимых "плюшек", которые есть в С и которых нет в С++ - например, incomplete arrays.

Думаю не тот случай...
Попытался собрать проект примера в первоначальном виде (С99/AT90S4433 - эта древность ещё выпускается? Смысл делать пример на таком).
Тоже ошибки.
Цитата
Error[e12]: Unable to open file 'C:\Program Files\IAR Systems\Embedded Workbench 6.0\avr\LIB\CLIB\cl0t.r90'
dxp
QUOTE (_Артём_ @ Jan 25 2012, 03:50) *
Попытался собрать проект примера в первоначальном виде (С99/AT90S4433 - эта древность ещё выпускается? Смысл делать пример на таком).
Тоже ошибки.

Так это линкер ругается на то, что не хватает библиотеки. Либо IAR надо поменять, либо МК на тот, для которого есть библиотека.
_Артём_
Цитата(dxp @ Jan 25 2012, 14:09) *
Так это линкер ругается на то, что не хватает библиотеки. Либо IAR надо поменять, либо МК на тот, для которого есть библиотека.


"Признаю свою вину..."
Второй раз пробовал дома, а там IAR поставлен частично (только АВР с флеш >128 кБ), так что osa тут не причём - слишком мелкий проц.
dxp
QUOTE (_Артём_ @ Jan 25 2012, 20:20) *
"Признаю свою вину..."
Второй раз пробовал дома, а там IAR поставлен частично (только АВР с флеш >128 кБ), так что osa тут не причём - слишком мелкий проц.

Ну, так собирается проект или нет?
_Артём_
Цитата(dxp @ Jan 26 2012, 06:04) *
Ну, так собирается проект или нет?

Да проект собрался и под м128 тоже (но пока в С).
Сегодня-завтра попробую понять чего от неё ждать в плане быстродействия/потребления ресурсов/удобства спользования, или всёж остановится на вытесняющих (хотя для авр наверное тяжеловато) или вообще по-старинке делать без ОСей.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.