|
Стиль программирования на Си, описание функции |
|
|
|
Mar 31 2008, 10:23
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Добрый день! Столкнулся со следующей проблемой. нашол код как сделать восемь таймеров написанный Alechin Jan. Первое что кидается в глаза та это синтаксис мне непонятный. Вот к примеру прототип функции остановки тай мера: Код void Stop_Timer(IN IDX timer); ну и сама функция: Код /*--------------------------------------------------------------------------------------------*/ /* Процедура остановки таймера. */ /* Принимает: номер таймера (0 - 7). */ /* Возвращает: ничего не возвращает. */ /*--------------------------------------------------------------------------------------------*/ __monitor void Stop_Timer(IN IDX timer) { Timer[timer].Timer_Ena = TIMER_DIS; return; } Непонятно что такое IDX? Ну IN понятно, направление, очень удобно. IDX по ходу здесь беззнаковый чар. Ну и соответственно вопрос: Этот синтаксис возможен через какоето макроопределение? Может кто знает, подскажите, уверен это интерессно не только мне. Вот ещё пример Код void Start_Timer(IN IDX timer, IN WORD interval, IN pTIMER_FUNC pFunc = NULL, IN bool cycle = TIMER_ONCE); Спасибо.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
 |
Ответов
|
Apr 2 2008, 19:30
|

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

|
Цитата(SasaVitebsk @ Apr 2 2008, 21:34)  ... совершенно очевидно, что компилятору по барабану написали ли вы формулу одним оператором или тремя. Качество сгенерированного кода не ухудшится Компиляторы умнеют, но тем не менее пока не умнее Вас и на подсказку вполне вероятно, ответят лучшим кодом. Цитата(singlskv @ Apr 2 2008, 22:19)  Более того, при написании 3мя операторами оно может и существенно улучшиться  если знаешь как правильно разбить эти 3 оператора на нужное количество строк... Вы знаете? Тогда пример в студию...... Цитата(_Pasha @ Apr 2 2008, 21:53)  Поэтому, когда мне закинут в уши мысль типа...  ну зачем-же гордится своей наивностью?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2008, 20:31
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Apr 2 2008, 23:30)  Вы знаете? Тогда пример в студию...... Да пожалуйста, WinAvr20060421, на IAR тоже как-то проверял, чуть получше но тоже не блеск: Код #include <avr/io.h>
volatile unsigned char al=0xFF; volatile unsigned char ah=0xFF; volatile unsigned char Pb,Pc,Pd;
int main() { unsigned char pb,pc,pd;
unsigned char tmpl = al; unsigned char tmph = ah;
//------------ Вариант N1 ("правильный") pb = (tmph & 0b10000000) | ((tmph & 0b01110000) >> 1) | ((tmph & 0b00001100) >> 2); pc = ((tmph & 0b00000011) << 2) | ((tmpl & 0b11000000) >> 6); pd = tmpl <<2; //----- сохраняем результат Pb = pb; Pc = pc; Pd = pd;
tmpl = al; tmph = ah;
//------------ Вариант N2 ("неправильный :) ") pd = (tmpl << 2); pc = tmph & 0b01111100; pc >>= 1; pb = (tmph & 0b10000000); pb |= (pc & 0b00111000); pc &= 0b00000110; pc >>= 1; pb |= pc; pc = (tmph&0b00000011); pc <<= 2; pd = tmpl >> 6; pc |= pd; pd = tmpl << 2; //----- сохраняем результат Pb = pb; Pc = pc; Pd = pd;
//---------------------------
while (1);
} результат компиляции: Код pb = (tmph & 0b10000000) | ((tmph & 0b01110000) >> 1) | ((tmph & 0b00001100) >> 2); 6c: 24 2f mov r18, r20 6e: 33 27 eor r19, r19 70: c9 01 movw r24, r18 72: 80 77 andi r24, 0x70; 112 74: 90 70 andi r25, 0x00; 0 76: 95 95 asr r25 78: 87 95 ror r24 7a: 40 78 andi r20, 0x80; 128 7c: 48 2b or r20, r24 7e: c9 01 movw r24, r18 80: 8c 70 andi r24, 0x0C; 12 82: 90 70 andi r25, 0x00; 0 84: 95 95 asr r25 86: 87 95 ror r24 88: 95 95 asr r25 8a: 87 95 ror r24 8c: 48 2b or r20, r24 pc = ((tmph & 0b00000011) << 2) | ((tmpl & 0b11000000) >> 6); 8e: 23 70 andi r18, 0x03; 3 90: 30 70 andi r19, 0x00; 0 92: 22 0f add r18, r18 94: 33 1f adc r19, r19 96: 22 0f add r18, r18 98: 33 1f adc r19, r19 9a: 85 2f mov r24, r21 9c: 99 27 eor r25, r25 9e: 36 e0 ldi r19, 0x06; 6 a0: 96 95 lsr r25 a2: 87 95 ror r24 a4: 3a 95 dec r19 a6: e1 f7 brne .-8 ; 0xa0 <main+0x44> a8: 28 2b or r18, r24 pd = tmpl <<2; aa: 55 0f add r21, r21 ac: 55 0f add r21, r21 Код pd = (tmpl << 2); pc = tmph & 0b01111100; c2: 24 2f mov r18, r20 c4: 2c 77 andi r18, 0x7C; 124 pc >>= 1; c6: 26 95 lsr r18 pb = (tmph & 0b10000000); c8: 94 2f mov r25, r20 ca: 90 78 andi r25, 0x80; 128 pb |= (pc & 0b00111000); cc: 82 2f mov r24, r18 ce: 88 73 andi r24, 0x38; 56 d0: 98 2b or r25, r24 pc &= 0b00000110; d2: 26 70 andi r18, 0x06; 6 pc >>= 1; d4: 26 95 lsr r18 pb |= pc; d6: 92 2b or r25, r18 pc = (tmph&0b00000011); d8: 24 2f mov r18, r20 da: 23 70 andi r18, 0x03; 3 pc <<= 2; dc: 22 0f add r18, r18 de: 22 0f add r18, r18 pd = tmpl >> 6; e0: 85 2f mov r24, r21 e2: 82 95 swap r24 e4: 86 95 lsr r24 e6: 86 95 lsr r24 e8: 83 70 andi r24, 0x03; 3 pc |= pd; ea: 28 2b or r18, r24 pd = tmpl << 2; ec: 55 0f add r21, r21 ee: 55 0f add r21, r21 ИТОГО: "Правильный" 21 слов 58 тактов "Неправильный" 17 слов 23 такта Выводы делаем сами
|
|
|
|
|
Apr 2 2008, 21:51
|

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

