|
Гениальное открытие в синтаксисе языка Си, Не стесняемся в овациях :-) |
|
|
|
Sep 28 2009, 04:26
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Только что изобрёл, пытаясь сэкономить код  Проверил - работает в 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; } Если это кто-то уже изобрёл до меня - дайте плиз ссылку. Хотелось бы убедиться
Сообщение отредактировал GetSmart - Sep 28 2009, 04:27
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Sep 28 2009, 08:23
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 - всунутая в макрос структура вроде и не "любой код", но тож ведь "не просто условие".
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 28 2009, 09:44
|
Местный
  
Группа: Свой
Сообщений: 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 (...) Хоть убейте, не могу придумать задачу, где в параметре данного дефайна необходимо поставить что-то окромя булевского выражения
|
|
|
|
|
Sep 28 2009, 09:54
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(GetSmart @ Sep 28 2009, 12:51)  Фантазии нету?  Например выполнить какие-нить предворительные действия перед зависанием, которые в режиме Release не будут даже компилироваться, а в Debug будут стоять. Как частный случай этого - оператор if Мда? А можно пример?
|
|
|
|
|
Sep 28 2009, 10:01
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Dima_G @ Sep 28 2009, 15:54)  Мда? А можно пример?  Код DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS));  Маленький минус - при какой-либо команде (без завершающего оператора if) внутри скобок придётся ставить точку с запятой.
Сообщение отредактировал GetSmart - Sep 28 2009, 10:09
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Sep 28 2009, 10:04
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(GetSmart @ Sep 28 2009, 14:01)  Код DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS));  Код #define DebugLoop(a) {}
DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS)); развернется в Код ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS){}; Хотя мож я ошибаюсь  PS Согласен  Ошибаюсь
Сообщение отредактировал Dima_G - Sep 28 2009, 10:11
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|