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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Ассемблер AVR
Сергей Борщ
сообщение Jul 13 2012, 08:24
Сообщение #31


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 13 2012, 08:45
Сообщение #32


Гуру
******

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

Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 13 2012, 10:14
Сообщение #33


Гуру
******

Группа: Модератор 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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 13 2012, 10:16
Сообщение #34


неотягощённый злом
******

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



да именно статк асерт здесь рулит.
Прикрепленный файл  static_assert.rar ( 448 байт ) Кол-во скачиваний: 81


to Xenia: конечно ваш код хуже, 3 строки вместо одной...
to XVR: не вижу смысла во втором аргументе вашего макроса.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 13 2012, 10:56
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 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'а rolleyes.gif

Цитата(demiurg_spb @ Jul 13 2012, 14:16) *
to XVR: не вижу смысла во втором аргументе вашего макроса.
Это для дополнительной диагностики (для пользователя).
Хотя вариант с __LINE__ тоже вполне подойдет

Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 13 2012, 11:07
Сообщение #36


Гуру
******

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



Цитата(demiurg_spb @ Jul 13 2012, 14:16) *
to Xenia: конечно ваш код хуже, 3 строки вместо одной...

Зато ваш хидер static_assert.h таков, что я в нем ничего не понимаю sm.gif. Определяется STATIC_ASSERT_H(expr) с единственным аргументом, а подставляется целых два: STATIC_ASSERT(sizeof(struct A) == 8, StructA);
И вообще непонятно, что сделает STATIC_ASSERT, если размер не сойдется. Компиляцию остановит, ошибку выдаст?

Цитата(demiurg_spb @ Jul 13 2012, 14:16) *
to XVR: не вижу смысла во втором аргументе вашего макроса.

Это чтобы нужное сообщение в мессадже среди варнингов появилось. Но можно было бы вместо него и #error использовать.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 13 2012, 11:45
Сообщение #37


неотягощённый злом
******

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



Цитата(Xenia @ Jul 13 2012, 15:07) *
Зато ваш хидер static_assert.h таков, что я в нем ничего не понимаю sm.gif. Определяется STATIC_ASSERT_H(expr) с единственным аргументом, а подставляется целых два: STATIC_ASSERT(sizeof(struct A) == 8, StructA);
И вообще непонятно, что сделает STATIC_ASSERT, если размер не сойдется. Компиляцию остановит, ошибку выдаст?
Так я и говорю, что достаточно одного аргумента.
И в самом начале файла static_assert.h есть пример использования для совсем уж непонятливыхsm.gif

Цитата
Это чтобы нужное сообщение в мессадже среди варнингов появилось. Но можно было бы вместо него и #error использовать.
Излишне это.
Выскочит ошибка компиляции, вы и так сразу поймёте, что асерт сработал.
В его условии весь смысл обычно и заложен, никаких дополнительных подсказок не требуется, а если не так, то комментарии никто не отменял и ты сам себе Буратино:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
vvvalarm
сообщение Jul 13 2012, 17:02
Сообщение #38





Группа: Новичок
Сообщений: 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"), в котором, как уже писали, этим константам соответствуют некоторые числа. Иначе работать не будет.

Спосибо Ваше объяснение наиболее мне понятно.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 14 2012, 10:31
Сообщение #39


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

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



Цитата(Сергей Борщ @ Jul 13 2012, 09:31) *
Э... нет. Вводная была "отказался компилить", а не "компилил неправильно" laughing.gif
Ну это и имелось ввиду — оператора такого для препроцессора нет и он ругается.

Цитата(Сергей Борщ @ Jul 13 2012, 11:24) *
То, что Borland C/C++ (и его потомки) скомпилили этот код еще не означает, что он работал именно так, как вы ожидали.
В Борланде это работающее расширение.


___________________
Borland Users Group == BUG … Неспроста…


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 14 2012, 22:21
Сообщение #40


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Ну вот, и поговорили за asm lol.gif


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 15 2012, 05:18
Сообщение #41


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

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



— Привет, Пух!
— Привет, Пятачок!
— Хорошая сегодня погода, не правда ли?
… вот так слово за слово, да и получил Пятачок по морде.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
uni
сообщение Jul 26 2012, 00:39
Сообщение #42


Участник
*

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


--------------------
Россия навсегда!
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 6 2012, 17:43
Сообщение #43


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Вернёмся к asm. Тут вот , через эное количество лет дошло, что метки подпрограм да и просто переходов можно спокойненько спратять в SRAM / И в итоге получать практически "чистый" код , в смысл дизasm не даст ниодной метки переходов, как будто программа выполняется подряд , команда за командой. Но вот , что это даёт практически и как это можно использовать не придумаю никак? Т.е. где бы такой выкрутас можно применить?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 6 2012, 18:33
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ILYAUL @ Aug 6 2012, 20:43) *
что метки подпрограм да и просто переходов можно спокойненько спратять в SRAM / И в итоге получать практически "чистый" код , в смысл дизasm не даст ниодной метки переходов, как будто программа выполняется подряд , команда за командой.

Это вы про ассемблер АВР?
Не ясна ваша мысль. Что в SRAM поиещать? Адреса подпрограмм?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 6 2012, 19:30
Сообщение #45


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Про него, родимого. Явных адресов подпрограмм Вы тоже в Sram не увидите . Если Вы ничего в SRAM не писали , то увидите только одни нули .Но переходы будут осуществлятся используя SRAM


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:47
Рейтинг@Mail.ru


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