|
|
  |
IAR меня игнорирует . :(, Причем , молча.... собака! |
|
|
|
Sep 17 2009, 21:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ Sep 17 2009, 23:29)  удобно. Нафиг лишние сущности. Цитата(rezident @ Sep 17 2009, 23:07)  Опишите функцию (имею в виду не программное понятие, а функциональную модель аппаратуры), которую выполняет hardware.. Именно так. Иначе за ненужной "универсальностью" ногодрыгания теряется смысл нужной функциональной универсальности.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 17 2009, 22:02
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(zltigo @ Sep 18 2009, 03:42)  Нафиг лишние сущности. Ваше мнение понятно, зачем повторяться? ---- Кто-то пишет HAL, кому-то хватает макросов. У меня в разных проектах на AVR, MB90, MSP430 и STM32 используется, например, один и тот же файл dflash.c: Код void df_init(void) { off(FLASH_CS); direct(FLASH_CS, O); } ... void df_read(...) { on(FLASH_CS); ... } Меняется только файл с макросами (под процессор), и описание ноги чипселекта (под схему, в отдельном инклюде). Ну и чем это не HAL? И где здесь лишние сущности?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 17 2009, 22:31
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ Sep 18 2009, 00:02)  Ну и чем это не HAL? Для тех, кто пишет контроллеры светодиодов это может и "HAL" а для меня это махание ножкой через заднепроходное отверстие. Вместо одной походя написанной банальной и однозначно читаемой строчки. Когда нужно ПОНЯТНО согласовано и эффективно махать хотя-бы несколькими пинами, все эти макросы или идут лесом, или становятся совершенно невразумительными. Глупо обсуждать разнообразные способы лепки куличей из песка - эти "проблемы" интересны только младшей ясельной группе. А лично я уже давно вырос  . Для меня, например, уровень абстракции даже для банального светодиода совсем другой: Код typedef enum{ LM_OFF = 0, LM_ON, LM_BLINK_SLOW, LM_BLINK_NORMAL, LM_BLINK_FAST, LM_FLASH_1, LM_FLASH_2, LM_FLASH_3, LM_FLASH_1_OFF, LM_FLASH_2_OFF, LM_MAX
} led_mode_e;
void led_mode( bint led, led_mode_e mode ) { if( mode >= LM_MAX ) mode = LM_MAX-1; ledstat &= ((~0x11111111) <<led); ledstat |= (led_const[mode]<<led); } led_mode( LED_RED, LM_BLINK_FAST ); И где-то уже дальше-дальше в самом конце Код void led_process( int counter ) { ..........
if( curstat ) IOlCLR = curstat; curstat = (~curstat)&(P_LED_RED|P_LED_GREEN|P_LED_INUSE|P_LED_TEST); if( curstat ) IOlSET = curstat; } И потуги на дивные навороты на банальном включить/выключить "светодиод" мне, как минимум, не интересны.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 17 2009, 23:06
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(zltigo @ Sep 18 2009, 04:31)  Для тех, кто пишет контроллеры светодиодов это может и "HAL" а для меня это махание ножкой через заднепроходное отверстие. Вместо одной походя написанной банальной и однозначно читаемой строчки. Одна понятная строчка, индивидуальная для каждого проекта vs одна понятная строчка на все проекты. Что лучше? Имхо, ответ очевиден. Цитата Когда нужно ПОНЯТНО согласовано и эффективно махать хотя-бы несколькими пинами, все эти макросы или идут лесом, или становятся совершенно невразумительными. Когда приходится согласованно махать несколькими пинами - надо использовать возможности периферии. Вручную махать эффективно всё равно не выйдет. Если до такого дошло, надо что-то править в консерватории. Цитата Глупо обсуждать разнообразные способы лепки куличей из песка - эти "проблемы" интересны только младшей ясельной группе. А лично я уже давно вырос  . Ох, не похоже Цитата Для меня, например, уровень абстракции даже для банального светодиода совсем другой: Таки балуетесь "контроллерами светодиодов"?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 18 2009, 04:32
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Вопрос не по теме, пардон. Цитата(zltigo @ Sep 18 2009, 05:31)  Код typedef enum{ LM_OFF = 0, Зачем тут явная инициализация?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Sep 18 2009, 04:54
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(dxp @ Sep 18 2009, 08:32)  Зачем тут явная инициализация? Для наглядности, я тоже так всегда делаю. Код enum eAnswerCommonParameters { acp_Preamble = 0, // преамбула acp_Status, // слово состояния acp_Ktermo_0, // коэффициент термокомпенсации acp_Ktermo_1, acp_Ktermo_2, // acp_Ktermo_3, acp_Csens_0, // постоянная датчика acp_Csens_1, acp_Csens_2, acp_Csens_3, acp_Rt0_x_10_Low, // калибровочная константа датчика температуры acp_Rt0_x_10_Hi, acp_Rref_x_10_Low, // сопротивление опорного резистора термоканала acp_Rref_x_10_Hi, acp_CS, acp_PacketLen };
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 18 2009, 07:27
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ Sep 18 2009, 01:06)  Если до такого дошло, надо что-то править в консерватории. Давайте покажите мастеркласс обновления консерватории, например, переписав ногомахание для одного из примитивов работы с LCD: Код void lcd_writedata( bint data ) { lcd_waitready( RDY_DATA|RDY_COMMAND ); // Setup DATA PIOlCLR = T6963_CE|T6963_WR|T6963_CD|(0xFFUL<<T6963_D0); PIOlSET = (data & 0xFFUL) << T6963_D0; PIOlSET = T6963_CE|T6963_WR; PIOlSET = T6963_CD; } Вышеприведенное, на мой взгляд описание одной простейшей операции с LCD. Рассыпать ее на более мелкие ногодрыгания одиночных пинов в стиле " on(FLASH_CS)" просто гробить и здравый смысл и программу. Всякие навороченные макросы БЕЗУСЛОВНО полезно читать, разбирать, уметь писать и ПРИМЕНЯТЬ - это упражнение для ума, приобретение навыков и прочеее.... Макросы того-же Волкова это типа шахматного этюда и с этой точки зрения они ОЧЕНЬ полезны. Но реальное программирование отличается, как реальная игра а шахматы от решения надуманных шахматных этюдов. К реальному программированию такого типа макросы можно притянуть только за уши. Нет, конечно, многие так делают и считают использование подобных "штампов" и трюков признаком мастерства  . Но совершенно зря. Цитата Таки балуетесь "контроллерами светодиодов"?  Разумеется. Только не контроллерами светодиодов, а устройствами на которых помимо всего прочего железа из которого чип контроллера обычно самый маленький, есть и светодиоды. И я ими разнообразно мигаю, только не на уровне примитива on( RED_LED ) - слишком примитивно  Хотя встречаются и почти чистые контроллеры светодиодов - месяц назад 64 светодиода и 32 кнопки на голой ATmega16 походя написал. И даже ума не приложу через какую задницу там можно было макросы типа приведенных Вами использовать  , хотя вся "программа" это чистое, как слеза, ногодрыгание и переноситься на три варианта конструкции-разводки. Цитата(dxp @ Sep 18 2009, 06:32)  Зачем тут явная инициализация? Банальная наглядность - уточнение с долей привычки. Абсолютно безобидная привычка.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 18 2009, 08:12
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(zltigo @ Sep 18 2009, 13:27)  Давайте покажите мастеркласс, например, переписав ногомахание для одного из примитивов работы с LCD: Я где-то призывал использовать макросы Волкова повсеместно? Всему своё место и время. Цитата Вышеприведенное, на мой взгляд описание одной простейшей операции с LCD. Рассыпать ее на более мелкие ногодрыгания одиночных пинов в стиле " on(FLASH_CS)" просто гробить и здравый смысл и программу. Вы говорите какие-то банальности. Даже несерьёзно. Расскажите ещё, что при 16-битной шине использовать "on(FLASH_CS)" глупо  Однако же, существует SPI с его чипселектами, множество микросхем имеет ножки готовности (опять же одиночные), да мало ли примеров одиноких ножек, замечательно ложащихся под эти макросы. Цитата Всякие навороченные макросы БЕЗУСЛОВНО полезно читать, разбирать, уметь писать и ПРИМЕНЯТЬ - это упражнение для ума, приобретение навыков и прочеее.... Да что же в них навороченного-то? Там всё достаточно прозрачно. Это просто полезные макросы. Цитата Но реальное программирование отличается, как реальная игра а шахматы от решения надуманных шахматных этюдов. К реальному программированию такого типа макросы можно притянуть только за уши. Нет, конечно, многие так делают и считают использование подобных "штампов" и трюков признаком мастерства  . Но совершенно зря. Я так понимаю, под "реальным программистом" вы имеете в виду себя?  У меня несколько другое представление о реальном программировании. Реальное программирование - это когда человек способен применять разнообразные инструменты и приёмы в зависимости от задачи. А ваш подход больше напоминает узколобый догматизм, уж извините. Цитата месяц назад 64 светодиода и 32 кнопки на голой ATmega16 походя написал. И даже ума не приложу через какую задницу там можно было макросы типа приведенных Вами использовать  Ну и о чём это говорит? О том что инструмент плохой? Нет. Просто неподходящий для данного конкретного случая.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 18 2009, 08:44
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(zltigo @ Sep 17 2009, 23:18)  Баловство все эти фирменные навороты или навороченные (переболел в свое время) макросы. Там (ARM7) кстати не всегда и применишь данные макросы. Смотреть надо. Не везде однозначность. Например установка бита, порождает конструкцию вида чтение-модификация-запись. То есть, если есть флаги (попутные), которые сбрасываются единицей, то они уйдут незаметно.  Что-то я ищё подобное для себя отмечал. Короче, в общем случае, порождает неоднозначность. То есть порождает отрыв программиста от железа. Когда человек пишет "установить бит в 1" то он не учитывает попутные действия компилятора. Поэтому, если честно, я тоже не пользуюсь такими конструкциями ни в AVR ни в ARM.  Не хочется запоминать и анализировать.  Но в инициализации применял, для наглядности. Сразу видно.
|
|
|
|
|
Sep 18 2009, 09:15
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ Sep 18 2009, 10:12)  Ну и о чём это говорит? О том что инструмент плохой? Нет. Просто неподходящий для данного конкретного случая. Когда некий инструмент подходит исключительно для очень конкретного И ПРОСТЕЙШЕГО случая, а рядом с этим случаем, в этом-же проекте 99 других случаев идущих в разрез с этим "инструментом"  . Причем инструменты оставшиеся задачи спокойно решают и "конкретную" задачу, то поминаемый Вам "хороший" инструмент становится именно той лишней сущностью  . А его использование, как Вы там сказали - "напоминает узколобый догматизм, уж извините." Цитата Однако же, существует SPI с его чипселектами, множество микросхем имеет ножки готовности (опять же одиночные).... SPI? Их есть у нас. Вот, например: Код __arm void send_spi_start_int( SPI_bcb *sp, int data ) { IO0CLR = sp->msel; S0SPDR = data; // Data if( S0SPSR_check() ) return; IO0SET = P0B_S0SEL_MASK; sp->flag &= (~BCB_TX_START); }
int work_spi_modgal( bint modul, WORD adrdat ) { int i = 1000; // Total timeout
if( modul ) IO0CLR = P0B_M1_CSEL; else IO0CLR = P0B_M0_CSEL; do // Timeout if not ready { IO0CLR = S0SSEL_SOFT; if( !(IO0PIN & P0B_MX_RDY) ) // Ready? { IO0CLR = P0B_MX_AC; // Select 'Address' byte S0SPDR = (adrdat>>8); // Send Hi byte(address) if( S0SPSR_check() ) // Wait end of transmit goto dsl_exit_error; IO0SET = (S0SSEL_SOFT|P0B_MX_AC); // Disable Select and set 'Data' do // Timeout if not ready { IO0CLR = S0SSEL_SOFT; // Select if( !(IO0PIN & P0B_MX_RDY) ) // Ready? { S0SPDR = adrdat; // Send Lo byte(data/dummy) if( S0SPSR_check() ) // Wait end of transmit goto dsl_exit_error; IO0SET = (P0B_MASK_CSEL|S0SSEL_SOFT|P0B_MX_AC); // Disable SHDSL return( S0SPDR ); // Get any data } IO0SET = S0SSEL_SOFT; // Disable Select delay_us( 10 ); i--; } while( i > 0 ); } IO0SET = S0SSEL_SOFT; // Disable Select delay_us( 10 ); i--; } while( i > 0 ); dsl_exit_error: IO0SET = (P0B_MASK_CSEL|S0SSEL_SOFT|P0B_MX_AC); // Disable SHDSL return( -1 ); } Куда прикажете вставлять макрос для махания shipselect? Цитата ...да мало ли примеров одиноких ножек, замечательно ложащихся под эти макросы. Ничножно мало и повторюсь еще раз, рядом с этими одиночными "замечательно ложащимися" еще куча не одиночных... Плодить лишнюю сущность для работы с 1-2 одиночными, когда рядом еще десятки "неудобных" пинов просто незачем.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 18 2009, 09:45
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(AHTOXA @ Sep 18 2009, 00:29)  Так есть же макросы имени Волкова. Очень удобно. Спасибо за ссылку. Я сделал немного по другому по сравнению с Волковым, и делал это последним на долгой дороге структуризации текущих проектов, после структуризации состояний, многоязычных сообщений, сигналов с датчиков, ошибок и прочей ерунды. Основная причина - самодокументируемость, файл описания должен быть понятен заказчику , ну а порты - чтобы было в одном стиле. В части использования макросов Волкова, я больше склоняюсь к мнению zltigo, поскольку до недавнего времени прямое ногодрыганье было описано функциональными макросами. Вот только поддержка режимов работы в бэкграунде все-таки следующий уровень модели OSI  , и правильно не опускаться до портов сквозь уровень функциональных макросов, даже если это кажется проще. Ладно, дискуссия немного остра получается, и подобная тема возникает раз в пол-года, вот попробую укрепиться в своем мнении и порву всех  Цитата(zltigo @ Sep 18 2009, 10:27)  это чистое, как слеза, ногодрыгание и переноситься на три варианта конструкции-разводки. Как это выглядит? Я понимаю, условная компиляция, но на каком этапе. Дело в том, что меня клинит, если по тексту разбросаны ifdef/endif. Все, что не помещается на экран, не помещается в мозг  Цитата(zltigo @ Sep 18 2009, 10:27)  Вышеприведенное, на мой взгляд описание одной простейшей операции с LCD. У нас lcd разные, и тут все выглядит не очень противно  Код void WriteByte1(uchar ch) { uchar i; OffPin(LcdCsb); for (i = 0; i<8; i++) { if (ch & 0x80) OnPin(LcdSi); else OffPin(LcdSi); OffPin(LcdClk); OnPin(LcdClk); ch <<= 1; } OnPin(LcdCsb); } void WriteLcdControl(char D) { OffPin(LcdRs); WriteByte1(D); }
void WriteLcdData(char D) { OnPin(LcdRs); WriteByte1(D); }
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Sep 18 2009, 09:55
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dog Pawlowa @ Sep 18 2009, 11:41)  Как это выглядит? Я понимаю, условная компиляция, но на каком этапе. Дело в том, что меня клинит, если по тексту разбросаны ifdef/endif. Все, что не помещается на экран, не помещается в мозг  Макросы, только без притензий на "универсальность", а по месту, и таблицы в ROM. Пример заполнения одной из таблиц Код #define MELODY( a, b, c, d ) (((d)<<9)|((c)<<6)|((b)<<3)|(a)) #define DUALTON( a, b ) (((b)<<14)|((a)<<12))
const ushort gtact[GEN_TAKTS] = { MELODY(1,1,1,4) | DUALTON(TOFF,DUAL), MELODY(2,0,2,5) | DUALTON(DUAL,DUAL), MELODY(3,2,3,6) | DUALTON(TOFF,SINGLE), .... .... ....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 18 2009, 10:15
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(zltigo @ Sep 18 2009, 15:15)  Когда некий инструмент подходит исключительно для очень конкретного И ПРОСТЕЙШЕГО случая, а рядом с этим случаем, в этом-же проекте 99 других случаев идущих в разрез с этим "инструментом"  Вовсе не вразрез. Ортогонально. Не подходит - не пользуешь, подходит - почему нет? Цитата Причем инструменты оставшиеся задачи спокойно решают и "конкретную" задачу, то поминаемый Вам "хороший" инструмент становится именно той лишней сущностью  . Я собственно уже всё обосновал. Вы упорно не желаете слушать, и приводите однообразные примеры. Цитата А его использование, как Вы там сказали - "напоминает узколобый догматизм, уж извините." Неизящно. Как "сам дурак" в детском садике  Использование инструмента по месту - никак не догматизм. А вот упорное отрицание возможной полезности инструмента - да. Цитата SPI? Их есть у нас. Вот, например: Ужас. Вам что, платят по количеству строчек кода, как индусам?  Код int put_byte(uint08_t b) { int i = 1000; // Total timeout int res = -1;
do { on(S0SSEL_SOFT); if((signal(MX_RDY)) { S0SPDR = adrdat; if(!S0SPSR_check()) res = S0SPDR; break; } off(S0SSEL_SOFT); delay_us( 10 ); i--; } while( i > 0 ); off(P0B_MASK_CSEL); off(S0SSEL_SOFT); off(P0B_MX_AC); return res; }
int work_spi_modgal( bint modul, WORD adrdat ) { int i = 1000; // Total timeout int res;
if( modul ) on(M1_CSEL); else on(M0_CSEL); res = put_byte(adrdat>>8); if (res != -1) res = put_byte(adrdat); return res; } Цитата Куда прикажете вставлять макрос для махания shipselect? Вот, как-то так...
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 18 2009, 10:22
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ Sep 18 2009, 12:15)  .... и приводите однообразные примеры.  сказал, АНТОХА и в очередной раз написал on()  Цитата Ужас. Вам что, платят по количеству строчек кода, как индусам?  Нет, за рабочий код в том числе работающий с железом так, как нужно железу а не мерещится специалистам по макросам описывающим ножку. Не Вам обижать индусов. Цитата Вот, как-то так... Выше просто абсолютно нерабочая отсебятина из которой выброшен почти смысл, зато, например, простые вещи типа Код IO0SET = (P0B_MASK_CSEL|S0SSEL_SOFT|P0B_MX_AC); // Disable SHDSL заменены на три Код off(P0B_MASK_CSEL); off(S0SSEL_SOFT); off(P0B_MX_AC); И после этого "Вам что, платят по количеству строчек кода, как индусам?"  . Глупо. О том, что даже эти три строчки совсем другая диаграмма и другие времена помолчим, и тот-же P0B_MASK это совсем не бит.. Но объяснять это счастливому обладателю "отвертки" желающему неприменно запихнуть ее куда попало видимо, пока? невозможно  . Может со временем и сами переболеете, как переболел желанием абстрагировать всякую мелочь я.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 18 2009, 10:39
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(zltigo @ Sep 18 2009, 13:22)  простые вещи типа Код IO0SET = (P0B_MASK_CSEL|S0SSEL_SOFT|P0B_MX_AC); // Disable SHDSL заменены на три... о том, что это совсем другая диаграмма Справедливости ради ... механизм макросов позволяет назвать сразу группу бит и применить одну команду.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|