|
Портируемый код - миф или реальность? |
|
|
|
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 6 2007, 13:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Т.е., обобщая по-порядку: Даже не смешно. Цитата 1. Подбираем подходящую ОС и с помощью напильника в виде смеси С и АСМ (или С в чистом виде?)подгоняем ее под желаемую функциональность. 1. Учимся оценивать требуемую производительность, считаем ресурсы и затраты при использовании имеющихся заделов софта. Определяем время/трудо-затраты на применение. Кто написал код для предыдущей железки неперетачиваемый под новую железку (по вине писателя) отправляется в сад  Цитата 2. Опять же разделяем софт на 2 части - аппаратно-зависимый и нет (тоже работа). Софт для начала разделяется на написанный, возможный для применения, и ненаписанный. Труда здесь - проверить соответствие функциональной схемы и софтария на предмет 10 отличий. Тот софт, который был уже написан, должен был быть при написании разделён на аппаратно-зависимый и портируемый. Кто сделал вначале не так - в сад. Ибо нефиг, к примеру, переписывать функцию вычисления синуса, если поменялся камень с ATmega16 на ATmega128, а если приходится, то объяснить такие растраты нормальному начальнику тяжело - может отправить в сад. Цитата 3. Аппаратную часть пишем на смеси С и АСМ (или С в чистом виде?). Пишем по возможности не на асме, потому как часть может быть также портируема в рамках как минимум семейства камней (например, работа с УАРТом в м8 и м88 похожа, но оно разное как минимум из-за разных имён регистров, разного количества управляющих регистров и т.п. Но работа спортами от этого не меняется) - если протачивание несущественно по сложности/затратам, то разруливается #ifdef-ами. Цитата 4. Независимый кусок пишем на С или С++. А есть что-то против (кроме ответственно проведенного п.1 - всмысле программист отправляет электронщика в сад из-за несоответствия ресурсов поставленной задаче)? Цитата И что, такой подход однозначно гарантирует отсутствие обсуждаемых ошибок?  Чтобы ошибок не было, нужно ничего не делать. Цитата Или уменьшает затраты на их поиск? Уменьшает и существенно - уже отлаженный софт трогать не надо.
--------------------
aka Vit
|
|
|
|
Сообщений в этой теме
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 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 _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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|