Embedded OS

Thu Mar 17 2005 10:24, Olga Nonova wrote to Alex Kouznetsov:

AK>>>> Также нет никакой разницы, на каком языке написана программа, выдающая ^^^^^^^^ AK>>>> строки в канал связи. Если разработчик решил передавать z-строки, он AK>>>> их передаст и на паскале, и на сях. Если же он решил использовать AK>>>> строки со счетчиком, он опять же сделает их и на си и на паскале.

ON>>> Пример в студию, как на Си реализовать паскалевскую строку со ON>>> счетчиком.

AK>> Pукопашное преобразование: AK>> #include <string.h>

AK>> char zstr[] = "примерчик"; AK>> char cstr[strlen(zstr)]; /* строка со счетчиком AK>> cstr[0] = strlen(zstr); AK>> for (int i=0; i<strlen(zstr); i++) AK>> cstr[i+1] = zstr[i]; AK>> Результат можешь выдавать в канал связи, раз тебе этого хочется. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ON> Спасибо. Однако слишком поспешно исполнено, чтобы было рассмотрено ON> всерьез.

Ты просила пример, или что?

ON> Так например, сразу видны тривиальные ошибки синтаксиса,

Не употребляй слов, значения которых ты не понимаешь. Иди читай что значит слово "синтаксис", двоешница

ON> надо было писать как минимум: char cstr[SizeOf(zstr)].

Хи-хи, а вот SizeOf - это уже и в самом деле ошибка синтаксиса, поскольку чувствительность к регистру есть особенность синтаксиса си ;-)

ON> А по хорошему, чтобы был еще ON> "запас" на работу со строкой SizeOf(zstr)+ AnyRest. ON> Плюс к тому, в вашем ON> цикле будет избыточное число раз вызываться вычисление strlen(zstr), что ON> для z-строк занимает достаточное время.

Я плакаль...

ON> Hу а в-третьих, как библиотеки ON> С-компилятора станут работать с образованной таким образом "строкой", а ON> на самом деле структурой? Или предлагаете самому все написать с нуля?

Для тупиц повторю еще раз (см. подчеркнутое, а также предыдущие посты):

-- внутри программы используются те строки, какие удобнее для этого языка и приложения

-- при передаче наружу строка преобразуется в какой хочется формат

-- при приеме извне строка преобразуется из какого угодно формата в тот, который удобнее, дальнейшая работа ведется в этом формате

ON>>> ... Да, все _может_ оказаться фатальным. Hо у сишных ON>>> z-строк вероятность этого "может" значительно больше.

AK>> Обоснуй

ON> См выше.

Посчитай вероятности и сравни. Или ты не знаешь что такое вероятность? Тогда, будь добра, не употребляй и это слово, покуда не узнаешь его смысл.

Уведомляю тебя, что более не буду тебе отвечать. В этом треде я ставил перед собой целью исследовать глубину твоей глупости. Эта задача выполнена, более ты мне не интересна.

Пока, Алексей

Reply to
Alex Kouznetsov
Loading thread data ...

Здравствуйте, Уважаемый Alex!

Thu Mar 17 2005 12:35, Alex Kouznetsov wrote to Olga Nonova:

ON>> Спасибо. Однако слишком поспешно исполнено, чтобы было рассмотрено ON>> всерьез.

AK> Ты просила пример, или что?

Я не просила пример детской халтуры. Просто хотела посмотреть, какое чудовище рождается конструкциями Си в попытках реализовать нормальные строки Паскаля.

ON>> Так например, сразу видны тривиальные ошибки синтаксиса,

ON>> надо было писать как минимум: char cstr[SizeOf(zstr)].

AK> Хи-хи, а вот SizeOf - это уже и в самом деле ошибка синтаксиса, поскольку AK> чувствительность к регистру есть особенность синтаксиса си ;-)

А если по-существу, без уворачиваний- допустили Вы синтаксиса ошибку или нет? Да, или нет?

ON>> А по хорошему, чтобы был еще ON>> "запас" на работу со строкой SizeOf(zstr)+ AnyRest. ON>> Плюс к тому, в вашем ON>> цикле будет избыточное число раз вызываться вычисление strlen(zstr), что ON>> для z-строк занимает достаточное время.

AK> Я плакаль...

Конечно заплачешь, когда открывается такая бездна подробностей, о которых Вы не имели представления.

ON>> Hу а в-третьих, как библиотеки ON>> С-компилятора станут работать с образованной таким образом "строкой", а ON>> на самом деле структурой? Или предлагаете самому все написать с нуля?

AK> Для тупиц повторю еще раз (см. подчеркнутое, а также предыдущие посты): AK> -- внутри программы используются те строки, какие удобнее для этого языка AK> и приложения AK> -- при передаче наружу строка преобразуется в какой хочется формат AK> -- при приеме извне строка преобразуется из какого угодно формата в тот, AK> который удобнее, дальнейшая работа ведется в этом формате

Для танкистов с кабинетным мышлением повторяю: типы строк правильно выбирать из решаемой задачи и доступности вычислительных ресурсов, а не из-за владения каким-либо языком программирования. Для мелких однокристаллок сишные z-строки крайне невыгодны, т.к. требуют доп.расходов по манагерству динамического распределении памяти под них и очень сложного отслеживания ошибочных ситуаций. Других типов строк в языке Си и его библиотеках не предусмотрено. Значит, язык Си плохо подходит для мелких однокристаллок. Логика доступна?

AK> Уведомляю тебя, что более не буду тебе отвечать. В этом треде я ставил AK> перед собой целью исследовать глубину твоей глупости. Эта задача AK> выполнена, более ты мне не интересна.

Я ж говорила- эмоции Вас погубят.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova

Здравствуйте, Уважаемый Alexander!

Wed Mar 16 2005 22:59, Alexander Torres wrote to Olga Nonova:

ON>> Hе уверена, что "обычная". Сколько же на ней полей с кнопками размещено?

AT> Специально для тебя - пошел и сфотографировал: AT>

formatting link
AT> Как видишь - и полей не так много, да и кнопок в сумме 19.

Это много. В моей (Sharp) всего четыре, но зато меню на дурацком дисплее кажется об 320 режимах! И все в закодированом виде. Я бы сама такую ни за что не купила, но сват подарил...

ON>> В передаче формальных параметров никакая самодеятельность недопустима. ON>> Поэтому "нельзя".

AT> Вот только, я совершенно спокойно испльзую функции, работающие например с AT> лежащими в ПЗУ строками, и никуда в ОЗУ они не копируются.

Эти функции из стандартной библиотеки С-компилятора? Или написали сами?

ON>> Момент появления "нормального" Хай-Течь я пропустила. Зато убуютила свой ON>> "голый" ассемблер надежной библиотекой макросов практически на все ON>> случаи жизни.

AT> Hу я вот, не пропустил :)

Хай-Течь, как я понимаю, для PIC? Я в эту сторону вообще не смотрю.

ON>> Сильно сомневаюсь на счет обоснованности аргумента крупных серий в ON>> нашей стране.

AT> А они для вашей страны и не предназначены, основные рынки - США, Европа, AT> немного Япония и набирающий силы рынок в Китае.

AT> Да и серии не такие уж и крупные, не миллионы, десятки тысяч всего.

ON>> Во-первых, дешевыми подделками занимаются китайцы, но не мы.

AT> Да ну ?:)

Извините, если обидела ненароком.

ON>> Конкурировать по дешевизне с китайцами- заведомо проигрышное занятие.

AT> Так это, вся наша серийная продукция разумеется производится в Китае, в AT> пром-зоне Шензен.

ON>> Во-вторых, Вы ведете речь о каких-то игрушках типа елочных гирлянд, ON>> где действительно контроллер 1/10 в себестоимости.

AT> Hу если брать самые дешевые наши штучки. то там примерно так и есть - AT> себестоимость $15, контроллер - $1.20, но если брать самые дорогие наши AT> штучки - то себестоимость там побольше, а вот контроллера те же AT> $1.20-1.50

ON>> Китайцы и здесь побьют нас. Отечественный разработчик может прожить ON>> сейчас пожалуй только на дорогостоящем, интеллектуально насыщенном ON>> продукте.

AT> У нас очень "интеллектуально насыщенный продукт", и не только в софте но AT> и в железе.

Еще раз извините, но позвольте не поверить, чтобы "интеллект" производился китайцами тысячами штук и продавался в розницу за $15.

AT> Hастолько "насыщенный" - что пересчитать выпускающие серийно такую AT> продукцию фирмы в мире - тебе пальцев на руках хватит.

Было бы чрезвычайно интересно сходить на сайт этой фирмы и посмотреть на это чудо из чудес. Ссылочку можете кинуть?

Всего ам Хорошего Ольга

Reply to
Olga Nonova

Здравствуйте, Уважаемый Alexander!

Wed Mar 16 2005 23:16, Alexander Torres wrote to Olga Nonova:

ON>> Компилятор может и не "забывает" ноль. Зато в приходящих из канала связи ON>> пакетах можно встретить и не такие чудеса забывчивости. И последствия ON>> фатальны для скомпилированной на Си программы.

AT> Боже мой, как же твои письма в эху попадают - ведь они через каналы связи AT> проходят через десятки роутеров, где весь софт на Си написан....

Роутеры неймановской архитектуры, а не мелкие гарварды. Поэтому и работает там Си.

AT> Кстати, я сам Турбо/Борланд Паскаль (именно их, а не "класический AT> Паскаль") люблю гораздо больше чем Турбо/Борланд Си, но к сожалению - ни AT> одного приличного компилятора Паскаля для микроконтроллеров - не встречал AT> ("приличного" - значит вышедшего из уровня курсовой работы или GNU-той AT> поделки, что в общем, одно и то же)

Аналогично. Если бы попался в свое время приличный несишный компилятор для AVR-ов, что-то типа PLM-51, я бы даже не задумывалась- а сразу бы вперед. Hо увы- вокруг была одна лишь победа сишной мысли над разумом.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova

Wed, 16 Mar 2005 20:33:53 +0300 Alexey V Bugrov wrote to Harry Zhurov:

[...]

AV>>> Hет. Происходит сохранение контекста прерванной задачи, обработка AV>>> прерывания, восстановление контекста. HZ>> Как это нет? Именно щелканье контекстами на каждый байт. Вопрос HZ>> только в размере этого контекста.

AV> Что-то я не понимаю о чем тогда вообще разговор. У тебя получается тоже AV> самоей щелканье контекстами, только без твоего AV> участия и в неизвестном тебе объеме, т.к. оставляешь это на откуп AV> компилятору.

Нет. С моим участием, в известном объеме и никакого откупа компилятору - вообще без его участия. Просто на входе сохраняется сразу весь контекст. Понимаю, что не всегда это эффективно. Эффективно это только тогда, когда прерывание является источником событий. Но это универсальный способ, он работает всегда и везде без завязок на конкретные нюансы целевой платформы и проекта.

AV>>> как ты говоришь, "внеосевое".

HZ>> Э, нет, это далеко не то же самое. При внеосевом прерывании HZ>> компилятор (или я сам, если на асме пишу) сохраняет только то, что HZ>> использует. Hапример, использует два регистра - их и сохраняет.

AV> OR уже сказал про убогость этого компилятора. Если ему нельзя объяснить AV> какие регистры можно пользовать какие нет и AV> какие регистры он будет использовать.

Я бы не стал обзывать лучший компилятор убогим. Качество компилятора определяется в первую очередь качеством кодогенерации, и она на высоте. Указывать компилятору, как ему рулить регистрами, конечно, хорошо, но это имеет обратную сторону именно в кодогенерации, т.к. схемы распределения регистров при кодогенерации определяют многое (если не все). Как сказали в саппорте, register allocation при кодогенерации есть очень нетривиальная задача сама по себе. Компилятор дает возможность залочить часть регистров, т.е. он их не будет в этом случае использовать.

AV> Если нельзя явно разрешить, то нужно знать как оно работает.

Это да, это знать можно, и такое знание есть. Только где гарантия, что в следующей версии компилятор не будет что-то делать по-другому? Как быть в случае использования ОС для другой платформы? Все эти завязки на конкретный компилятор конкретной платформы, конечно, дают некую свободу в конкретном случае, но решение получается частным со всеми вытекающими. Если тебя это не волнует, то тебе хорошо. Как только начнет волновать, появятся все эти обсуждаемые вопросы.

[...]

HZ>> иметь другой вид!? Я уже не говорю про переход на другую версию HZ>> компилятора.

AV> Hе, ну немного нестандартно мыслить можно? Если нет средства досохранить AV> контекст, нехай компилятор это делает по AV> своему усмотрению. Сам же говоришь, что два-три регистра. Обработчик пусть AV> сохранит/восстановит то, что ему надо, а при AV> необходимости переключения задачи шедулер сохраняет контекст целиком.

AV> 1. Вошли в прерывание. AV> 2. Сохранили то, что требуется для инкремента ISR_Level и проверки флага AV> need_run_scheduler. AV> 3. Инкремент ISR_Level AV> 4. Вызов "внеосевого прерывания" с его собственным сохранением AV> восстановлением "контекста", тех самых двух регистров.

Как это "вызов"? Оно уже вызвано. Аппаратно. Мы в нем уже находимся.

Если ты подразумеваешь именно вызов функции, то тут, как только ты поставишь внутри обработчика прерывания вызов функции, компилятор вставит сохранение всех local регистров - ведь он не знает, какие регистры юзаются внутри этой функции, поэтому сохраняет все.

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

AV> 5. if (!need_run_scheduler || ISR_Level) AV> 6. восстановили то, что сохранили в п.2 далее reti AV> 7. сохраняем весь контекст AV> 8. вызываем шедулер AV> 9. восстанавливаем контекст новой задачи. AV> 10. reti в новую задачу.

С этим понятно.

AV> Hу что, запредельные накладные расходы?

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

[...]

HZ>> Как? Hа асме написать? Hаучи, как это сделать, например, на AVR? В HZ>> самом проце ничего особенного нет: 32 РОH, 2 байта - Stack Pointer, HZ>> один байт - Status Reg. Как сделать, чтобы сохранять полный контекст HZ>> только когда требуется перепланирование? ISR пишется на С.

AV> см. выше. :)

Нипалучицца. :)

[...]

HZ>> Вроде нет. Или под компилятор HZ>> подстраиваешься?

AV> Hет. С компилятором завзяки только на runtime model, т.е. как расположен (в AV> каких регистрах) и как обслуживается AV> стек и еще кое что по мелочи. Без этих данных невозможно корректное AV> сохранение контекста вообще.

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

Более надежным решением, имхо, является просто отобрать у компилятора возможность рулить процессом сохранения/восстановления регистров в прерывании (осевом). Т.е. чтобы он вообще к этому не касался. Тогда пишем на входе свой код сохранения, на выходе свой код восстановления. И от компилятора не зависим. Главное, чтобы компилятор позволял это делать. Это самое слабое место оного подхода. Но пока на практике все хорошо. IAR для MSP430 имеет специальное слово __raw, для AVR - __task, GCC - __attribute__ ((naked)). И от компилятора тут вообще ничего не зависит - сохранение/восстановление контекста вообще не его ума дело.

HZ>> что есть. В TMS320F28xx тоже все это есть. Hеплохо было бы, если бы HZ>> что-то подобное было и в более мелких. Hу хотя бы в старших моделях HZ>> AVR, MSP430, PIC18 и других их "одноклассников".

AV> Hекто в здравом уме их не нагружает задачами высокоскоростой обработки AV> потоками данных под управлением (RT)OS. Hалицо AV> невостребованность ресурса.

"Налицо" - категория субъективная. При 115200 - период 87 мкс, что есть довольно небольшое время вообще, безотносительно к RTOS. Довольно глупо при приеме пакета прыгать туда-сюда за каждым байтом только для того, чтобы сложить его куда-то в буфер. Такую тупую работу вполне можно поручить периферийному автомату. В MSP430, кстати, для модуля АЦП реализовано пакетное АЦПирование, т.е. зарядить ему очередь, он и собирает. До 16 измерений за раз. Учитывая, что там скорость до 200 киловыборок в секунду может доходить, то прыгать за каждым отсчетом не очень хорошая идея. При этом, он для каждого измерения берет индивидуальные настройки (номер канала, вид опоры и т.д.), т.е. это дело куда как сложнее простого пересылания байтов. И дело даже не в том, что большие объемы надо пересылать, а в скорости. Пусть даже пакеты приходят редко, зато скорость высокая. Эта скорость на момент поступления пакета может просто парализовать МК - прикинь, если там не 115200, а больше?

Все это, конечно, умозрительно, в реальности все знают ограничения и выходят из положения так или иначе. Но, имхо, наличие простейшего FIFO решило бы проблему, а цена за него невелика. Кстати, проблема усугубляется в случае, например, синхронных интерфейсов типа SPI, где скорости выше, а времянки жестче. SPI Slave на МК получается не очень здорово - ведь надо успеть прыгнуть в прерывание и пихнуть следующий байт до прихода следующего бита. Это накладывает ограничения на режим работы Master'а. При наличие FIFO, можно было бы сложить пачку байт в него, и пусть себе отправляются сами. Вот в текущем проекте мне приходится из-за описанного обстоятельства сильно менять режим работы программы, рулящей передачей через SPI: там два устройства-слейва сидят, одно ПЛИС, другое МК. С ПЛИС проблем нет, она все успевает со свистом, что понятно, а вот для МК приходится паузы между передачами байтов вводить, чтобы он гарантированно успевал обменивать байты на своем конце.

Reply to
Harry Zhurov
Reply to
Leha Bishletov

Thu Mar 17 2005 13:14, Olga Nonova wrote to Alex Kouznetsov:

ON> Я ж говорила- эмоции Вас погубят.

Thu Mar 17 2005 15:37, Alex Gavrikov wrote to Maxim Polyanskiy:

AG> Ты ее в pиллайфе видел или так - в электpонном виде?

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

Предварительный осмотр виртуала позволяет предположить, что основной механизм воздействия - плавное передергивание, планомерная генерация правдоподобного бреда на фоне 100% непробиваемости. Похоже, они взяли в команду программеров, так что можно ожидать появления сего виртуала в соответвующих эхах.

Пока, Алексей

Reply to
Alex Kouznetsov
Reply to
Ivan A. Kosarev
Reply to
Sergey Pinigin
Reply to
Vladimir Vassilevsky
Reply to
Maxim Polyanskiy
Reply to
Michael Belousoff

Thu Mar 17 2005 14:27, Harry Zhurov wrote to Alexey V Bugrov:

HZ> Если ты подразумеваешь именно вызов функции, то тут, как только ты HZ> поставишь внутри обработчика прерывания вызов функции, компилятор вставит HZ> сохранение всех local регистров - ведь он не знает, какие регистры HZ> юзаются внутри этой функции, поэтому сохраняет все.

Как я думаю, более оптимально с точки зрения компилятора перекладывать сохранение регистров на вызываемую функцию. В таком случае можно было бы определить соглашение по регисрам, которые вызываемая функция может портить и не обязана восстанавливать по выходу, а которые нет. То есть определить некоторые регистры как temp. В этом случае вызывающая функция ничего не долна сохранять. А вызываемая функция, которая уже знает, что она пользует - это и сохранит, за исключением temp регистров. Это позволит "мелким" функциям вообще ничего не сохранять, пользуясть только временными регистрами.

wbr, Andy

Reply to
Andy Mozzhevilov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.