|
Портируемый код - миф или реальность? |
|
|
|
Oct 6 2007, 09:03
|
Частый гость
 
Группа: Новичок
Сообщений: 173
Регистрация: 3-09-04
Из: Moscow
Пользователь №: 595

|
Очень хочется покидать камушки в огород тех, кто пишет на Си и верит в миф о лёгком портировании кода. Нет возражающих? Ну, тогда начну. Недавно на телесисях была поучительная ветка. Вот она http://telesys.ru/wwwboards/mcontrol/1809/...es/173406.shtmlПрочитайте её, интересно. Прочитали? Тогда продолжим. Это почти классический пример - ЯВУ скрыл от программиста важнейшую деталь реализации: с виду атомарная инструкция "PORTB ^= 1" на самом деле оказалась неатомарной, и автор совершенно не ожидал, что здесь придётся заботиться о корректном доступе к общему ресурсу (порту B ) в многопоточной среде (фоновая задача + обработчик прерывания). Если бы человек писал на ассемблере, он бы легко увидел эту потенциальную "борьбу за ресурс" и принял бы обычные в таких случаях меры. Не исключено (хотя маловероятно), что автор предвидел эту возможную угрозу, но понадеялся, что компилятор достаточно умный и автоматически выберет самый оптимальный вариант реализации, то есть, "PINB = 1", сделав операцию атомарной (разумеется, компилятор сделал бы это из соображений оптимизации по скорости/размеру кода, а не из заботы об атомарности). Для нас важно одно: простые и однозначные с виду операции ЯВУ могут (в зависимости от компилятора и железа) оказаться вовсе не такими простыми и однозначными. Теперь представьте такую ситуацию. У Вас есть Сишный исходник и Вы портируете код проекта на другой МК. Разные не только МК, но и компиляторы. Предположим, что в проекте встречается ситация, аналогичная приведённой выше: в фоновой задаче и в обработчике прерывания используется нечто вроде "PORTB ^= 1", но в предыдущей реализации (при старом МК и старом компиляторе) эта операция была атомарной, а в новой реализации (на новом МК и новом компиляторе) перестала быть атомарной. Вопрос: заметите ли Вы это??? При переносе исходника Вы успешно подправите имена портов, замените где нужно номера битов этих портов, но придёт ли Вам в голову менять стандартную Сишную инструкцию "PORTB ^= 1" на какую-то другую? Да никогда в жизни! И программа успешно скомпилируется, и на Вашем столе она заработает без ошибок, и пирожок с полки Вы возьмёте, преисполненный гордостью за умение легко портировать программы. А потом, через месяц-другой, придут недобрые вести с поля - что-то там не фурычит. Приезжай, творец, разбирайся что натворил - изредка бывают сбои. Спорим, что первое, на что Вы подумаете - это на недостаточную помехозащищённость Вашего девайса.  Вероятность того, что прерывание попадёт внутрь Read-Modify-Write последовательности, достаточно мала и при тестировании обнаружена не будет, но вот в поле (помножьте эту вероятность на тысячу устройств, которые Вы уже изготовили и внедрили) уверенно даст о себе знать. Пока Вы, начиная с мыслей о помехозащищённости, дойдёте до реальной причины неисправности, пройдёт порядка месяца, не меньше, т.к. это очень труднообнаруживаемая ошибка. Вы вряд ли станете искать ошибку в софте, т.к. при портировании код фактически вообще не был изменён, а в предыдущей реализации сбоев не было. Возможно, ошибку так и не найдёте, но будете всем рассказывать сказки про плохую помехозащищённость или ужасную глючность новых МК... Имхо: Надеяться на лёгкую портируемость проектов с одного МК на другой - это путь в страну Грабляндию. Создавая проект, пишите его применительно к данной задаче и для данного МК. Если всё же придётся переносить на другой МК, переносите только блок-схему алгоритма, заново наращивая "скелет" деталями реализации. Чаще всего придётся даже немного изменить алгоритм работы, приспособив его к особенностям новой периферии (например, использовать не поллинг пина по таймеру, а функцию захвата и т.п.). P.S. Сейчас меня обвинят в том, что я не люблю или не умею писать портируемые программы, что большинство программистов в мире пишут только портируемый код, и что за портируемым кодом будущее. В ответ замечу одну большую разницу - не сравнивайте программирование для PC и для МК. Легко портируются те программы, которые фактически не зависят от аппаратуры, например, математические вычисления (БПФ, фильтры и т.п.). Большинство программ для МК сильно зависят от железа. Правильный с точки зрения программирования подход к созданию легко портируемого кода состоит в том, чтобы выделять в отдельные функции (возможно, inline-функции) всё обращение к периферии, и при каждом портировании переписывать эти функции полностью. Причём для одной и той же операции, например, для "PORTB ^= 1", должны присутствовать две функции: одна реентабельная (для случаев типа нашего), другая нереентабельная, зато быстрая (для обычного однопоточного программирования). Тогда проблем будет гораздо меньше, но программы перестанут быть эффективными. Короче, стандартная ситуация с плюсами и минусами универсальности (тут очень в тему будут слова автора с ником -=Shura=- про джаву - искать гуглем по сайту телесистем фразу "anal sex")...
|
|
|
|
|
 |
