|
Стиль программирования на Си, описание функции |
|
|
|
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 7 2008, 10:40
|

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

|
Цитата(zltigo @ Apr 2 2008, 22:30)  Компиляторы умнеют, но тем не менее пока не умнее Вас и на подсказку вполне вероятно, ответят лучшим кодом. К примеру с чем связано столько заморочек в ВИН АВР? Макрос доступа к битам порта средствами ВИН АВР, например sbi(PORTB, 5); Подняв несколька файлов и сделав соответствующие подстановки получаем следующее ( адрес порта Б к примеру 0x08) Код ((*(volatile uint8_t *)(((uint16_t) &((*(volatile uint8_t *)((0x08) + 0x20)))) )) |=(1 << (5))) средствами ИАР это дело обстоит намного проще и находится в одном файле avr_macros.h Код /* Set BIT in ADDRESS */ #define SETBIT(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Apr 7 2008, 19:43
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(sKWO @ Apr 7 2008, 13:40)  К примеру с чем связано столько заморочек в ВИН АВР? Макрос доступа к битам порта средствами ВИН АВР, например sbi(PORTB, 5); Подняв несколька файлов и сделав соответствующие подстановки получаем следующее ( адрес порта Б к примеру 0x08) Код ((*(volatile uint8_t *)(((uint16_t) &((*(volatile uint8_t *)((0x08) + 0x20)))) )) |=(1 << (5))) средствами ИАР это дело обстоит намного проще и находится в одном файле avr_macros.h Код /* Set BIT in ADDRESS */ #define SETBIT(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT))) Средствами WinAVR это "всё" тоже было одной практически такой же строкой Код #define sbi(port, bit) (port) |= (1 << (bit)) Зачем её было раскручивать? Какая разница что там, если оно всё равно компилируется в одну такую же команду ассемблера, что и у IAR ? Ведь для SETBIT(PORTB,5) вы же у IAR не раскручивали, что такое PORTB и не сравнивали с WinAVR? А он выглядит так WinAVR: Код #define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) #define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + 0x20) ... #define PORTB _SFR_IO8(0x18) Кстати, что-то Ваш вариант раскрутки sbi(port,bit) длинноват, выходит короче Код ( *(volatile uint8_t *)((0x08) + 0x20) ) |=(1 << (5)) IAR: Код #define __BYTEBITS(_NAME,_A,_B,_C,_D,_E,_F,_G,_H) \ unsigned char _NAME ## _ ## _A:1, \ _NAME ## _ ## _B:1, \ _NAME ## _ ## _C:1, \ _NAME ## _ ## _D:1, \ _NAME ## _ ## _E:1, \ _NAME ## _ ## _F:1, \ _NAME ## _ ## _G:1, \ _NAME ## _ ## _H:1;
#define SFR_B_BITS(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H) \ __io union { \ unsigned char _NAME; /* The sfrb as 1 byte */ \ struct { /* The sfrb as 8 bits */ \ __BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H) \ }; \ } @ _ADDR;
#define SFR_B(_NAME, _ADDR) SFR_B_BITS(_NAME, _ADDR, \ Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7) ...
SFR_B(PORTB, 0x18) Так что у IAR просто наворочено в другом месте, до которого просто Вы не добрались :-) Как лучше - тяжело сказать. Вариант IAR позволяет написать Код SPMCR.SPMIE = 1; вместо Код SPMCR |= (1 << SPMIE); или SPMCR |= _BV(SPMIE); зато не позволяет сделать то, что позволяет avr-gcc (к чему это приводит - см, например, http://electronix.ru/forum/index.php?s=&am...st&p=377042 ) Код #if defined(SPMCSR) # define SPM_CONTROL_REG SPMCSR #elif defined(SPMCR) # define SPM_CONTROL_REG SPMCR #else # error "SPM control register not defined" #endif
...
SPM_CONTROL_REG |= (1 << SPMIE); Таким образом для всех кристаллов, у которых есть либо SPMCR либо SPMCSR - можно обойтись несколькими строками кода и получить исходник, компилирующийся для всего. У IAR для этого придётся персонально проверять типы процесоров через Код #if defined(__AT90Mega88__) || defined(__AT90Mega168__) || ... А всё потому, что PORTB да SPMCR у avr-gcc это макросы препроцессора, а у IAR - переменные-вложенные агрегаты, прибитые гвозядми к адресам, поэтому их наличие или отсутствие препроцессор не видит и нельзя сделать условную компиляцию просто проверив наличие имени регистра. Цитата(sKWO @ Apr 7 2008, 14:07)  Допустим нужно установить в единицу четвёртый бит порта ну пускай Б Настроим его как выход, назовём его HELS Код #define HELSp B #define HELSb 4 CLRDDR(HELS);// направление SETPORT(HELS);// бит 4 порта Б единичка Это вообще уже лет 10 не так делается. Код #define LED1 B,0,L /* светодиод анодом на питание, зажигаем низким уровнем - L */ #define LED2 D,1,H /* светодиод катодом на землю, зажигаем высоким уровнем */ #define KEY1 C,2,L /* кнопка на землю, при нажатии низкий уровень */ #define KEY2 A,3,H /* кнопка на питание, при нажатии высокий уровень */ ... // теперь не глядя на полярности сигналов пишем ON, чтобы включить, а включается // нулём или единичкой - макрос разбирается DRIVER(LED1,OUT); DRIVER(LED2,OUT); DRIVER(KEY1,IN); DRIVER(KEY1,PULLUP); // к примеру тут обходимся внутренней подтяжкой DRIVER(KEY2,IN); DRIVER(KEY2,HIZ); // а тут внешняя подтяжка на землю ... if( ACTIVE(KEY1) ) { ON(LED1); OFF(LED2); }
if( ACTIVE(KEY2) ) OFF(LED1);
if( flag) ) CPL(LED2); // проинвертировали ногу Называется "макросы Аскольда Волкова", модифицировалось уже под разные процессоры и компиляторы всеми кому не лень. Вот мой вариант:
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 8 2008, 11:00
|

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

