Перейти к содержанию
    

kbvsoft

Новичок
  • Постов

    1
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Конечно скобочки в конструкции #if (__DATE__[2] == 'b') обязательны, но это не поможет. Похоже на этапе выбора условий компиляций (директивы препроцессора #if, #ifdef) компилятор IAR ещё не сформировал макросы __DATE__ и __TIME__ и при любом обращении к ним в этих директивах пустые значения __DATE__ и __TIME__ никогда не включат нужную ветку условной компиляции. Поэтому условие компиляции типа #if (__DATE__[2] == 'b') //Feb #define MONTH '0','2' ... никогда не выполнится (т.к. на самом деле в директиве #if элемент макроса __DATE__[2] ещё равен 0) Задание же макросов (директивы препроцессора #define) или символических констант (ключевое слово const происходит на следующем этапе компиляции, когда IAR уже сформировал макросы __DATE__ и __TIME__, тогда уже следующие конструкции прекрасно работают: #define HOURS (__TIME__[0]), (__TIME__[1]) #define YEAR __DATE__[7], __DATE__[8], __DATE__[9], __DATE__[10]; __flash char BUILD_TIME[] = {__TIME__}; Исходя их вышесказанного, преобразовать __DATE__ в нужный формат на этапе компиляции никак не получится, по крайней мере, у меня не получилось. :laughing: Зато в runtime всё прекрасно работает. :yeah: Следующий код возвращает дату компиляции в нужном нам формате 'DD.MM.YYYY' в строке TempStr: char TempStr[11]; const char m1 = __DATE__[1]; const char m2 = __DATE__[2]; const char d1 = __DATE__[4]; const char d2 = __DATE__[5]; const char y1 = __DATE__[7]; const char y2 = __DATE__[8]; const char y3 = __DATE__[9]; const char y4 = __DATE__[10]; void BuildDateToTempStr (void ) { /* Формат макроса IAR '__DATE__' на примере '30.01.2000': 'Jan 30 2000' 01234567890 Jan - 01 Feb - 02 Mar - 03 Apr - 04 May - 05 Jun - 06 Jul - 07 Aug - 08 Sep - 09 Oct - 10 Nov - 11 Dec - 12 */ char M1, M2; //•••••••••••••••••••••••• TempStr[0] = d1; TempStr[1] = d2; TempStr[2] = '.'; E1 = '0'; if (m1 == 'a' && m2 == 'n') M2 = '1'; if (m1 == 'e' && m1 == 'b') M2 = '2'; if (m1 == 'a' && m2 == 'r') M2 = '3'; if (m1 == 'p' && m2 == 'r') M2 = '4'; if (m1 == 'a' && m2 == 'y') M2 = '5'; if (m1 == 'u' && m2 == 'n') M2 = '6'; if (m1 == 'u' && m2 == 'l') M2 = '7'; if (m1 == 'u' && m2 == 'g') M2 = '8'; if (m1 == 'e' && m2 == 'p') M2 = '9'; if (m1 == 'c' && m2 == 't') {M1 = '1'; M2 = '0';} if (m1 == 'o' && m2 == 'v') {M1 = '1'; M2 = '1';} if (m1 == 'e' && m2 == 'c') {M1 = '1'; M2 = '2';} TempStr[3] = M1; TempStr[4] = M2; TempStr[5] = '.'; TempStr[6] = y1; TempStr[7] = y2; TempStr[8] = y3; TempStr[9] = y4; //•••••••••••••••••••••••• TempStr[10] = 0; } m1 … y4 – обязательно!!! должны объявляться как константы через const. Тогда условные операторы типа if (m1 == 'a' && m2 == 'n') в скомпилированный код вообще не включаются, т.к. сравнивать константу с константой нет смысла, поэтому в полученном коде элементам строки просто присваиваются реальные значения даты компиляции в нужном формате и всё! Если же m1 … y4 объявить через #define, на этапе компиляции дата размещается в памяти данных и все обращения к ней как к памяти, в итоге скомпилированный код раз в 10 больше!.
×
×
  • Создать...