Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ассемблер AVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Страницы: 1, 2
vvvalarm
Не взыщите но глупых вопросов не бывает.
Как на ассемблере расшифровать две следующие записи (точне значки << |).
1. 1<<USIOIF
2.( 1<<USIOIF)|( 1<<USICS1)
Заранее спасибо.
ILYAUL
Вот
Xenia
Это не ассемблер, а C. Сдвиг единички влево на указанное число разрядов, где USIOIF, USICS1 и др. - номера битов (начиная с 0), определенные в каком-то из хидеров.
_Артём_
Цитата(vvvalarm @ Jul 11 2012, 22:55) *
Не взыщите но глупых вопросов не бывает.


Понять-то не мудрено:

Цитата(vvvalarm @ Jul 11 2012, 22:55) *
Не взыщите но глупых вопросов не бывает.
Как на ассемблере расшифровать две следующие записи (точне значки << |).
1. 1<<USIOIF


Где-нибудь в inc-файле (или каком-другом) определена константа USIOIF. Допустим так:
Код
.equ USIOIF     = 6

1<<USIOIF=1<<USIOIF=единица сдвинутая влево на позиция=0x40=40H=64(dec)

Цитата(vvvalarm @ Jul 11 2012, 22:55) *
2.( 1<<USIOIF)|( 1<<USICS1)

( 1<<USIOIF)|( 1<<USICS1)=(1 сдвинутая влево на USIOIF позиций) логическое ИЛИ с (1 сдвинутая влево на USICS1 позиций)
ILYAUL
Цитата(Xenia @ Jul 12 2012, 00:22) *
Это не ассемблер, это C.

Не совсем верно , в asm такое на каждом шаге
_Артём_
Цитата(Xenia @ Jul 11 2012, 23:22) *
Это не ассемблер, а C

Нет, вы не правы: это вполне может быть ассембером. IAR AVR ассемблер вполне поймет такое например:
Код
andi R16, (1<<2) | (1<<7)

также как и #if, #define и тд по списку.
Xenia
Цитата(_Артём_ @ Jul 12 2012, 00:33) *
Нет, вы не правы: это вполне может быть ассембером. IAR AVR ассемблер вполне поймет такое например:
andi R16, (1<<2) | (1<<7)
также как и #if, #define и тд по списку.


Ясное дело - из C спёрли. sm.gif
А что это за ассемблер? AVR Studio или какой-еще?
_Артём_
Цитата(Xenia @ Jul 11 2012, 23:42) *
Ясное дело - из C спёрли. sm.gif

Унифицыровали, а не сперли.

Цитата(Xenia @ Jul 11 2012, 23:42) *
А что это за ассемблер?

Вы что-нибудь про IAR слышали?
Они выпускают такой продукт:
IAR Embedded Workbench for Atmel AVR.
Ассемблер бесплатно (может уже и не бесплатно), остальное за деньги.

Цитата(Xenia @ Jul 11 2012, 23:42) *
AVR Studio или какой-еще?

Наверняка также у AVR GCC, AVR assembler v2.
Как там у ImageCraftow, и прочих codevison-ов не скажу - не знаю.
V_G
Цитата(Xenia @ Jul 12 2012, 06:42) *
Ясное дело - из C спёрли. sm.gif
А что это за ассемблер? AVR Studio или какой-еще?

Да, в AVRAssembler 2 уже много Си-подобных директив. В 3 версию, наверно, половина Си перекочует
SmarTrunk
Как раз сейчас осваиваю не спеша ассемблер AVR. Начитавшись умных и глупых книжек, скажу:

Такое широко используется в ассемблере AVR (в частности, в AVR Studio), чтобы установить нужные биты в разных служебных регистрах. А это всегда требуется при инициализации МК или изменении каких-то режимов (включении-выключении прерываний, интерфейсов и пр.) Поскольку точное положение управляющего бита в служебном регистре не запомнить, да еще в разных МК AVR они могут быть в разных местах, то так и делают, например операция (1<<USIOIF)|(1<<USICS1) дает байт с единицами на месте битов USIOF и USICS1, а остальные нули. Осталось записать этот байт в нужный служебный регистр, ну или сделать операцию ИЛИ, если остальные биты трогать не надо.