|
Цитата(ReAl @ Apr 7 2008, 22:43)  Называется "макросы Аскольда Волкова", модифицировалось уже под разные процессоры и компиляторы всеми кому не лень. C макросами ядерного физика Аскольда Волкова давно знаком, удобная вещь, когда-то на Телесисах он его представлял, собственно как и его модификацию которую выложил Сергей Борщ. Конечно же их использую. Цитата(ReAl @ Apr 7 2008, 22:43)  А всё потому, что PORTB да SPMCR у avr-gcc это макросы препроцессора, а у IAR - переменные-вложенные агрегаты, прибитые гвозядми к адресам, поэтому их наличие или отсутствие препроцессор не видит и нельзя сделать условную компиляцию просто проверив наличие имени регистра. За это большое спасибо! Цитата(ReAl @ Apr 7 2008, 22:43)  длинноват, выходит короче Код ( *(volatile uint8_t *)((0x08) + 0x20) ) |=(1 << (5)) Код в файле sfr_def.h находим #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) дальше #define _SFR_BYTE(sfr) _MMIO_BYTE(_SFR_ADDR(sfr)) дальше #define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) #define _SFR_ADDR(sfr) _SFR_MEM_ADDR(sfr) #define _SFR_MEM_ADDR(sfr) ((uint16_t) &(sfr)) получаем #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) подставляем #define sbi(sfr, bit) ( (*(volatile uint8_t *)( ((uint16_t) &(sfr)) )) |= _BV(bit)) смотрим в pgmspace.h _BV #define _BV(bit) (1 << (bit)) видим #define sbi(sfr, bit) ((*(volatile uint8_ t *)(((uint16_t) &(sfr)) )) |= (1 << (bit))) всё хорошо получается или чёта провтыкал? имеем следующее ((*(volatile uint8_t *)(((uint16_t) &(PORTB )) )) |= (1 << (5))) ну и остаётся за малым подставить знач порта допустим #define PORTB _SFR_IO8(0x08) находим _SFR_IO8 в файле sfrdefs.h #define _SFR_IO8(io_addr) _MMIO_BYTE ((io_addr) + 0x20) соответственно _SFR_IO8(0x08) есть_MMIO_BYTE((0x08) + 0x20) а _MMIO_BYTE((0x08) + 0x20) есть (*(volatile uint8_t *)((0x08) + 0x20)) отсюда и получается ((*(volatile uint8_t *)(((uint16_t) &((*(volatile uint8_t *)((0x08) + 0x20)))) )) |=(1 << (5))) Выходит разные версии компилят , наверное
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
Сообщений в этой теме
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  singlskv Цитата(zltigo @ Apr 2 2008, 23:30) Вы зна... Apr 2 2008, 20:31   zltigo Цитата(singlskv @ Apr 2 2008, 23:31) Да п... Apr 2 2008, 21:51    singlskv Цитата(zltigo @ Apr 3 2008, 01:47) Налицо... Apr 2 2008, 21:55     zltigo Цитата(singlskv @ Apr 3 2008, 00:55) пока... Apr 2 2008, 22:08      singlskv Цитата(zltigo @ Apr 3 2008, 02:08) и убра... Apr 2 2008, 22:37       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       zltigo Цитата(singlskv @ Apr 3 2008, 01:37) это ... Apr 3 2008, 05:53     ReAl Цитата(singlskv @ Apr 2 2008, 23:55) с ОД... Apr 2 2008, 22:32 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|