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

 
 
> Гениальное открытие в синтаксисе языка Си, Не стесняемся в овациях :-)
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
Dima_G
сообщение Sep 28 2009, 09:44
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



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


не ручаюсь за терминологию, но как-то так:
do {...} while (0) - выглядит один оператор
{...} - блок операторов

#define FUN do{...} while(0)
#define FUN2 {...}

Код
корректно:
if (..)
  FUN (x);
else
  FUN (2*x);

ошибка:
if (..)
  FUN2 (x);
else
  FUN2 (2*x);




Цитата(GetSmart @ Sep 28 2009, 08:58) *
Только в моей версии там не совсем параметр. И тем более не типизированный. Там может стоять любая строка сишного кода, в данном случае if (...)


Хоть убейте, не могу придумать задачу, где в параметре данного дефайна необходимо поставить что-то окромя булевского выражения laughing.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 28 2009, 09:51
Сообщение #4


.
******

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



Цитата(Dima_G @ Sep 28 2009, 15:44) *
Хоть убейте, не могу придумать задачу, где в параметре данного дефайна необходимо поставить что-то окромя булевского выражения laughing.gif

Фантазии нету? smile.gif
Например выполнить какие-нить предворительные действия перед зависанием, которые в режиме Release не будут даже компилироваться, а в Debug будут стоять. Как частный случай этого - оператор if


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


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(GetSmart @ Sep 28 2009, 12:51) *
Фантазии нету? smile.gif
Например выполнить какие-нить предворительные действия перед зависанием, которые в режиме Release не будут даже компилироваться, а в Debug будут стоять. Как частный случай этого - оператор if

Мда?
А можно пример? rolleyes.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 28 2009, 10:01
Сообщение #6


.
******

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



Цитата(Dima_G @ Sep 28 2009, 15:54) *
Мда?
А можно пример? rolleyes.gif

Код
    DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS));

cool.gif

Маленький минус - при какой-либо команде (без завершающего оператора if) внутри скобок придётся ставить точку с запятой.

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


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


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Sep 28 2009, 13:01) *
Код
    DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS));
Код
assert(ShowDebugInfo(), I2CMasterState == I2C_SUCCESS);


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 28 2009, 14:01
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Сергей Борщ @ Sep 28 2009, 14:10) *
Код
assert(ShowDebugInfo(), I2CMasterState == I2C_SUCCESS);
Ну, и кому такое надо?
Процедура ShowDebugInfo() будет вызываться вне зависимости от выполнения условия I2CMasterState == I2C_SUCCESS.

Если уж автору исходного топика так хочется что-то (вызов неких действий) добавлять к его исходному действию по условию, то это делается элементарно. Несколько поправил исходный код:
Код
#define DebugLoop(a)    if(a) { DisableIRQ_FIQ(); while (1); }

Если мы желаем при выполнении условия ещё и процедуру ShowDebugInfo() вызвать, то следует записать
Код
DebugLoop(  (I2CMasterState != I2C_SUCCESS) ? (ShowDebugInfo(), TRUE) : FALSE )

где FALSE и TRUE соответственно ноль и не ноль.
Вот Вам и - пожалуйста: перед заходом в бесконечный цикл получите отладочную информацию.
Нечто подобное можно записать и в assert, однако аргумент его используется не только для проверки условия, но и для формирования строки вывода (не смертельно, конечно, но - некрасиво вывод будет смотреться).

P.S. В assert , конечно, вызов дополнительной процедуры нужно перенести к FALSE.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 28 2009, 15:37
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Палыч @ Sep 28 2009, 17:01) *
Ну, и кому такое надо?
Процедура ShowDebugInfo() будет вызываться вне зависимости от выполнения условия I2CMasterState == I2C_SUCCESS.
GetSmartу. Его макрос делал то же самое. А в остальном вы все правильно расписали.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 28 2009, 17:33
Сообщение #10


.
******

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



Цитата(Сергей Борщ @ Sep 28 2009, 21:37) *
GetSmartу. Его макрос делал то же самое. А в остальном вы все правильно расписали.

Ну не знал я про assert. Вот, изобрёл велосипед, а люди вокруг запинали творческую личность biggrin.gif Средневековье какое-то.

Знаю, что есть недостаток моего дефайна в том, что он не "ATOMIC", то есть нельзя перед ним написать if (...), хотя условие должно быть внутри (так и было задумано), но иногда из-за этого можно ненароком встать на грабли, если например мой дефайн с процедурой внутри написать сразу после else. Пришлось бы писать примерно так:
Код
if (...)  ++I2CMasterState;
else { DebugLoop(ShowDebugInfo(); if  (I2CMasterState != I2C_SUCCESS)); }


--------------------
Заблуждаться - Ваше законное право :-)
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, 14:01) Код...   Sep 28 2009, 10:04
||- - Палыч   Цитата(GetSmart @ Sep 28 2009, 13:01) Код...   Sep 28 2009, 10:15
||- - GetSmart   Цитата(Сергей Борщ @ Sep 28 2009, 17:10) ...   Sep 28 2009, 11:29
|||- - Сергей Борщ   Цитата(GetSmart @ Sep 28 2009, 14:29) И т...   Sep 28 2009, 11:53
||- - ReAl   Цитата(Палыч @ Sep 28 2009, 17:01) Ну, и ...   Sep 28 2009, 15:35
|- - _Pasha   Цитата(GetSmart @ Sep 28 2009, 11:58) По ...   Sep 28 2009, 14:29
|- - ReAl   Цитата(_Pasha @ Sep 28 2009, 17:29) Не-не...   Sep 28 2009, 15:55
|- - _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 - 15:09
Рейтинг@Mail.ru


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