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

 
 
> Портируемый код - миф или реальность?
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

Сообщений в этой теме
- 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
- - _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 Текстовая версия Сейчас: 19th July 2025 - 12:44
Рейтинг@Mail.ru


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