Теоретически это улучшает читаемость и (что важно) переносимость программы, поэтому активно рекомендуется так делать.

Разумеется, нужно включить командой .INCLUDE файл, соответствующий данному МК (например "M32DEF.INC"), в котором, как уже писали, этим константам соответствуют некоторые числа. Иначе работать не будет.
Сергей Борщ
QUOTE (SmarTrunk @ Jul 12 2012, 03:30) *
Теоретически это улучшает читаемость ... программы, поэтому активно рекомендуется так делать.
А вы попробуйте написать один проект используя только записи вида
CODE
UCSR0B = 0x98
вместо
CODE
UCSR0B = (1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02);
Я даже не говорю о том, чтобы что-то исправить в этом проекте через неделю - просто дописать его до конца и отладить. Думаю, вы очень быстро поймете, что такая запись улучшает читаемость не теоретически, а практически.
ILYAUL
Мне больше "нравится" когда написано так и по всему коду
Код
UCSR0B = 0b10011000
Сергей Борщ
QUOTE (ILYAUL @ Jul 12 2012, 09:44) *
Мне больше "нравится" когда написано так и по всему коду
CODE
UCSR0B = 0b10011000
И даже в этом случае невозможно понять, что тут происходит, не заглядывая в даташит. А значит нужно отвлекаться, что совсем не способствует сосредоточенному написанию/отладке программы, даже теоретически. А в процессе написания не защищает от ошибок/описок.
ILYAUL
Так слово нравится я написал в ковычках - т.е как один из примеров , что хоть и можно так , но лучше не надо
Xenia
Цитата(ILYAUL @ Jul 12 2012, 10:44) *
Мне больше "нравится" когда написано так и по всему коду
UCSR0B = 0b10011000


Э! Мне так тоже нравится. sm.gif Я в свое время голову ломала - зачем так вычурно биты определены, что каждый раз при их использовании приходится единицу влево сдвигать? А потом догадалась - это особенность специфических команд AVR, работающих с отдельными битами, типа:
sbi PORTA, PINA2
cbi PORTA, PINA2
где в качестве аргумента должен быть указан НОМЕР бита, а не маска.
В тех архитектурах, где подобных инструкций нет, битовые константы опредяляют, как маски, а единиц не двигают.
_Артём_
Цитата(Xenia @ Jul 12 2012, 14:16) *
В тех архитектурах, где подобных инструкций нет, битовые константы опредяляют, как маски, а единиц не двигают.

Двигать можно - никто не запрещает. Результат будет такой же как с масками.
kolobok0
Цитата(Xenia @ Jul 12 2012, 15:16) *
...это особенность специфических команд AVR, работающих с отдельными битами, типа:
sbi PORTA, PINA2
cbi PORTA, PINA2
где в качестве аргумента должен быть указан НОМЕР бита, а не маска.В тех архитектурах, где подобных инструкций нет, битовые константы опредяляют, как маски, а единиц не двигают.


долго читал пэйджер, тьху мессагу. что то с точностью да на оборот Вы написали явно.
наоборот, единицы двигаются при создании группы бит = масок. когда у нас один бит - то собственно достаточно явно указать бит. правда не все регистры корректно могут воспринимать это (sbi, cbi).
и вроде как до вашей мессаги sbi & cbi команды вообще не рассматривались. т.е. речь шла конкретно о сдвиге и всё что вокруг него крутиться.

тут наверное ближе слово не архитектура а компилятор. т.к. на выходе (в бинарнике) будет одна сущность = байт, слово, двойное слово и т.д.. а как вы его получили или слепили(можно например умножать в целых числах, или логически объеденять в различных системах счисления) - для железа вовсе фиолетово.
Xenia
Цитата(kolobok0 @ Jul 12 2012, 16:47) *
долго читал пэйджер, тьху мессагу. что то с точностью да на оборот Вы написали явно.
наоборот, единицы двигаются при создании группы бит = масок. когда у нас один бит - то собственно достаточно явно указать бит. правда не все регистры корректно могут воспринимать это (sbi, cbi).
и вроде как до вашей мессаги sbi & cbi команды вообще не рассматривались. т.е. речь шла конкретно о сдвиге и всё что вокруг него крутиться.