|
Цитата(singlskv @ Apr 2 2008, 23:31)  Да пожалуйста, WinAvr20060421, на IAR тоже как-то проверял, чуть получше но тоже не блеск: Ну и где обещанная экономия от Цитата ...правильно разбить эти 3 оператора на нужное количество строк... Налицо ДВА РАЗНЫХ АЛГОРИТМА, а не описание одного и того-же "разным количеством строк". Кроме того, посмею предположить, что под нормально оптимизирующим компилятором разница будет в пару команд максимум. Цитата Выводы делаем сами Сделал  Цитата(AlexKLm @ Apr 3 2008, 00:22)  Мне нравится стиль Microsoft, лучше трудно придумать. Трудно придумать стиль в котором больше жертв принесено стилю ради собственно абсолютно формального стиля.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2008, 21:55
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Apr 3 2008, 01:47)  Налицо ДВА РАЗНЫХ АЛГОРИТМА, с ОДИНАКОВЫМ результатом, и принципиально не различающимся методом вычислений, + если Вы не обратили внимание, во втором варианте операции на одну больше  Цитата Кроме того, посмею предположить, что под нормально оптимизирующим компилятором разница будет в пару команд максимум. покажите результат компиляции...
|
|
|
|
|
Apr 2 2008, 22:08
|

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

