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

 
 
> Портируемый код - миф или реальность?
CD_Eater
сообщение Oct 6 2007, 09:03
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 173
Регистрация: 3-09-04
Из: Moscow
Пользователь №: 595



Очень хочется покидать камушки в огород тех, кто пишет на Си и верит в миф о лёгком портировании кода. Нет возражающих? Ну, тогда начну.

Недавно на телесисях была поучительная ветка. Вот она
http://telesys.ru/wwwboards/mcontrol/1809/...es/173406.shtml
Прочитайте её, интересно.

Прочитали? Тогда продолжим.
Это почти классический пример - ЯВУ скрыл от программиста важнейшую деталь реализации: с виду атомарная инструкция "PORTB ^= 1" на самом деле оказалась неатомарной, и автор совершенно не ожидал, что здесь придётся заботиться о корректном доступе к общему ресурсу (порту B ) в многопоточной среде (фоновая задача + обработчик прерывания). Если бы человек писал на ассемблере, он бы легко увидел эту потенциальную "борьбу за ресурс" и принял бы обычные в таких случаях меры. Не исключено (хотя маловероятно), что автор предвидел эту возможную угрозу, но понадеялся, что компилятор достаточно умный и автоматически выберет самый оптимальный вариант реализации, то есть, "PINB = 1", сделав операцию атомарной (разумеется, компилятор сделал бы это из соображений оптимизации по скорости/размеру кода, а не из заботы об атомарности). Для нас важно одно: простые и однозначные с виду операции ЯВУ могут (в зависимости от компилятора и железа) оказаться вовсе не такими простыми и однозначными.

Теперь представьте такую ситуацию. У Вас есть Сишный исходник и Вы портируете код проекта на другой МК. Разные не только МК, но и компиляторы. Предположим, что в проекте встречается ситация, аналогичная приведённой выше: в фоновой задаче и в обработчике прерывания используется нечто вроде "PORTB ^= 1", но в предыдущей реализации (при старом МК и старом компиляторе) эта операция была атомарной, а в новой реализации (на новом МК и новом компиляторе) перестала быть атомарной. Вопрос: заметите ли Вы это???
При переносе исходника Вы успешно подправите имена портов, замените где нужно номера битов этих портов, но придёт ли Вам в голову менять стандартную Сишную инструкцию "PORTB ^= 1" на какую-то другую? Да никогда в жизни! И программа успешно скомпилируется, и на Вашем столе она заработает без ошибок, и пирожок с полки Вы возьмёте, преисполненный гордостью за умение легко портировать программы. А потом, через месяц-другой, придут недобрые вести с поля - что-то там не фурычит. Приезжай, творец, разбирайся что натворил - изредка бывают сбои. Спорим, что первое, на что Вы подумаете - это на недостаточную помехозащищённость Вашего девайса. smile.gif Вероятность того, что прерывание попадёт внутрь Read-Modify-Write последовательности, достаточно мала и при тестировании обнаружена не будет, но вот в поле (помножьте эту вероятность на тысячу устройств, которые Вы уже изготовили и внедрили) уверенно даст о себе знать. Пока Вы, начиная с мыслей о помехозащищённости, дойдёте до реальной причины неисправности, пройдёт порядка месяца, не меньше, т.к. это очень труднообнаруживаемая ошибка. Вы вряд ли станете искать ошибку в софте, т.к. при портировании код фактически вообще не был изменён, а в предыдущей реализации сбоев не было. Возможно, ошибку так и не найдёте, но будете всем рассказывать сказки про плохую помехозащищённость или ужасную глючность новых МК...

Имхо:
Надеяться на лёгкую портируемость проектов с одного МК на другой - это путь в страну Грабляндию. Создавая проект, пишите его применительно к данной задаче и для данного МК. Если всё же придётся переносить на другой МК, переносите только блок-схему алгоритма, заново наращивая "скелет" деталями реализации. Чаще всего придётся даже немного изменить алгоритм работы, приспособив его к особенностям новой периферии (например, использовать не поллинг пина по таймеру, а функцию захвата и т.п.).