В том-то и дело, что из номеров битов можно состряпать маску (сдвигая ту самую едлиницу), тогда как обратное преобразование арифметическими средствами невозможно. Поэтому, если в хидерах/инклюдах имена битов опредены, как маски, то использовать их в качестве аргументов sbi/cbi будет нельзя. А вот определение их, как номер бита, позволяет делать и то и другое, с теми лишь накладными расходами, что приходится двигать единицу, когда нужна маска. И несмотря на то, что двигается эта единица не в процессе исполнения, а в процесе компиляции, битовые маски, образуемые большим набором битов, выглядят в таком исполнении чудовищно. sm.gif А не было бы в инструкциях команд sbi/cbi, но не было бы и проблемы, т.к. ничто не мешало бы перейти на маски.
ae_
Цитата(Xenia @ Jul 12 2012, 23:06) *
...обратное преобразование арифметическими средствами невозможно.

AVRASM & AVRASM2, установить в "1" бит 5 в регистре R16 и в PORTA.
Код
.equ MASK = 0b00100000
ORI R16, MASK
SBI PORTA, LOG2(MASK)
Xenia
Цитата(ae_ @ Jul 12 2012, 19:27) *
.equ MASK = 0b00100000
ORI R16, MASK
SBI PORTA, LOG2(MASK)


Ух ты! Не думала, что ассемблер в времени компиляции способен вычислять логарифы. Отпад!
SSerge
Цитата(Xenia @ Jul 12 2012, 23:00) *
Ух ты! Не думала, что ассемблер в времени компиляции способен вычислять логарифы. Отпад!

Это только называется так круто, а на деле двоичный, де ещё и целочисленный логарифм это и есть номер самого старшего бита в слове.

PS. У кортексов, кстати, есть команда CLZ, вычисляющая количество ведущих нулей в слове.
Xenia
Цитата(SSerge @ Jul 12 2012, 21:18) *
Это только называется так круто, а на деле двоичный, де ещё и целочисленный логарифм это и есть номер самого старшего бита в слове.


Про двоичный логарифм и так ясно, а удивилась тому, что функции во время компиляции способен выполнять. Скажем, MS Visual C/C++ функций выполнять не станет - только арифметико-логические выражения. А когда siziof() в хидере не захотел компилить, то я и вовсе разозлилась. sm.gif
Tiro
Цитата(Сергей Борщ @ Jul 12 2012, 11:17) *
И даже в этом случае невозможно понять, что тут происходит, не заглядывая в даташит. А значит нужно отвлекаться, что совсем не способствует сосредоточенному написанию/отладке программы, даже теоретически. А в процессе написания не защищает от ошибок/описок.

А почему Вы не напомнили, что макрос (1<<(x)) давно обозвали BIT(x). Читать совсем удобно.
Сергей Борщ
QUOTE (Tiro @ Jul 12 2012, 23:41) *
А почему Вы не напомнили, что макрос (1<<(x)) давно обозвали BIT(x). Читать совсем удобно.
Возможно потому, что я понятия не имею, кто и где его так обозвал. Создатели avr-libc с вами не согласны - они обозвали такой макрос _BV(x). В то время как конструкция (1 <<(x)) совершенно однозначно понимается любым компилятором C, C++, "языков, похожих на C", многими ассемблерами и любым программистом, знающим любой из этих языков. wink.gif

А еще обратите внимание на приведенную мной запись
CODE
UCSR0B = (1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02);
Здесь совершенно четко видно - какой бит в нуле, а какой - в единице. И чтобы изменить значение бита, достаточно заменить ноль на единицу или наоборот. В случае же BIT(x) или битовых масок придется делать либо (1*BIT(x))|(0*BIT(y)), либо комментировать части выражения. Оба варианта совсем не добавляют читабельности. Еще для сброса бита можно удалять части выражения, но это тоже неудобно, ибо когда понадобится эту часть выражения снова вернуть - в большинстве случаев придется лезть в даташит/заголовочный файл, чтобы уточнить название добавляемого бита.