|
Цитата(singlskv @ Apr 3 2008, 00:55)  покажите результат компиляции... А самому? Думаете поленюсь copy-paste и убрать отрыжки древних ассемблеров не имеющих препроцессоров? Ладно: Код // 19 void m1(void) m1: // 20 { // 21 unsigned char pb,pc,pd; // 22 // 23 unsigned char tmpl = al; LDI R30, LOW(al) LDI R31, (al) >> 8 LD R19, Z // 24 unsigned char tmph = ah; LDD R16, Z+1 // 25 // 26 //------------ Вариант N1 ("правильный") // 27 pb = ( tmph & 0x80 )|( (tmph & 0x70) >> 1 )|( (tmph & 0xC0) >> 2 ); // 28 pc = ((tmph & 0x03) << 2 )|( (tmpl & 0xC0) >> 6 ); // 29 pd = tmpl <<2; // 30 // 31 //----- сохраняем результат // 32 Pb = pb; MOV R18, R16 ANDI R18, 0x80 MOV R17, R16 ANDI R17, 0x70 ASR R17 OR R18, R17 MOV R17, R16 ANDI R17, 0xC0 LSR R17 LSR R17 OR R18, R17 STD Z+2, R18 // 33 Pc = pc; ANDI R16, 0x03 LSL R16 LSL R16 LDI R17, 4 MUL R19, R17 OR R16, R1 STD Z+3, R16 // 34 Pd = pd; LSL R19 LSL R19 STD Z+4, R19 // 35 // 36 } RET
// 38 void m2(void) m2: // 39 { // 40 // 41 unsigned char pb,pc,pd; // 42 // 43 unsigned char tmpl = al; LDI R30, LOW(al) LDI R31, (al) >> 8 LD R20, Z // 44 unsigned char tmph = ah; LDD R18, Z+1 // 45 // 46 //------------ Вариант N2 ("неправильный :) ") // 47 pd = (tmpl << 2); // 48 // 49 pc = tmph & 0x7C; // 50 pc >>= 1; MOV R17, R18 ANDI R17, 0x7C LSR R17 // 51 // 52 pb = (tmph & 0x80); // 53 pb |= (pc & 0x38); // 54 pc &= 0x06; // 55 pc >>= 1; // 56 pb |= pc; // 57 pc = tmph & 0x03; // 58 pc <<= 2; // 59 pd = tmpl >> 6; // 60 pc |= pd; // 61 pd = tmpl << 2; // 62 //----- сохраняем результат // 63 Pb = pb; MOV R19, R18 ANDI R19, 0x80 MOV R16, R17 ANDI R16, 0x38 OR R19, R16 ANDI R17, 0x06 LSR R17 OR R19, R17 STD Z+2, R19 // 64 Pc = pc; ANDI R18, 0x03 LSL R18 LSL R18 LDI R16, 4 MUL R20, R16 OR R18, R1 STD Z+3, R18 // 65 Pd = pd; LSL R20 LSL R20 STD Z+4, R20 // 66 } RET P.S. Получилось, что все ухищрения яйца выеденного не стоят....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2008, 22:37
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Apr 3 2008, 02:08)  и убрать отрыжки древних ассемблеров не имеющих препроцессоров? это не отрыжки, это удобство для данной конкретной задачки, по битикам видно что куда попадает, но это просто специфика... Кстати Вы вот так и ошиблись при переводе из двоичного представления в 16x вот так: (tmph & 0b10000000)......(tmph & 0b01110000).......(tmph & 0b00001100 ) сразу же видно что взяли нужные битики, а вот так нифига не видно: ( tmph & 0x80 )........(tmph & 0x70)..........(tmph & 0xC0 ) Цитата Я же говорю, пробовал, раньше код был намного хуже. Какая версия ? С таким выходом - убедили!
|
|
|
|
|
Apr 3 2008, 05:53
|

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

