|
|
  |
Ассемблер AVR |
|
|
|
Jul 13 2012, 08:24
|

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

|
QUOTE (Xenia @ Jul 13 2012, 10:57)  уперся рогом. Ксения, вы специально заставляете нас разгадывать, что означает применительно к компилятору "отказался компилировать" и "уперся рогом"? Как объяснил ReAl - MS Visual C/C++ как раз поступил строго по стандарту. То, что Borland C/C++ (и его потомки) скомпилили этот код еще не означает, что он работал именно так, как вы ожидали. Вы проверяли их на "тревожных" входных данных? Тревогу бьют?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 13 2012, 08:45
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Xenia @ Jul 13 2012, 11:57)  а MS Visual C/C++ уперся рогом. Правильно уперся. Препроцессор не должен знать ничего из языка - он запускается до компилятора, да и ему вообще имеют право подсунуть не С/С++ текст. А для проверки 'во сколько байт компилится' есть другие возможности, чисто компиляторные Код #define STATIC_ASSERT(cond,msg) typedef char _Static_Assert_Typedef_##msg [ (cond)?1:-1];
struct A { int a; int b; };
STATIC_ASSERT(sizeof(struct A) == 8, StructA);
|
|
|
|
|
Jul 13 2012, 10:14
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(XVR @ Jul 13 2012, 12:45)  А для проверки 'во сколько байт компилится' есть другие возможности, чисто компиляторные Код #define STATIC_ASSERT(cond,msg) typedef char _Static_Assert_Typedef_##msg [ (cond)?1:-1];
struct A { int a; int b; };
STATIC_ASSERT(sizeof(struct A) == 8, StructA); Не вижу, чтобы мой метод был сильно хуже: Код #if sizeof(Interface) != 136 #pragma message Bad size of struct Interface #endif
|
|
|
|
|
Jul 13 2012, 10:16
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
да именно статк асерт здесь рулит.
static_assert.rar ( 448 байт )
Кол-во скачиваний: 81to Xenia: конечно ваш код хуже, 3 строки вместо одной... to XVR: не вижу смысла во втором аргументе вашего макроса.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 13 2012, 10:56
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Xenia @ Jul 13 2012, 14:14)  Не вижу, чтобы мой метод был сильно хуже: Код #if sizeof(Interface) != 136 #pragma message Bad size of struct Interface #endif Он не хуже, он просто не работает нигде, кроме Borland'а  Цитата(demiurg_spb @ Jul 13 2012, 14:16)  to XVR: не вижу смысла во втором аргументе вашего макроса. Это для дополнительной диагностики (для пользователя). Хотя вариант с __LINE__ тоже вполне подойдет
|
|
|
|
|
Jul 13 2012, 11:07
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(demiurg_spb @ Jul 13 2012, 14:16)  to Xenia: конечно ваш код хуже, 3 строки вместо одной... Зато ваш хидер static_assert.h таков, что я в нем ничего не понимаю  . Определяется STATIC_ASSERT_H(expr) с единственным аргументом, а подставляется целых два: STATIC_ASSERT(sizeof(struct A) == 8, StructA); И вообще непонятно, что сделает STATIC_ASSERT, если размер не сойдется. Компиляцию остановит, ошибку выдаст? Цитата(demiurg_spb @ Jul 13 2012, 14:16)  to XVR: не вижу смысла во втором аргументе вашего макроса. Это чтобы нужное сообщение в мессадже среди варнингов появилось. Но можно было бы вместо него и #error использовать.
|
|
|
|
|
Jul 13 2012, 11:45
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Xenia @ Jul 13 2012, 15:07)  Зато ваш хидер static_assert.h таков, что я в нем ничего не понимаю  . Определяется STATIC_ASSERT_H(expr) с единственным аргументом, а подставляется целых два: STATIC_ASSERT(sizeof(struct A) == 8, StructA); И вообще непонятно, что сделает STATIC_ASSERT, если размер не сойдется. Компиляцию остановит, ошибку выдаст? Так я и говорю, что достаточно одного аргумента. И в самом начале файла static_assert.h есть пример использования для совсем уж непонятливых  Цитата Это чтобы нужное сообщение в мессадже среди варнингов появилось. Но можно было бы вместо него и #error использовать. Излишне это. Выскочит ошибка компиляции, вы и так сразу поймёте, что асерт сработал. В его условии весь смысл обычно и заложен, никаких дополнительных подсказок не требуется, а если не так, то комментарии никто не отменял и ты сам себе Буратино:-)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 13 2012, 17:02
|
Группа: Новичок
Сообщений: 2
Регистрация: 11-07-12
Пользователь №: 72 725

|
Цитата(SmarTrunk @ Jul 12 2012, 03:30)  Как раз сейчас осваиваю не спеша ассемблер AVR. Начитавшись умных и глупых книжек, скажу:
Такое широко используется в ассемблере AVR (в частности, в AVR Studio), чтобы установить нужные биты в разных служебных регистрах. А это всегда требуется при инициализации МК или изменении каких-то режимов (включении-выключении прерываний, интерфейсов и пр.) Поскольку точное положение управляющего бита в служебном регистре не запомнить, да еще в разных МК AVR они могут быть в разных местах, то так и делают, например операция (1<<USIOIF)|(1<<USICS1) дает байт с единицами на месте битов USIOF и USICS1, а остальные нули. Осталось записать этот байт в нужный служебный регистр, ну или сделать операцию ИЛИ, если остальные биты трогать не надо.
Теоретически это улучшает читаемость и (что важно) переносимость программы, поэтому активно рекомендуется так делать.
Разумеется, нужно включить командой .INCLUDE файл, соответствующий данному МК (например "M32DEF.INC"), в котором, как уже писали, этим константам соответствуют некоторые числа. Иначе работать не будет. Спосибо Ваше объяснение наиболее мне понятно.
|
|
|
|
|
Jul 14 2012, 10:31
|

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