P.S. Сейчас меня обвинят в том, что я не люблю или не умею писать портируемые программы, что большинство программистов в мире пишут только портируемый код, и что за портируемым кодом будущее. В ответ замечу одну большую разницу - не сравнивайте программирование для PC и для МК. Легко портируются те программы, которые фактически не зависят от аппаратуры, например, математические вычисления (БПФ, фильтры и т.п.). Большинство программ для МК сильно зависят от железа. Правильный с точки зрения программирования подход к созданию легко портируемого кода состоит в том, чтобы выделять в отдельные функции (возможно, inline-функции) всё обращение к периферии, и при каждом портировании переписывать эти функции полностью. Причём для одной и той же операции, например, для "PORTB ^= 1", должны присутствовать две функции: одна реентабельная (для случаев типа нашего), другая нереентабельная, зато быстрая (для обычного однопоточного программирования). Тогда проблем будет гораздо меньше, но программы перестанут быть эффективными. Короче, стандартная ситуация с плюсами и минусами универсальности (тут очень в тему будут слова автора с ником -=Shura=- про джаву - искать гуглем по сайту телесистем фразу "anal sex")...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sensor_ua
сообщение Oct 7 2007, 05:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



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

Автоматное программирование в том виде, который пропагандирует Шалыто, требует, если грубо, специального языка. Некоторые механизмы использования "безопасных" переменных можно подсмотреть в использовании семафоров - правильная процедура модификации завсегда безопасна. Что касается практической реализации, то ближе к реальной - nesos FSMOS http://www.nilsenelektronikk.no/nenesos.html, хотя есть свои нюансы. Я бы напоминил ещё и о Protothreads, которое может перекрыть множество задач с необходимостью хранить состояние.
А если Вы попробуете реализовать переключения в обработчиках прерываний, например, на ARM, то с очень большой вероятностью Вам потребуется ОС, потому как main выполняется в одном режиме ядра, а прерывания - в другом. Так что Вас, похоже, нужно агитировать таки за ОСwink.gif
Цитата
Тогда получается, что все идет к тому, что софт для МК надо покупать. Т. е. модель получения качественного продукта для МК стремительно приближается к тому же самому для PC.

Формально, к сожалению, так. Но я хотел о другой стороне сказать - если кто-то раздаёт код, то в большинстве случаев нужно потрудиться и доточить огрехи самому (хотя встречал оччень серьёзные продукты опенсорц и высочайшегно уровня - накакого напильника, наливай да пейwink.gif). В случае платного продукта эти работы могут и должны (но ответственность и деньги разные бывают) быть выполнены силами техподдержки (а там тоже люди).


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Прохожий
сообщение Oct 7 2007, 16:22
Сообщение #3


Cундук
*****

Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269



Цитата(sensor_ua @ Oct 7 2007, 09:26) *
Автоматное программирование в том виде, который пропагандирует Шалыто, требует, если грубо, специального языка.

Мне ближе Рефлекс, хотя я не во всем согласен с автором этого проекта. Там априори гарантируется сохранение потенциально опасных переменных.

Цитата(sensor_ua @ Oct 7 2007, 09:26) *
ближе к реальной - nesos FSMOS http://www.nilsenelektronikk.no/nenesos.html, хотя есть свои нюансы. Я бы напоминил ещё и о Protothreads, которое может перекрыть множество задач с необходимостью хранить состояние.
А если Вы попробуете реализовать переключения в обработчиках прерываний, например, на ARM, то с очень большой вероятностью Вам потребуется ОС, потому как main выполняется в одном режиме ядра, а прерывания - в другом. Так что Вас, похоже, нужно агитировать таки за ОСwink.gif

Спасибо за информацию, потому как за ОС агитировать меня не надо. Просто проекты до сих пор были обозримыми. Не более 15 процессов с разной скоростью. И 18-ый PIC - это не ARM. До сих пор этого хватало. Если придется заниматься чем-то более монстрообразным, тогда и подход будет другим - с ОС, изучением чужого кода и т.д и т.п.

Цитата(sensor_ua @ Oct 7 2007, 09:26) *
Формально, к сожалению, так. Но я хотел о другой стороне сказать - если кто-то раздаёт код, то в большинстве случаев нужно потрудиться и доточить огрехи самому (хотя встречал оччень серьёзные продукты опенсорц и высочайшегно уровня - накакого напильника, наливай да пейwink.gif). В случае платного продукта эти работы могут и должны (но ответственность и деньги разные бывают) быть выполнены силами техподдержки (а там тоже люди).