QUOTE (Xenia @ Jul 12 2012, 20:26) *
А когда siziof() в хидере не захотел компилить, то я и вовсе разозлилась. sm.gif
Может быть отказался компилить, потому что на момент обработки этого sizeof размер был неизвестен (incomplete type)? Зачем расходовать нервные клетки? Просто поставьте себя на место компилятора. И на его месте, вероятно, вы бы сказали "Не виноватая я!!!..." biggrin.gif
Tiro
Цитата(Сергей Борщ @ Jul 13 2012, 00:56) *
Создатели avr-libc с вами не согласны - они обозвали такой макрос _BV(x).

Да, сорри, запамятовал, _BV

Цитата(Сергей Борщ @ Jul 13 2012, 00:56) *
Код
UCSR0B = (1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02);

Здесь совершенно четко видно - какой бит в нуле, а какой - в единице. И чтобы изменить значение бита, достаточно заменить ноль на единицу или наоборот. В случае же BIT(x) или битовых масок придется делать либо (1*BIT(x))|(0*BIT(y)), либо комментировать части выражения.

Для неустановки в 1 достаточно не писать _BV(BIT). Это будет даже нагляднее.
_Pasha
Цитата(Xenia @ Jul 12 2012, 14:16) *
В тех архитектурах, где подобных инструкций нет, битовые константы опредяляют, как маски, а единиц не двигают.

Танунет. Это плохая практика, совсем. В смысле портабельности, а чего мы здесь сеголня собрались? sm.gif Ассемблер только повод...

Цитата(Tiro @ Jul 13 2012, 01:03) *
Для неустановки в 1

Всегда говорил, что это идеологиццкая полумера:
Раз есть _BV, должен быть и _nBV
Код
#define _nBV(bit) (~(1<<bit))
//but better
#define _nBV(bit) (~_BV(bit))
ae_
Цитата(_Pasha @ Jul 13 2012, 09:26) *
#define _nBV(bit) (~(1<<bit))
#define _nBV(bit) (~_BV(bit))

_BV(3) | _BV(5) = 0x28
_BV(3) | _nBV(5) = 0xFF

вместо ожидаемых:
1<<3 | 1<<5 = 0x28
1<<3 | 0<<5 = 0x08
ReAl
Цитата(Сергей Борщ @ Jul 13 2012, 00:56) *
Может быть отказался компилить, потому что на момент обработки этого sizeof размер был неизвестен (incomplete type)?
Скорее, было
Код
#if sizeof(foo) == moo
Поскольку sizeof — оператор языка, в препроцессоре он не должен работать.
Сергей Борщ
QUOTE (ReAl @ Jul 13 2012, 07:02) *
оператор языка, в препроцессоре он не должен работать.
Э... нет. Вводная была "отказался компилить", а не "компилил неправильно" laughing.gif
Xenia
Цитата(ReAl @ Jul 13 2012, 08:02) *
Скорее, было
#if sizeof(foo) == moo
Поскольку sizeof — оператор языка, в препроцессоре он не должен работать.


Ага! Именно так и было. Задумка была такая, чтобы после определения структуры проверить во сколько байт она компилится, чтобы вовремя забить тревогу, если был установлен неправильный align с выравниванием размера полей. Borland C/C++ (и его потомки) нормально это компилируют, а MS Visual C/C++ уперся рогом.
Сергей Борщ
QUOTE (Xenia @ Jul 13 2012, 10:57) *
уперся рогом.
Ксения, вы специально заставляете нас разгадывать, что означает применительно к компилятору "отказался компилировать" и "уперся рогом"? Как объяснил ReAl - MS Visual C/C++ как раз поступил строго по стандарту. То, что Borland C/C++ (и его потомки) скомпилили этот код еще не означает, что он работал именно так, как вы ожидали. Вы проверяли их на "тревожных" входных данных? Тревогу бьют?
XVR
Цитата(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);

