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

 
 
> Гениальное открытие в синтаксисе языка Си, Не стесняемся в овациях :-)
GetSmart
сообщение Sep 28 2009, 04:26
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Только что изобрёл, пытаясь сэкономить код smile.gif
Проверил - работает в CW и в IAR.


Код
//#define _DEBUG_LOOP_
#ifdef _DEBUG_LOOP_            /* для установки отладочных ловушек объявить этот символ */
#define DebugLoop(a)    a { DisableIRQ_FIQ(); while (1); }
#else
#define DebugLoop(a)    {}
#endif


int I2CEngine(uInt wrCnt, uInt rdCnt)
{
    long time_out = 100000;        // можно сделать зависимость от wrCnt и rdCnt

    I2CWrLength = wrCnt;
    I2CRdLength = rdCnt;
    I2CRdIndex = 0;
    I2CWrIndex = 0;
    if (I2CStart() == 0)    return I2C_ERROR;

    while (--time_out >= 0)
    {
        if (I2CMasterState >= I2C_SUCCESS)    // дальше I2C_SUCCESS все ошибки
        {
            DebugLoop(if (I2CMasterState != I2C_SUCCESS));            // <<<------------------------- обратите внимание на это
            return I2CMasterState;
        }
    }
    DebugLoop();
    return I2C_TIMEOUT;
}


Если это кто-то уже изобрёл до меня - дайте плиз ссылку. Хотелось бы убедиться smile.gif

Сообщение отредактировал GetSmart - Sep 28 2009, 04:27


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Sep 28 2009, 08:58
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



По поводу do {} while(0) в дефайнах. Кто-нить может объяснить чем это лучше простого {} ???


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 28 2009, 14:29
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(GetSmart @ Sep 28 2009, 11:58) *
По поводу do {} while(0) в дефайнах. Кто-нить может объяснить чем это лучше простого {} ???

Не-не. Лучше for(){} навернуть функционалом. Чтоб можно было не бояться встретить побочные эффекты от break или return при вызове какого-либо хитрого макроса.
Кстати, проблему с обертками для обработчиков (sub lr,lr,#4 ) тоже можно решать с помощью for()
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 28 2009, 15:55
Сообщение #4


Нечётный пользователь.
******

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



Цитата(_Pasha @ Sep 28 2009, 17:29) *
Не-не. Лучше for(){} навернуть функционалом. Чтоб можно было не бояться встретить побочные эффекты от break или return при вызове какого-либо хитрого макроса.
Дык вроде break одинаково отрабатывает что из того цикла, что из другого. Это по continue в for хвостовой оператор выполнится.

do { } while(0) для другого сделан, чтобы макрос можно было ставить в любое место и привычно писать после него ';', тут уже писали
Код
// примитив, но для общности изложения
#define foo()  op1; op2;

if(a)
    foo(); // в тихую op2 выполняется всегда

if(a)
   foo();
else        // syntax error
   op3;


Код
#define foo()  { op1; op2; }

if(a)
    foo(); // "висящий" ';' , но это не страшно

if(a)
   foo();
else       // syntax error
   op3;

Код
#define foo()  for(int i = 0; i < 1; ++i) { op1; op2; }

if(a)
    foo(); // "висящий" ';' , но это не страшно

if(a)
   foo();
else       // syntax error
   op3;


Код
#define foo()  do { op1; op2; } while(0)

if(a)
    foo(); // OK

if(a)
   foo();
else       // OK
   op3;


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- GetSmart   Гениальное открытие в синтаксисе языка Си   Sep 28 2009, 04:26
- - Dima_G   #include <assert.h> assert(...)   Sep 28 2009, 04:42
- - GetSmart   Называется открыл Америку Ей богу не знал про as...   Sep 28 2009, 04:58
- - MALLOY2   посмотрите стек LWIP там такое тоже применяется, т...   Sep 28 2009, 07:46
|- - _Pasha   Цитата(MALLOY2 @ Sep 28 2009, 10:46) токо...   Sep 28 2009, 08:22
|- - ReAl   Цитата(MALLOY2 @ Sep 28 2009, 10:46) токо...   Sep 28 2009, 08:23
|- - zltigo   Цитата(GetSmart @ Sep 28 2009, 11:58) По ...   Sep 28 2009, 09:03
|- - Палыч   Цитата(GetSmart @ Sep 28 2009, 11:58) По ...   Sep 28 2009, 09:11
|- - Dima_G   Цитата(GetSmart @ Sep 28 2009, 11:58) По ...   Sep 28 2009, 09:44
||- - GetSmart   Цитата(Dima_G @ Sep 28 2009, 15:44) Хоть ...   Sep 28 2009, 09:51
||- - Dima_G   Цитата(GetSmart @ Sep 28 2009, 12:51) Фан...   Sep 28 2009, 09:54
||- - GetSmart   Цитата(Dima_G @ Sep 28 2009, 15:54) Мда? ...   Sep 28 2009, 10:01
||- - Dima_G   Цитата(GetSmart @ Sep 28 2009, 14:01) Код...   Sep 28 2009, 10:04
||- - Палыч   Цитата(GetSmart @ Sep 28 2009, 13:01) Код...   Sep 28 2009, 10:15
||- - Сергей Борщ   Цитата(GetSmart @ Sep 28 2009, 13:01) Код...   Sep 28 2009, 11:10
||- - GetSmart   Цитата(Сергей Борщ @ Sep 28 2009, 17:10) ...   Sep 28 2009, 11:29
|||- - Сергей Борщ   Цитата(GetSmart @ Sep 28 2009, 14:29) И т...   Sep 28 2009, 11:53
||- - Палыч   Цитата(Сергей Борщ @ Sep 28 2009, 14:10) ...   Sep 28 2009, 14:01
||- - ReAl   Цитата(Палыч @ Sep 28 2009, 17:01) Ну, и ...   Sep 28 2009, 15:35
||- - Сергей Борщ   Цитата(Палыч @ Sep 28 2009, 17:01) Ну, и ...   Sep 28 2009, 15:37
||- - GetSmart   Цитата(Сергей Борщ @ Sep 28 2009, 21:37) ...   Sep 28 2009, 17:33
|- - _Pasha   Цитата(ReAl @ Sep 28 2009, 18:55) Дык вро...   Sep 28 2009, 16:55
- - GetSmart   Странно. Я в файле assert.h нашёл слишком примитив...   Sep 28 2009, 11:56
|- - Сергей Борщ   Цитата(GetSmart @ Sep 28 2009, 14:56) Не ...   Sep 28 2009, 12:01
- - sysel   Ерундой маетесь, товарищи. Подобные навороты резко...   Sep 29 2009, 04:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 05:22
Рейтинг@Mail.ru


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