Ответов
|
Oct 7 2007, 23:58
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Почти шепотом: IAR большой, ему видней... На фоне дебилизации ассемблеров в "С" портируются жизненно-важные вещи типа TCP/IP стека, IEEE754, библиотеки поддержки LCD и прочее. После чего очевидное преимущество в скорости разработки привлекает новых пользователей. Проблема остается. Проблема в том, что детерминированный результат получается разными способами. Теория назначений, способная давать решение проблемы, до сих пор развивается. Зримая аналогия дилеммы ЯВУ-АСМ - это автоматическая трассировка платы. Совершенно неприемлема для 80% устройств. Абстракции... JMP, CALL,ADD, XOR(EOR), RET(RETURN), NOP в конце концов, есть во всех контроллерах. Так на хрена же в одном случае пишется RJMP, а в другом GOTO, JP, JMP ? Получается, что из-за отсутствия мета-мнемоник мы ищем абстракции, перепрыгивая довольно солидный пласт абстракций, содержащийся в кодах операций и операндах? Еще один прикол - появление псевдо-сишных директив в ассемблерах. Не менее смешно, чем написать TCCR1B+=0x01; и думать, что таймер запустится за 3 цикла. Целесообразность портирования. Например умножение двух signed int на меге - 19 тактов, на пике -35 . Смысл плавно умирает. Но, если не знать этого - все зашибись! Думаю, что ОС должны вырастать из схемы целевого устройства. Тогда и весь бардак сойдет на нет. На ОС возложить (писать на асме): 1. Инициализацию всего хозяйства, 2. Все прерывания, 3. Поддерживаемый набор функций через таблицы адресов (как продолжение таблицы векторов прерываний), 4. Сами базовые функции. Конечно, чем меньше их, тем лучше 5. Даже арифметику. Как-то заглянул в листинг Mikroelectronika Pascal for dsPIC. Написал (Паскаль): var A,B,C:real; begin B:= 1.0; A:= 3.1415926; C:= A+B+ B*B; end. ***** Ё-моё, какая там баранина !!! ***** Ничего DSP-шного не используется. Куча кода в режиме совместимости с PIC18. Вот так...
Сообщение отредактировал _Pasha - Oct 8 2007, 00:09
|
|
|
|
|
Oct 8 2007, 13:53
|
Cундук
    
Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269