|
Цитата(Сергей Борщ @ Jul 13 2012, 09:31)  Э... нет. Вводная была "отказался компилить", а не "компилил неправильно"  Ну это и имелось ввиду — оператора такого для препроцессора нет и он ругается. Цитата(Сергей Борщ @ Jul 13 2012, 11:24)  То, что Borland C/C++ (и его потомки) скомпилили этот код еще не означает, что он работал именно так, как вы ожидали. В Борланде это работающее расширение. ___________________ Borland Users Group == BUG … Неспроста…
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 26 2012, 00:39
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Как я улучшаю читаемость при установке битов в конфигурационные регистры: MCU.cppПосмотрите в листинге инициализацию всей периферии микроконтроллера. Вот пример: CODE /** * Настройка таймера/счётчика 1 */ void CMCU::Timer1Init(){
// [ATmega16] Table 62. Clock Select Bit Description // +----+----+----+-----------------------------------------------------------------+ // |CSn2|CSn1|CSn0| Description ¦ // +----+----+----+-----------------------------------------------------------------+ // | 0 | 0 | 0 | No clock source. (Таймер/счетчик остановлен) | // | 0 | 0 | 1 | clkI/O/1 (No prescaling) | // | 0 | 1 | 0 | clkI/O/8 (From prescaler) | // | 0 | 1 | 1 | clkI/O/64 (From prescaler) | // | 1 | 0 | 0 | clkI/O/256 (From prescaler) | // | 1 | 0 | 1 | clkI/O/1024 (From prescaler) | // | 1 | 1 | 0 | Вывод Тn, счет осуществляется по спадающему фронту импульсов | // | 1 | 1 | 1 | Вывод Тn, счет осуществляется по нарастающему фронту импульсов | // +----+----+----+-----------------------------------------------------------------+
// Timer/Counter1 Control Register B // [ Регистр управления B Таймером/Счётчиком 1 ][ATmega16] // 00000000 - Initial Value TCCR1B = BIN8(00000000); // BIN8() не зависит от уровня оптимизации // |||||||| // |||||||+- 0, rw, CS10: -+ // ||||||+-- 1, rw, CS11: | - Управление тактовым сигналом // |||||+--- 2, rw, CS12: _| // ||||+---- 3, rw, WGM12: -+ - Режим работы таймера/счетчика // |||+----- 4, rw, WGM13: _| // ||+------ 5, r: 0 - зарезервирован, должен быть установлен в 0 при записи // |+------- 6, rw, ICES1: - Выбор активного фронта сигнала захвата // +-------- 7, rw, ICNC1: - Управление схемой подавления помех блока захвата // Примечание:
// Устанавливаем значения для счётных регистров TCNT1H = 0x00; // ( 0xFFFF - Delay * F_CPU / PrescaleValue ) >> 8 TCNT1L = 0x00; // ( 0xFFFF - Delay * F_CPU / PrescaleValue ) /* OCR1AH = 0x00; OCR1AL = 0x39;
OCR1BH = 0x00; OCR1BL = 0x39;
OCR1CH = 0x00; OCR1CL = 0x39;
ICR1H = 0x00; ICR1L = 0x39; */ // Timer/Counter1 Control Register A // [ Регистр управления A Таймером/Счётчиком 1 ][ATmega16] // 00000000 - Initial Value TCCR1A = BIN8(00000000); // BIN8() не зависит от уровня оптимизации // |||||||| // |||||||+- 0, rw, WGM10: -+ - Режим работы таймера/счетчика // ||||||+-- 1, rw, WGM11: _| // |||||+--- 2, rw, COM1C0: -+ - Режим работы канала сравнения C // ||||+---- 3, rw, COM1C1: _| // |||+----- 4, rw, COM1B0: -+ - Режим работы канала сравнения B // ||+------ 5, rw, COM1B1: _| // |+------- 6, rw, COM1A0: -+ - Режим работы канала сравнения A // +-------- 7, rw, COM1A1: _| // Примечание: Установлен режим работы ...
TCCR1B = BIN8(00000000); // BIN8() не зависит от уровня оптимизации // |||||||| // |||||||+- 0, rw, CS10: -+ // ||||||+-- 1, rw, CS11: | - Управление тактовым сигналом // |||||+--- 2, rw, CS12: _| // ||||+---- 3, rw, WGM12: -+ - Режим работы таймера/счетчика // |||+----- 4, rw, WGM13: _| // ||+------ 5, r: 0 - зарезервирован, должен быть установлен в 0 при записи // |+------- 6, rw, ICES1: - Выбор активного фронта сигнала захвата // +-------- 7, rw, ICNC1: - Управление схемой подавления помех блока захвата // Примечание: Коэффициент деления тактовой частоты установлен равным ... // Режим работы: ...
}
Сообщение отредактировал uni - Jul 26 2012, 03:43
--------------------
Россия навсегда!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|