|
Функции setjmp/longjmp |
|
|
|
 |
Ответов
|
Jan 19 2012, 06:03
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(_Артём_ @ Jan 19 2012, 01:28)  Подумалось вдруг: а нельзя ли с помощью этих функций сделать нечто вреде кооперативной ОС? Для кооперативной - слишком шикарно выходит. Зачем там нужен полный контекст? Вот для примочек а-ля "вытесняющая ось" на фоне общей кооперативной - это может быть. Не всегда, правда - там, где разные указатели стеков для режимов юзер и прерывания, - не пойдет. Но это не страшно - поскольку всё будет завязано на низкоуровневые операции, заботиться о переносимости контекстопереключателя на сабже нет смысла.
|
|
|
|
|
Jan 19 2012, 09:00
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(_Pasha @ Jan 19 2012, 08:03)  Для кооперативной - слишком шикарно выходит. Зачем там нужен полный контекст? Чтобы передавать управление откуда-то из глубины вызова функций. Для такой кооперативки стеков нужно практически как для вытеснялки. У longjmp контекст таки немного меньше, чем полный контекст для вытеснялки, так что стеков и времени на переключение у такой коператвивки нужно меньше. Но несущественно на фоне использовани ястека самими процессами. Поэтому я не сильно понимаю смысл таких кооперативок. Но они есть, именно на longjmp (надо таки найти в завалах у себя архив «мобильной реализации сопроцесов» из софтпанорамы года так 1993-95 — первое, что я на этом видел).
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 19 2012, 12:16
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ReAl @ Jan 19 2012, 11:00)  Для такой кооперативки стеков нужно практически как для вытеснялки. У longjmp контекст таки немного меньше, чем полный контекст для вытеснялки, так что стеков и времени на переключение у такой коператвивки нужно меньше. Что так много ОЗУ надо? и экономия невелика? Цитата(ReAl @ Jan 19 2012, 11:00)  Поэтому я не сильно понимаю смысл таких кооперативок. Есть ещё какие-то ограничения?
|
|
|
|
|
Jan 23 2012, 11:07
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(dxp @ Jan 23 2012, 09:14)  Вы имели в виду кооперативные RTOS, реализованные на С++? Скорее всего таких нет. Не обязательно реализованные. Цитата(dxp @ Jan 23 2012, 09:14)  А поддержку С++ осуществляет не ОС, а рабочая среда (компилятор и остальное). Да согласен Цитата(dxp @ Jan 23 2012, 09:14)  Т.ч. ничего не мешает взять писанную на С кооперативу и писать свой код на плюсах. Если уж очень хочется, то можно и вокруг сервисов ОС понаделать плюсовых обёрток. Поподались только оси, где прямо говорилось: С++ не поддерживается (например OSA). А хотелось чтобы просто компилированись и работали с С++ .
|
|
|
|
|
Jan 23 2012, 17:41
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(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
|
|
|
|
|
Jan 24 2012, 13:14
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(dxp @ Jan 24 2012, 05:30)  Во, как!  Директивка-то не иаровская, а авторами вставлена. Точно: Цитата #ifdef __cplusplus #error "OSA: This is CPLUSPLUS mode!!!" #endif Цитата(dxp @ Jan 24 2012, 05:30)  Попробуйте её закомментарить и собрать. Собрать пока не получается: другие ошибки лезут (поменял cpu на М128, чтоб наверняка С++ можно применять) Цитата(dxp @ Jan 24 2012, 05:30)  Интересно, какие для этого основания? Да, интересно. Цитата С является подмножеством С++ Может есть у них основания не согласится с фразой?
|
|
|
|
|
Jan 24 2012, 15:02
|

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

|
QUOTE (_Артём_ @ Jan 24 2012, 20:14)  Может есть у них основания не согласится с фразой? Строго говоря, С и С++ не 100% совместимы. Есть несколько моментов, где поведение отличается. Например, в отношении констант и перечислений - у С++ подход более здравый (это и понятно, он позже шёл, учёл недостатки), есть некоторые нюансы с объявлениями переменных, но в целом в С++ нет ничего такого, что требовало бы сборки кода строго по сишным правилам. Очень интересно узнать мотивы авторов на этот счёт. Вообще, код ОС и пользовательский код почти ортогональны по языку. Например, можно взять ось, писанную на плюсах, и использовать со своим кодом, полностью написанным на С (конечно, придётся использовать выражения вроде object_name.function_name() при обращении к примитивам ОС, но я бы не назвал это использованием С++ в пользовательском коде). А можно наоборот взять написанную на С ось и лабать свой код на ++ вплоть до написания плюсовых обёрток над примитивами ОС. Единственным более-менее обоснованным аргументом для сознательного отказа/запрета С++ в этом случае является использование каких-то жизненно необходимых "плюшек", которые есть в С и которых нет в С++ - например, incomplete arrays.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 24 2012, 20:50
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(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'
|
|
|
|
Сообщений в этой теме
_Артём_ Функции setjmp/longjmp Jan 18 2012, 22:28 Idle гугли "cooperative multitasking longjump... Jan 19 2012, 05:32  _Pasha Цитата(ReAl @ Jan 19 2012, 13:00) Чтобы п... Jan 19 2012, 10:24             _Артём_ Цитата(dxp @ Jan 25 2012, 14:09) Так это ... Jan 25 2012, 13:20              dxp QUOTE (_Артём_ @ Jan 25 2012, 20:20) ... Jan 26 2012, 04:04               _Артём_ Цитата(dxp @ Jan 26 2012, 06:04) Ну, так ... Jan 26 2012, 05:11 _Pasha Посмотрел на ужас низкоуровневого подхода в портах... Jan 24 2012, 13:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|