Дык, это понятно. Не платишь денег - делаешь сам. Платишь - за тебя это делают другие. Но Вы абсолютно правы - где гарантия, что эти "другие" не подведут тебя под монастырь?
А с другой стороны, бывают такие МК проекты, что один человек с ними уже не справляется.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- CD_Eater   Портируемый код - миф или реальность?   Oct 6 2007, 09:03
- - sensor_ua   Уважаемый, я, конечно, понимаю Ваше настроение. По...   Oct 6 2007, 10:10
- - defunct   ЦитатаНедавно на телесисях была поучительная ветка...   Oct 6 2007, 12:02
|- - Прохожий   Цитата(defunct @ Oct 6 2007, 16:02) ...   Oct 6 2007, 13:21
|- - Petka   Цитата(Прохожий @ Oct 6 2007, 17:21) Т.е....   Oct 6 2007, 13:44
|- - Прохожий   Цитата(Petka @ Oct 6 2007, 17:44) Совсем ...   Oct 6 2007, 14:02
- - sensor_ua   ЦитатаА для работы с аппаратурой есть небольшая пр...   Oct 6 2007, 12:20
- - Petka   Цитата(CD_Eater @ Oct 6 2007, 13:03) Очен...   Oct 6 2007, 12:52
- - sensor_ua   ЦитатаТ.е., обобщая по-порядку: Даже не смешно. Ц...   Oct 6 2007, 13:54
- - SSerge   И в конце концов приходим к неутешительному (для н...   Oct 6 2007, 13:59
- - ArtemKAD   ЦитатаА есть что-то против (кроме ответственно про...   Oct 6 2007, 14:23
- - sensor_ua   ЦитатаОт этого такой подход гарантирует? Не очень ...   Oct 6 2007, 14:45
|- - Прохожий   Цитата(sensor_ua @ Oct 6 2007, 18:27) Не ...   Oct 6 2007, 14:49
|- - rezident   Цитата(Прохожий @ Oct 6 2007, 20:49) Вы п...   Oct 6 2007, 14:57
|- - Прохожий   Цитата(rezident @ Oct 6 2007, 18:57) А ка...   Oct 6 2007, 15:04
|- - rezident   Цитата(Прохожий @ Oct 6 2007, 21:04) Тако...   Oct 6 2007, 15:11
- - sensor_ua   ЦитатаА если цейтнот? И хочется все-таки бездумно?...   Oct 6 2007, 15:00
|- - Прохожий   Цитата(sensor_ua @ Oct 6 2007, 19:00) Дык...   Oct 6 2007, 15:37
- - sensor_ua   ЦитатаCLI по-моему это запрет всех прерываний. Ну ...   Oct 6 2007, 15:21
|- - rezident   Цитата(sensor_ua @ Oct 6 2007, 21:21) Ну ...   Oct 6 2007, 15:51
|- - Прохожий   Цитата(rezident @ Oct 6 2007, 19:51) Прох...   Oct 6 2007, 16:17
|- - ReAl   Цитата(rezident @ Oct 6 2007, 17:51) Во-в...   Oct 6 2007, 17:37
||- - rezident   Цитата(ReAl @ Oct 6 2007, 23:37) Ну так з...   Oct 6 2007, 20:53
||- - ReAl   Цитата(rezident @ Oct 6 2007, 22:53) Можн...   Oct 7 2007, 08:56
|- - defunct   Цитата(rezident @ Oct 6 2007, 18:51) Т.е....   Oct 6 2007, 23:10
- - sensor_ua   ЦитатаНу вот, приехали... Вспоминается анекдот о В...   Oct 6 2007, 16:19
|- - Прохожий   Цитата(sensor_ua @ Oct 6 2007, 20:19) Я В...   Oct 6 2007, 21:41
- - sensor_ua   ЦитатаМне ближе Рефлекс Обнаружил тут целую ветку ...   Oct 7 2007, 16:57
|- - Прохожий   Цитата(sensor_ua @ Oct 7 2007, 20:57) Обн...   Oct 7 2007, 17:40
- - _Pasha   Господа! А заметили ли Вы, что программирован...   Oct 7 2007, 17:12
|- - Прохожий   Цитата(_Pasha @ Oct 7 2007, 21:12) Господ...   Oct 7 2007, 18:06
- - sensor_ua   ЦитатаНо у автора есть и нормальный вариант. Посмо...   Oct 7 2007, 18:02
|- - Прохожий   Цитата(sensor_ua @ Oct 7 2007, 22:02) Пос...   Oct 7 2007, 18:51
- - sensor_ua   ЦитатаНаверняка есть еще. )) Регулярно поднимаются...   Oct 7 2007, 18:14
- - _Pasha   Цитата(Прохожий @ Oct 7 2007, 22:06) А см...   Oct 7 2007, 18:27
- - sensor_ua   Цитатавот методичка спасибо, взглянул. (и у меня, ...   Oct 7 2007, 20:02
|- - Прохожий   Цитата(sensor_ua @ Oct 8 2007, 00:02) спа...   Oct 7 2007, 21:00
- - SasaVitebsk   Хочу предложить посмотреть на всё это с другой сто...   Oct 7 2007, 21:25
- - sensor_ua   ЦитатаА основная причина, по которой я упоминал Ре...   Oct 7 2007, 21:59
|- - Прохожий   Цитата(sensor_ua @ Oct 8 2007, 01:59) Ой,...   Oct 7 2007, 22:28
|- - defunct   Цитата(Прохожий @ Oct 8 2007, 01:28) Да о...   Oct 7 2007, 22:51
- - _Pasha   Почти шепотом: IAR большой, ему видней... На фоне ...   Oct 7 2007, 23:58
|- - Прохожий   Цитата(_Pasha @ Oct 8 2007, 03:58) Абстра...   Oct 8 2007, 13:53
|- - defunct   Цитата(Прохожий @ Oct 8 2007, 16:53) А за...   Oct 8 2007, 15:06
||- - Прохожий   Цитата(defunct @ Oct 8 2007, 19:06) Чтобы...   Oct 8 2007, 15:32
|- - Proton   Цитата(Прохожий @ Oct 8 2007, 20:53) Хоро...   Oct 8 2007, 16:02
|- - Прохожий   Цитата(Proton @ Oct 8 2007, 20:02) 2Прохо...   Oct 8 2007, 16:36
- - sensor_ua   ЦитатаНе окажутся ли такие понятия, как мьютекс, с...   Oct 8 2007, 05:47
- - mse   Этта...Смотрю, читаю...;О) ИМХО моё такое. Ц- не Я...   Oct 8 2007, 06:13
|- - Dog Pawlowa   Цитата(mse @ Oct 8 2007, 09:13) ...Значит...   Oct 8 2007, 08:13
|- - SasaVitebsk   Цитата(Dog Pawlowa @ Oct 8 2007, 11:13) К...   Oct 8 2007, 13:58
- - forever failure   Бубен как бубен. Похлещще видывали, эт даже не буб...   Oct 8 2007, 07:14
- - _Pasha   Цитата(sensor_ua @ Oct 8 2007, 08:47) Дел...   Oct 8 2007, 08:03
- - sensor_ua   ЦитатаКстати, есть места, где необходимость управл...   Oct 8 2007, 08:40
|- - defunct   Цитата(sensor_ua @ Oct 8 2007, 11:40) Есл...   Oct 8 2007, 09:13
|- - Dog Pawlowa   Цитата(sensor_ua @ Oct 8 2007, 11:40) Есл...   Oct 8 2007, 09:29
- - sensor_ua   Цитатано даже такую конструкцию head = tail; надо ...   Oct 8 2007, 09:41
|- - defunct   Цитата(sensor_ua @ Oct 8 2007, 12:41) IMH...   Oct 8 2007, 10:40
- - sensor_ua   Цитататогда какие вопросы к head = tail = 0 (начал...   Oct 8 2007, 11:10
- - _Pasha   Цитата(defunct @ Oct 8 2007, 12:13) Не вс...   Oct 9 2007, 09:16


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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 21:35
Рейтинг@Mail.ru


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