|
Цитата(singlskv @ Apr 3 2008, 01:37)  это не отрыжки, это удобство для данной конкретной задачки, по битикам видно что куда попадает, но это просто специфика... Да ничего не видно, при "видно" не ошибся-бы,даже в 2 часа ночи... А тут даже на 8bit глазоломка, а уж на 32  Цитата сразу же видно что взяли нужные битики, Более-менее видно когда такое написано,хоть на ASM, хоть на C, как минимум так: Код ( tmph & BIT7 )........(tmph & (BIT6|BIT5|BIT4)).......... а вобще надо давать осмысленные имена Код ( tmph & B_SIGN )........(tmph & M_LEVEL).......... Цитата Я же говорю, пробовал, раньше код был намного хуже. Какая версия ? IAR 5.10, но, полагаю, и на 4.x будет тот-же результат.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
sKWO Стиль программирования на Си Mar 31 2008, 10:23 Axxel Цитата(sKWO @ Mar 31 2008, 16:23) Этот си... Mar 31 2008, 10:36 aaarrr Стиль жуткий, не надо так делать.
Цитата(Axxel ... Mar 31 2008, 10:40 defunct ЦитатаЭтот синтаксис возможен через какоето макроо... Mar 31 2008, 10:59 sKWO Цитата(defunct @ Mar 31 2008, 14:59) да, ... Mar 31 2008, 11:56  dxp Цитата(sKWO @ Mar 31 2008, 18:56) Да, тог... Mar 31 2008, 12:16  defunct Цитата(sKWO @ Mar 31 2008, 13:56) Чёта му... Mar 31 2008, 14:17  Axxel Цитата(sKWO @ Mar 31 2008, 17:56) ПОКАЖИ
... Apr 1 2008, 04:30 sensor_ua ЦитатаВо всех случаях, где можно выбирать, предпоч... Mar 31 2008, 12:48 rezident Извиняюсь, что вклиниваюсь.
Цитата(sensor_ua ... Mar 31 2008, 14:13 dxp Цитата(sensor_ua @ Mar 31 2008, 19:48) Пр... Apr 1 2008, 03:41 Alechin Так как кусок кода мой - скажу как это описано у м... Mar 31 2008, 14:08 sensor_ua ЦитатаДля переносимости кода....
IMNHO, совсем неу... Mar 31 2008, 14:39 rezident Цитата(sensor_ua @ Mar 31 2008, 20:39) IM... Mar 31 2008, 14:51 vshemm Есть замечательная книга Алена Голуба "Правил... Mar 31 2008, 15:08 sensor_ua ЦитатаУже были и неоднократно пояснения почему typ... Mar 31 2008, 15:23 sKWO Спасибо, Ребята! Дисскусия разворачивается хор... Mar 31 2008, 16:51 sensor_ua Попробуй таки найти текстовым поиском "#defin... Mar 31 2008, 17:10 rezident Цитата(sensor_ua @ Mar 31 2008, 23:10) По... Mar 31 2008, 17:12 sensor_ua ЦитатаА вот на такое безобразие препроцессор сруга... Mar 31 2008, 17:26 rezident Цитата(sensor_ua @ Mar 31 2008, 23:26) А ... Mar 31 2008, 18:49 sensor_ua Гы Мне код перебивать не нужно. Мне как раз единож... Mar 31 2008, 19:07 Lem препроцессором не рекомендуется пользоваться именн... Mar 31 2008, 20:08 ReAl Цитата(Lem @ Mar 31 2008, 22:08) как во ч... Apr 1 2008, 12:40  dxp Цитата(ReAl @ Apr 1 2008, 19:40) Как прав... Apr 1 2008, 13:50   Сергей Борщ Цитата(dxp @ Apr 1 2008, 16:50) Осталось ... Apr 1 2008, 14:43   ReAl Цитата(dxp @ Apr 1 2008, 15:50) Это где т... Apr 1 2008, 14:51   zltigo Цитата(dxp @ Apr 1 2008, 16:50) А вот в и... Apr 1 2008, 20:44    SasaVitebsk Цитата(zltigo @ Apr 2 2008, 00:44) Рекоме... Apr 1 2008, 22:17     _Pasha Цитата(SasaVitebsk @ Apr 2 2008, 01:17) П... Apr 2 2008, 06:58    ReAl Цитата(zltigo @ Apr 1 2008, 22:44) Самост... Apr 2 2008, 11:55     defunct Цитата(ReAl @ Apr 2 2008, 13:55)
Шаманим... Apr 2 2008, 12:15      ReAl Цитата(defunct @ Apr 2 2008, 14:15) Это я... Apr 2 2008, 12:40       defunct Цитата(ReAl @ Apr 2 2008, 14:40) Фух, а т... Apr 2 2008, 12:43       _Pasha Цитата(ReAl @ Apr 2 2008, 15:40) ...спосо... Apr 2 2008, 18:53     zltigo Цитата(ReAl @ Apr 2 2008, 14:55) По повод... Apr 2 2008, 15:01      sKWO Позволю небольшой отрывок кода, извиняюсь что немн... Apr 2 2008, 16:40 sensor_ua Цитатапрепроцессором не рекомендуется пользоваться... Mar 31 2008, 20:29 _Pasha Цитата(vshemm @ Mar 31 2008, 19:08) Так т... Mar 31 2008, 22:07 sensor_ua ЦитатаУже неоднократно на эту тему проходились, по... Apr 1 2008, 05:53 Dog Pawlowa Цитата(sensor_ua @ Apr 1 2008, 08:53) Про... Apr 1 2008, 06:30 dxp Цитата(sensor_ua @ Apr 1 2008, 12:53) А в... Apr 1 2008, 07:01 _Pasha Пример winavr
Кодeeprom_read_block(&my_var... Apr 1 2008, 06:16 _Pasha Цитата(sensor_ua @ Apr 1 2008, 09:53) К с... Apr 1 2008, 06:33 sensor_ua ЦитатаНо это, повторяю, другое
Дальше бессмысленно... Apr 1 2008, 08:17 dxp Цитата(sensor_ua @ Apr 1 2008, 15:17) Дал... Apr 1 2008, 09:28 SasaVitebsk Очень интересная дискуссия развернулась. Но, в общ... Apr 1 2008, 12:48 dxp Цитата(SasaVitebsk @ Apr 1 2008, 19:48) Н... Apr 1 2008, 13:11  ReAl Цитата(dxp @ Apr 1 2008, 15:11) Во всяком... Apr 1 2008, 13:40   defunct Цитата(ReAl @ Apr 1 2008, 15:40) Но ведь ... Apr 2 2008, 09:58    andrew_b Цитата(defunct @ Apr 2 2008, 12:58) Delph... Apr 2 2008, 10:15    Сергей Борщ Цитата(defunct @ Apr 2 2008, 12:58) Прост... Apr 2 2008, 12:34     defunct Цитата(Сергей Борщ @ Apr 2 2008, 14:34) Н... Apr 2 2008, 12:39 Сергей Борщ Цитата(SasaVitebsk @ Apr 1 2008, 15:48) К... Apr 1 2008, 13:15 Lem одним из авторитетов для меня является Герб Саттер... Apr 1 2008, 13:07 sensor_ua ЦитатаНе следует путать приятное с полезным...
Не ... Apr 1 2008, 13:37 singlskv Цитата(SasaVitebsk @ Apr 2 2008, 22:34) С... Apr 2 2008, 19:19       ReAl Цитата(singlskv @ Apr 3 2008, 00:37) Я же... Apr 2 2008, 22:46        singlskv Цитата(ReAl @ Apr 3 2008, 02:32) Кстати, ... Apr 2 2008, 23:25         ReAl Цитата(singlskv @ Apr 3 2008, 00:55) Так ... Apr 2 2008, 23:45          defunct Цитата(ReAl @ Apr 3 2008, 01:45) Кстати, ... Apr 3 2008, 10:22     ReAl Цитата(singlskv @ Apr 2 2008, 23:55) с ОД... Apr 2 2008, 22:32  sKWO Цитата(zltigo @ Apr 2 2008, 22:30) Компил... Apr 7 2008, 10:40   ReAl Цитата(sKWO @ Apr 7 2008, 13:40) К пример... Apr 7 2008, 19:43    sKWO Цитата(ReAl @ Apr 7 2008, 22:43) Называет... Apr 8 2008, 11:00 SasaVitebsk Хотя я в NASA не работал, но по слухам там не прим... Apr 2 2008, 19:53 AlexKLm На СИ, правильно когда по-больше зелени (#define),... Apr 2 2008, 21:22 SasaVitebsk Вот я и говорю, что результат практически тот же п... Apr 3 2008, 07:23 ReAl Цитата(SasaVitebsk @ Apr 3 2008, 09:23) В... Apr 3 2008, 08:28 _Pasha Кто о чем, а вшивый - о бане...
Пробегала книжка ... Apr 3 2008, 12:57 sensor_ua Цитатасредствами ИАР это дело обстоит намного прощ... Apr 7 2008, 10:58 sKWO Цитата(sensor_ua @ Apr 7 2008, 13:58) А к... Apr 7 2008, 11:07 sensor_ua Не очень понял, что Вы хотите, но на телесистемах ... Apr 7 2008, 12:51 sKWO спасибо за инфу!! Apr 7 2008, 17:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|