|
|
  |
Портируемый код - миф или реальность? |
|
|
|
Oct 8 2007, 06:13
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Этта...Смотрю, читаю...;О) ИМХО моё такое. Ц- не ЯВУ. Это некий асемблер для абстрактного процессора. Поэтому "Ц vs АСМ", смысла не имеет. Ессно, переносимость с "АСМ" на "АСМ" будет легче, чем с АСМ на АСМ. Бо ЯВУ ращщитаны, ИМХО, на работу с датыми, работа с аппаратурой спрятана от программера в ОСи и либраритеках, а в эмбеддерстве немаловажное значение имеет имана работа с жылезом. Поэтому от конструкций типа TCCR1=real_time_tick_data или PORTx=all_leds_on никто не застрахован, даже в языке самово-самово ВУ. В этом смысле, ЯВУ для МК, штука частично фиктивная. Значить, карма у нас такая - ручками шоркать битики. А тут уж, автоматизировать процесс переноса шорканья, кто во что горазд. ;О)
|
|
|
|
|
Oct 8 2007, 08:13
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(mse @ Oct 8 2007, 09:13)  ...Значить, карма у нас такая - ручками шоркать битики. .. ;О) Угу, ночью думал, что у меня за карма, и пришел к печальному выводу, что более-менее умею только это Недавно переносил один проект в 16-ти разрядного на 8-разрядный. Может, конечно, и пропустил пару мест, но в целом не так то и много их, где одна и та же двухбайтовая переменная модифицируется и в прерывании, и в теле, а уж в разных прерываниях вообще нет. Если лень текст просмотреть, то конечно, ОС поможет Кстати, есть места, где необходимость управления прерываниями не зависит от разрядности контроллера: Код void CTB0(void) //clear transmitt buffer { __disable_interrupt(); tx_head0=tx_tail0=0; // clear tx buffer indexes __enable_interrupt(); } Для упрощения портирования можно ввести два новых макроса, которые работали бы как разрешение(запрет) прерывания только для 8-разрядного контроллера.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 8 2007, 08:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Кстати, есть места, где необходимость управления прерываниями не зависит от разрядности контроллера: void CTB0(void) //clear transmitt buffer { __disable_interrupt(); tx_head0=tx_tail0=0; // clear tx buffer indexes __enable_interrupt(); } Если правильно понял, то это работа с кольцевым буфером? Простите, а зачем индексы занулять, если кольцевой?
--------------------
aka Vit
|
|
|
|
|
Oct 8 2007, 09:13
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(sensor_ua @ Oct 8 2007, 11:40)  Если правильно понял, то это работа с кольцевым буфером? Простите, а зачем индексы занулять, если кольцевой? Обнулять не обязательно конечно, но даже такую конструкцию head = tail; надо защищать. Цитата(_Pasha @ Oct 8 2007, 02:58)  Думаю, что ОС должны вырастать из схемы целевого устройства. Тогда и весь бардак сойдет на нет. На ОС возложить (писать на асме): Не всегда есть необходимость ОС писать на ASM. Например задачи промавтоматики не требуют супер-пупер скорости, и гораздо выгоднее чтобы алгоритм работы ОС хорошо просматривался, в ущерб скорости. ASM вставки можно понять и принять если их неболее 1-2% от всего кода.
|
|
|
|
|
Oct 8 2007, 09:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата но даже такую конструкцию head = tail; надо защищать. IMHO, не всегда. Обычно обнуление буфера передачи производится при выключенной передаче.
--------------------
aka Vit
|
|
|
|
|
Oct 8 2007, 11:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата тогда какие вопросы к head = tail = 0 (начальная инициализация)? Скоропостижное выключение самой передачи наглым уравниванием индексов не встречал  Потому и озадачился
--------------------
aka Vit
|
|
|
|
|
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)  Ну и русский язык вытеснен в этой специфической области за неимением собственных устоявшихся терминов/понятий;( А врачи говорят на латыни... Хорошо, давайте попросим автора Рефлекса сделать дополнительно еще и украинский вариант  .
|
|
|
|
|
Oct 8 2007, 13:58
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Dog Pawlowa @ Oct 8 2007, 11:13)  Кстати, есть места, где необходимость управления прерываниями не зависит от разрядности контроллера: Код void CTB0(void) //clear transmitt buffer { __disable_interrupt(); tx_head0=tx_tail0=0; // clear tx buffer indexes __enable_interrupt(); } Для упрощения портирования можно ввести два новых макроса, которые работали бы как разрешение(запрет) прерывания только для 8-разрядного контроллера. И в добавление скажу что я с аналогичным хомутом (определение свободного места в кольцевом буфере) столкнулся впервые на 80х51 на ASM. И никакой ЯВУ мне не скрывал сути. Я её и так не заметил.  Поэтому зачем приплетать одно к другому непонятно. Единожды столкнувшись - учитываешь возможность такой ошибки на любом языке.
|
|
|
|
|
Oct 8 2007, 16:02
|

Частый гость
 
Группа: Свой
Сообщений: 185
Регистрация: 3-08-05
Из: Новосибирск
Пользователь №: 7 334

|
Цитата(Прохожий @ Oct 8 2007, 20:53)  Хорошо, давайте попросим автора Рефлекса сделать дополнительно еще и украинский вариант  . 2ПрохожийСделайте дополнительно ещё и украинский вариант Рефлекса.
--------------------
Всяк хорошая мысля к нам приходит опосля.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|