Xenia
Цитата(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
demiurg_spb
да именно статк асерт здесь рулит.
Нажмите для просмотра прикрепленного файла

to Xenia: конечно ваш код хуже, 3 строки вместо одной...
to XVR: не вижу смысла во втором аргументе вашего макроса.
XVR
Цитата(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__ тоже вполне подойдет

Xenia
Цитата(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 использовать.
demiurg_spb
Цитата(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 использовать.
Излишне это.
Выскочит ошибка компиляции, вы и так сразу поймёте, что асерт сработал.
В его условии весь смысл обычно и заложен, никаких дополнительных подсказок не требуется, а если не так, то комментарии никто не отменял и ты сам себе Буратино:-)
vvvalarm
Цитата(SmarTrunk @ Jul 12 2012, 03:30) *
Как раз сейчас осваиваю не спеша ассемблер AVR. Начитавшись умных и глупых книжек, скажу:

Такое широко используется в ассемблере AVR (в частности, в AVR Studio), чтобы установить нужные биты в разных служебных регистрах. А это всегда требуется при инициализации МК или изменении каких-то режимов (включении-выключении прерываний, интерфейсов и пр.) Поскольку точное положение управляющего бита в служебном регистре не запомнить, да еще в разных МК AVR они могут быть в разных местах, то так и делают, например операция (1<<USIOIF)|(1<<USICS1) дает байт с единицами на месте битов USIOF и USICS1, а остальные нули. Осталось записать этот байт в нужный служебный регистр, ну или сделать операцию ИЛИ, если остальные биты трогать не надо.

Теоретически это улучшает читаемость и (что важно) переносимость программы, поэтому активно рекомендуется так делать.

Разумеется, нужно включить командой .INCLUDE файл, соответствующий данному МК (например "M32DEF.INC"), в котором, как уже писали, этим константам соответствуют некоторые числа. Иначе работать не будет.

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

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


___________________
Borland Users Group == BUG … Неспроста…
ILYAUL
Ну вот, и поговорили за asm lol.gif
ReAl
— Привет, Пух!
— Привет, Пятачок!
— Хорошая сегодня погода, не правда ли?
… вот так слово за слово, да и получил Пятачок по морде.
uni
Как я улучшаю читаемость при установке битов в конфигурационные регистры: 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: - Управление схемой подавления помех блока захвата
// Примечание: Коэффициент деления тактовой частоты установлен равным ...
// Режим работы: ...

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

Это вы про ассемблер АВР?
Не ясна ваша мысль. Что в SRAM поиещать? Адреса подпрограмм?
ILYAUL
Про него, родимого. Явных адресов подпрограмм Вы тоже в Sram не увидите . Если Вы ничего в SRAM не писали , то увидите только одни нули .Но переходы будут осуществлятся используя SRAM
_Артём_
Цитата(ILYAUL @ Aug 6 2012, 22:30) *
Но переходы будут осуществлятся используя SRAM

Через ICALL или IJMP?
ILYAUL
Нет . Артём , я Вам в личку отвечу подробно. Я пока не хочу раскрывать подход вот к такой возможности asm , что бы по возможности отсечь болтовню ни о чём .Просто хочу услышать тех , кто такой путь нашёл и может уже как-то использовал.
kolobok0
Цитата(ILYAUL @ Aug 7 2012, 00:32) *
...может уже как-то использовал.


для подгрузки "оверлейников". правда я юзаю нижнии адреса флэша а не озу. Но через озу так же возможно.
так же можно заюзать при организации быстрых переходов по таблице - свитч и иже...
demiurg_spb
Цитата(kolobok0 @ Aug 7 2012, 10:22) *
для подгрузки "оверлейников". правда я юзаю нижнии адреса флэша а не озу.
Конечно, код ведь из ОЗУ не может исполняться у АВР.
kolobok0
Цитата(demiurg_spb @ Aug 7 2012, 10:25) *
...не может исполняться у АВР.


ля тех кто читает между строк - краткое содержание преддущих топиков:

идёт речь об адресах, которые могут храниться как во флэше так и в озу... адреса переходов, а не код. повнимательней что ли бы...


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


кстати по поводу данной мысли. _любой_ бинарный код - команда за командой. в данный момент времени мощные дизасэмблеры отлично орентируются в командах проца, команды которого дезасмблируют. и деление на подпрограммы - есть условности именно дизасэмблера, а не бинарного модуля как такогого. т.е. я о чём - после отработки современного дизасэмблера подпрограммы будут(чисто отмеченные дизасэмблером). а вот очерёдность и порядок вызова данных подпрограмм - вот это уже не будет следовать из кода.

и где применимо...наверное там, где прошивка передаётся в открытом виде. но в серъёзных проектах - это не серьёзно(открытая прошивка) sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.