|
Цитата(_Pasha @ Oct 8 2007, 03:58)  Абстракции... JMP, CALL,ADD, XOR(EOR), RET(RETURN), NOP в конце концов, есть во всех контроллерах. Так на хрена же в одном случае пишется RJMP, а в другом GOTO, JP, JMP ? Получается, что из-за отсутствия мета-мнемоник мы ищем абстракции, перепрыгивая довольно солидный пласт абстракций, содержащийся в кодах операций и операндах? Эта проблема в промавтоматике закрыта, или частично закрыта. Есть некие примитивные мета-языки LD или FBD. Ими широко пользуются. Проекты с одного ПЛК портируются на другие совершенно без проблем. Но там это дело приводили в порядок такие монстры как SIEMENS и ABB в течение 10 лет. В области МК, на мой взгляд, это невозможно. Цитата(_Pasha @ Oct 8 2007, 03:58)  Еще один прикол - появление псевдо-сишных директив в ассемблерах. Не менее смешно, чем написать TCCR1B+=0x01; и думать, что таймер запустится за 3 цикла.
Целесообразность портирования. Например умножение двух signed int на меге - 19 тактов, на пике -35 . Смысл плавно умирает. Но, если не знать этого - все зашибись! А зачем портировать с одного 8 битового процессора на другой? Цитата(_Pasha @ Oct 8 2007, 03:58)  Думаю, что ОС должны вырастать из схемы целевого устройства. Тогда и весь бардак сойдет на нет. На ОС возложить (писать на асме): 1. Инициализацию всего хозяйства, 2. Все прерывания, 3. Поддерживаемый набор функций через таблицы адресов (как продолжение таблицы векторов прерываний), 4. Сами базовые функции. Конечно, чем меньше их, тем лучше 5. Даже арифметику. Как-то заглянул в листинг Mikroelectronika Pascal for dsPIC. Написал (Паскаль): var A,B,C:real; begin B:= 1.0; A:= 3.1415926; C:= A+B+ B*B; end. ***** Ё-моё, какая там баранина !!! ***** Ничего DSP-шного не используется. Куча кода в режиме совместимости с PIC18. Вот так... Все это зависит от стиля программирования, величины проекта, наличия/отсутствия скелета в проекте целиком и еще от кучи факторов. Думаю, всегда найдутся противники Ваших, в общем-то разумных предложений. Цитата(sensor_ua @ Oct 8 2007, 09:47)  Дело в том, что эти понятия формализовано описывают некие механизмы и объекты. Яркий случай - очередь задач. Очередь - объект, явно описанный или неявно, а выполнение последовательности задач (каждой задачи из очереди) - механизм, в зависимости от описания объекта выполняющийся по-разному (что первично, яйцо или курица - отдельный вопрос). Изменение порядка и состава очереди также механизм. Если он явный, то выполняется планировщиком (по причине - некоему событию/сообщению) или/и сопрограммой. И т.д. Да я просто о том, что при определенных стилях и подходах к программированию в сочетании с величиной проекта можно миновать все эти понятия и получить достаточно надежный результат. При этом человек оперирует совершенно другими абстракциями, таким как конечный автомат, состояние, функция переходов и т. д. Эти абстракции проверены временем. Их трудно испортить субъективизмом проектировщика. Поэтому и возник вопрос насчет ОС, которую порой пытаются применять там, где в этом нет никакой необходимости. Если нет нужды в применениии монстрообразных МК, то зачем ОС? А если не предусматривается смены платформы, то и С, в общем-то, не нужен. Цитата(sensor_ua @ Oct 8 2007, 09:47)  Ну и русский язык вытеснен в этой специфической области за неимением собственных устоявшихся терминов/понятий;( А врачи говорят на латыни... Хорошо, давайте попросим автора Рефлекса сделать дополнительно еще и украинский вариант  .
|
|
|
|
Сообщений в этой теме
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, 05:26 Прохожий Цитата(sensor_ua @ Oct 7 2007, 09:26) Авт... Oct 7 2007, 16:22 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  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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|