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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Гениальное открытие в синтаксисе языка Си, Не стесняемся в овациях :-)
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
Dima_G
сообщение Sep 28 2009, 04:42
Сообщение #2


Местный
***

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



#include <assert.h>
assert(...)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 28 2009, 04:58
Сообщение #3


.
******

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



Называется открыл Америку smile.gifsmile.gif

Ей богу не знал про assert

_______

Только в моей версии там не совсем параметр. И тем более не типизированный. Там может стоять любая строка сишного кода, в данном случае if (...)

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


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


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



посмотрите стек LWIP там такое тоже применяется, токо еще и уровни настраиваются в случае отладки, у сибя я тоже такое практикую, токо еще в уарт выбрасываю номер строчки.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 28 2009, 08:22
Сообщение #5


;
******

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



Цитата(MALLOY2 @ Sep 28 2009, 10:46) *
токо еще в уарт выбрасываю номер строчки.

+1
И можно еще навернуть выходом из бесконечного цикла по простому приему одного символа
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 28 2009, 08:23
Сообщение #6


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

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



Цитата(MALLOY2 @ Sep 28 2009, 10:46) *
токо еще в уарт выбрасываю номер строчки.
А ещё во включённом во все файлы проекта h-файле enum
{ MAIN_C=0, UART_C, MDM_C, и так далее}
и не лениться в начале каждого файла писать
#define THIS_FILE MDM_C
так можно и не только номер строки выбрасывать (под строковое имя файла жалко места, у меня обычно много небольших файлов).

А подстановка любого кода - так это же ниагарский водопад хотя бы и один из вариантов макроса ATOMIC_CODE в отсутствие gcc-шных расширений

Код
#define ATOMIC_CODE(_statements_4_atomic_execution_)    \
do {                            \
    uint8_t _atomic_saved_sreg_ = SREG;     \
    cli();                      \
    { _statements_4_atomic_execution_ }     \
    SREG = _atomic_saved_sreg_;             \
} while(0)

Код
    ATOMIC_CODE(
        ETIMSK &= ~(1 << OCIE3C);
        pf.stop_req = 0;
        stb_off();
    );
Есть свои недостатки, но работает.
Или тут http://electronix.ru/forum/index.php?showt...st&p=268643 - всунутая в макрос структура вроде и не "любой код", но тож ведь "не просто условие".


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 28 2009, 08:58
Сообщение #7


.
******

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



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


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


Гуру
******

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



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

тем-же, что и (x) лучше простого x


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 28 2009, 09:11
Сообщение #9


Гуру
******

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



Цитата(GetSmart @ Sep 28 2009, 11:58) *
По поводу do {} while(0) в дефайнах. Кто-нить может объяснить чем это лучше простого {} ???
Имхо, тем, что в первом случае "точка с запятой" будет к месту.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Sep 28 2009, 09:44
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #11


.
******

Группа: Участник
Сообщений: 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
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #13


.
******

Группа: Участник
Сообщений: 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
Dima_G
сообщение Sep 28 2009, 10:04
Сообщение #14


Местный
***

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



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

cool.gif


Код
#define DebugLoop(a)    {}

DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS));
развернется в

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


Хотя мож я ошибаюсь smile.gif

PS

Согласен smile.gif Ошибаюсь

Сообщение отредактировал Dima_G - Sep 28 2009, 10:11
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 28 2009, 10:15
Сообщение #15


Гуру
******

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



Цитата(GetSmart @ Sep 28 2009, 13:01) *
Код
    DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS));
Неудачный пример. Имхо, в Вашем DebugLoop в качестве параметра ничего, кроме if(выражение) и подставить нельзя (разве, что - пусто).
Go to the top of the page
 
+Quote Post

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

 


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


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