Serg79
|
|
« : 22-09-2006 11:59 » |
|
Требуется написать макрос для загрузки 16-битного значения в регистры r26:r27. Для 8-битного, проблем нет. Делаю так: #define load_val(val) \ { \ __asm__ __volatile__ \ ( \ "ldi r26,%0 \n\t" \ : "M" (val) \ ); \ } Думал, что для 16 такое прокатит: #define load_val(val) \ { \ __asm__ __volatile__ \ ( \ "ldi r26,%A0 \n\t" \ "ldi r27,%B0 \n\t" \ : "M" (val) \ ); \ } оказалось ошибаюсь. Кто знает, подскажите как быть, а то уже крыша начинает съезжать.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #1 : 25-09-2006 05:15 » |
|
Проблему решил следующим способом: #define load_val(val) \ { \ __asm__ __volatile__ \ ( \ "ldi r26,%0 \n\t" \ "ldi r27,%1 \n\t" \ :: "M" ((uint8_t)((uint16_t)(val))), \ "M" ((uint8_t)((uint16_t)(val)>>8)) \ ); \ } Теперь такое работает без проблем:
|
|
|
Записан
|
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 28-01-2007 17:31 » |
|
Daniloff, а может ты для AVR использовал GCC?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|
Serg79
|
|
« Ответ #5 : 29-01-2007 04:56 » |
|
Daniloff, Ты прав, это ассемблер именно для AVR.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #6 : 29-01-2007 06:45 » |
|
Daniloff, я торможу
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|
Serg79
|
|
« Ответ #8 : 31-01-2007 04:49 » |
|
Serg79, я под AVR пишу на асме, и подобных заморочек практически не возникает Зачем писать на 'asm'-е когда язык 'C' есть?
|
|
« Последнее редактирование: 15-12-2007 18:44 от Алексей1153++ »
|
Записан
|
|
|
|
McZim
|
|
« Ответ #9 : 31-01-2007 05:15 » |
|
некоторые конструкции именно на астме легче реализовать чем на С
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Serg79
|
|
« Ответ #10 : 31-01-2007 05:24 » |
|
некоторые конструкции именно на астме легче реализовать чем на С
Например?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #11 : 31-01-2007 06:21 » |
|
Serg79, в С нет понятия флага переноса и закольцованного сдвига - при битовых манипуляциях иногда нужено. Ну, и критичные по времени алгоритмы порой можно на асме лучше написать, с учетом архитектурных особенностей процессора.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #12 : 31-01-2007 08:30 » |
|
кусок кода реализации я сейчас не приведу, но вот недавний случай. Есть такая программа CodeVision AVR, так вот в ней пишется код на С а в программе Win AVR эмулируется работа процессора и в ней же можно писать на asm, несколько дней назад у моего коллеги получалось так что CodeVision AVR компилировал исходник на С и в результате функции начинали выполняться не в своей очередности. Помучавшись с тим делом он плюнул и написал на asm в Win AVR.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #13 : 31-01-2007 12:13 » |
|
Я люблю экономить байты. Например, процедуру подсчета CRC16 впихнул в 9 слов. И бит Т на С тяжело использовать, а он дюже экономить помогает!
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #14 : 01-02-2007 06:38 » |
|
Для последнего проекта который мы здали использовался контроллер atMega64. Чтобы было понятно, контроллер используется для связи с устройством по RS-232 и выполняет функции управления модулями устройства а также контролирует электрические параметры в контрольных точках узлов. Контроллер активно использует свои внутренние модули: ADC, USART, SPI, таймера и конечно же порты ввода/вывода. Весь программный код на 'C' составил 3651 строку (где то 1/4 из кода составляют коментарии). Это не счетая еще функций и заголовочных файлов из библиотеки языка 'C'. Я не представляю сколько времени мне потребовалось на все это, если бы надо было писать все на 'asm', а потом бы еще встал вопрос все это тестировать, была бы полная жо... Хочу заметить, что эти 3651 строчки заняли всего 9164 байта (14.0%) flash и 107 байт (2.6%) ОЗУ. Daniloff, а ты говоришь "Я люблю экономить байты", уж кто кто а компилятор умеет экономить байты. Когда меня спрашивают - "Как научиться хорошо писать на ассемблере?", я всегда отвечаю - "Лучший учитель это - компилятор языка 'C'". Хотя от всего кода, где то 0.2% написано на 'asm' (это код тестирования АЛУ и ОЗУ вовремя простоя программы между запросами), я прежде чем что то писать на 'asm' смотрю как это же самое напишет компилятор и уже после него можно чтото подправить или оставить все так как он сделал.
McZim, ты наверно имел ввиду не Win AVR а AVR Studio. К CodeVision AVR я вообще серьезно не отношусь и им у нас не пользуються. Весь код у нас пишется в WinAVR это компилятор GCC для AVR, а погонять некие куски кода можно действительно в эмуляторе AVR Studio. Она также предназначена для написания кода на 'asm'.
RXL, на счет проверки флага ты не прав. Вот код проверяющий флаг переноса " SREG & (1<<SREG_C) " а компилятор сгенерит одно из двух: brcs или brcc взависимости от того что нужно сделать.
Если уж действительно надо какой то кусочек написать на 'asm', то я использую синтаксис предоставляемый GCC.
|
|
« Последнее редактирование: 15-12-2007 18:44 от Алексей1153++ »
|
Записан
|
|
|
|
McZim
|
|
« Ответ #15 : 01-02-2007 07:05 » |
|
Serg79, да AVR Studio.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #16 : 01-02-2007 07:42 » |
|
RXL, на счет проверки флага ты не прав. Вот код проверяющий флаг переноса " SREG & (1<<SREG_C) " а компилятор сгенерит одно из двух: brcs или brcc взависимости от того что нужно сделать.
Согласись, - это извращение. Попробуй нечто вроде написать для x86.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Serg79
|
|
« Ответ #17 : 01-02-2007 08:37 » |
|
Согласись, - это извращение. Попробуй нечто вроде написать для x86.
В современных ОС-ях это актуально когда код крутиться в режиме ядра и используется архитектура именно данного кристала (управление многозадачностью (таблицами STL для x86), виртуальной памятью, портами ввода-вывода и т.п.), а на уровне приложения тебе ОС-ь не позволит выкидывать подобные финты. На мой взгляд отошли те времена когда энтузиасты програмеры сидели по ночам и шлифовали сишный код на ассемблере. Этим можно позаниматься на раннем этапе своего пути познания сути програмирования и понимания тех процессов которые происходят внутри процессора (сам когда то этим баловался ). Но рано или поздно, когда ты начинаешь этим заниматься профессионально, то на первый план становиться переносимость для уровня приложений. А для уровня ядра, сопровождаемость кода. А эти веши ох как не совместимы с ассемблером. Интересные данные по использованию машиннозависимых инструкций (ассемблера) от всего кода ядра в 4.4BSD, приведены в данной статье: http://www.freebsd.org.ua/doc/ru_RU.KOI8-R/books/design-44bsd/book.html#OVERVIEW-KERNEL-ORGANIZATION
|
|
|
Записан
|
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #18 : 03-02-2007 11:09 » |
|
Serg79, вот ты хвалишься, что код занял 9164 байт. А почему бы тогда не поставить мегу-16? Мне дорогие камни не по карману, а потому пишу преимущественно под 1-2К кода. А под такой камень тоже бы Си взял, или бейсик, или АлгоритмБилдер... P.S. А ADC-то каким образом задействован? Просто интересно...
|
|
« Последнее редактирование: 03-02-2007 12:30 от Daniloff »
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #19 : 05-02-2007 10:26 » |
|
Serg79, вот ты хвалишься, что код занял 9164 байт. А почему бы тогда не поставить мегу-16? Какой кристал был в перечне на изделие такой и поставили. Как Ты не поймешь, если ты пишешь для себя, то ты можешь писать на чем угодно и как угодно, нет никакой разницы как и какой код мигает светодиодами на твоем слепыше. А если после Тебя этот код еще через несколько рук должен пройти или в будушем понадобиться его портировать на другой кристал или даже друго тип МК, то о ассемблере не может идти даже речи. Если тебе приходиться все таки использовать в каких то местах ассемблер, то Ты на эти пять строчек ассемблерного кода пол листа инфы (что, как, зачем это нужно...) напишешь.
|
|
|
Записан
|
|
|
|
|
|
|