Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Ассемблер KEIL

Пт фев 21, 2020 16:15:21

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

Добавлено after 48 seconds:
Cortex M7 - полторы тыщщи инструкций

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


ну да

Re: Ассемблер KEIL

Пт фев 21, 2020 16:17:54

Сколько-сколько насчитали регистров? 8? А давайте вместе еще раз заглянем в мануал и посчитаем. Ну-с, раааааз, двааааа, трии... r0 - r12 - это 13 штук выходит. И три - специализированных - счетчик программ, указатель стека вызовов для Си, регистр возврата для Си. Однако, доступ к тем, что r8 и выше - только через 32-битный вариант инструкции. Помните, что я раньше писал? Забыли? Надобно вернуться и ликвидировать пробел на ранних этапах, чтоб потом не ага.

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

Полторы тыщщи - не так много, но помнить все особенности всех вариантов - это как то чето не то. В то время, как надо задумываться над реализацеий езернета или юсб-отг, или вай-фай-протокола, вы держите в голове набор инструкций. А еще там есть кэш инструкций и данных - это еще одна приколюха.

Выигрыша ассемблер по сравнению с Си не шибко то дает, а иногда и вообще не дает, поскольку у Си есть 7 настраиваемых уровней оптимизации при генерации кода.
Последний раз редактировалось Кислородный Пт фев 21, 2020 16:25:16, всего редактировалось 1 раз.

Re: Ассемблер KEIL

Пт фев 21, 2020 16:22:29

>> Однако, доступ к тем, что r8 и выше - только через 32-битный вариант инструкции.

Так а какие 32-х битные варианты инструкций? Реально на Cortex M0 пользоваться этими регистрами могу команда B, ADD, и ldr r, [pc, #Disp]
Если не ошибаюсь, все. То есть регистры есть, но всерьез их использовать С программе будет точно затруднительно ( программисту, впрочем, тоже не разгуляться...).
Даже банальная mov и то с ними не работает.
Последний раз редактировалось protoder Пт фев 21, 2020 20:17:19, всего редактировалось 1 раз.

Re: Ассемблер KEIL

Пт фев 21, 2020 16:34:51

protoder писал(а):Например, для пользователей бесплатного Keil с его ограничением на 32 кБ. это наверняка может оказаться полезным.
Можно взять бесплатный GCC и бесплатную IDE для него и забыть об ограничениях.
Вот к примеру пошаговое выполнение асма в одной из бесплатных IDE.
СпойлерИзображение

Re: Ассемблер KEIL

Пт фев 21, 2020 16:36:34

когда дойдете до USB

USB даже на Си самому накалякать довольно сложно. А если брать готовый открытый стек, то в качестве занимательного ребуса можно его переписать на АСМе. Чиста по приколу. :)

Re: Ассемблер KEIL

Пт фев 21, 2020 16:38:15

Даже банальная mov и то с ними не работает.

Чой-то не работает? Работает. Помните, я давал документ с описанием побитовой структуры команд? Ну воооот.
К тому же, а знаете ли вы, что есть вариант загрузки полного 32-битного слова через вот такую операцию: ldr r3, [pc, #12] , то есть через счетчик программ (значение, записанное в нем) и смещение от него получается адрес, по которому находится 32-битное значение, которое и будет загружено в указанный регистр целиком как есть за один раз.

Да, в качестве кайфового развлечения предлагаю запилить на правоверном ассемблере USB HID. Если получится, вы наверно будете первым в мире, кто это сделал.

Re: Ассемблер KEIL

Пт фев 21, 2020 19:42:53

>> Чой-то не работает? Работает. Помните, я давал документ с описанием побитовой структуры команд? Ну воооот.

А вот помню. Только я еще и тогда не очень понял, что вы имели ввиду. Вы, помнится, утверждали, что Cortex M0 умеет выполнять, например, условные префиксы. Я ни какого намека на это ни в какой документации не нашел. Так что если вы объясните, что имеете ввиду, будет здорово.
В частности , на счет той же mov по отношению к старшим регистрам в Cortex M0. По моим данным, нет такой команды.

>> К тому же, а знаете ли вы, что есть вариант загрузки полного 32-битного слова через вот такую операцию: ldr r3, [pc, #12]
Есть, но это ни чего не дает. Мы грузим в регистры константы. А как ее использовать-то потом? Только для косвенных переходов, что не так часто применяется. Да еще в операциях сложения. Все. На этом функционал старших регистров исчерпан.

>> Да, в качестве кайфового развлечения предлагаю запилить на правоверном ассемблере USB HID. Если получится, вы наверно будете первым в мире, кто это сделал.

Хотел ответить что-то вроде того, что нет, я все таки сумасшедший не на столько... Но потом вспомнил, что для атмелов была библиотека, позволяющая подключать к USB контроллеры без USB модуля. Так вот, я ее на ассемблер как раз переписал. И это был как раз один из примеров обоснованного применения ассемблера. 3-х кратный выигрыш по объему ( для огромной библиотеки это важно), 2-х кратный рост скорости обмена.

И кстати почему именно HID? Нет, все режимы. У меня в BULK работала ( хотя это и не совсем по стандарту). И нет, я первым не был. Первым была сама атмел. Но мне ее вариант по ряду причин не подошел (они под мелкий 8-милапый камень сделали. А мне нужен был взрослый контроллер. И тут как раз сработал главный минус ассемблера. Переделать на ассемблер С- библиотеку оказалось проще, чем переделать ассемблерный код для одного камня на код для другого). Пришлось лепить самому.
Сейчас эта библиотека уже не актуальна, контроллеры с USB стали широко доступными. а несколько лет назад оно было очень круто.

Re: Ассемблер KEIL

Пт фев 21, 2020 19:55:50

protoder писал(а):И кстати почему именно HID?
Потому что с дровами нет проблем. Используются системные и устройство работает начиная с Win95 (с пакетом обновления) до текущей версии Win10.
В большинстве случаев скорости 64 КБ/с хватает, а если нет но очень нужно, в дескриптор конфигурации добавляем требуемое число интерфейсов, с которыми связываем свою конечную точку и получаем 64 КБ/с на каждый интерфейс.

Re: Ассемблер KEIL

Пт фев 21, 2020 20:13:16

protoder писал(а):И кстати почему именно HID?
Потому что с дровами нет проблем. Используются системные и устройство работает начиная с Win95 (с пакетом обновления) до текущей версии Win10.
В большинстве случаев скорости 64 КБ/с хватает, а если нет но очень нужно, в дескриптор конфигурации добавляем требуемое число интерфейсов, с которыми связываем свою конечную точку и получаем 64 КБ/с на каждый интерфейс.


Ну, в плане драйверов всегда можно организовать COM-порт. Да и lib-usb с пакетом драйвером поставляется. Так что да - если скорости хватает, HID ни вопрос. А если нет - свет клином на ней не сошелся.

Но с... э-э-э... товарищем Кислородным контекст немного иной был. Про то, что не только HID, но и вообще весь обмен по USB, включая аппаратную его часть, писали люди на ассемблере... Правда USB был низкоскоростным...

Справедливости ради, ЛУФУ перепелить на ассемблер я не одолел :) Но там и мотивации меньше было. Все таки LUFA - качественная штука и на С вполне годится, если причесать немного под себя.

Re: Ассемблер KEIL

Ср фев 26, 2020 15:58:17

KEIL таки поддерживает ассемблер GCC формата! Только в 6-м компиляторе. Надо установить галку Assemble by using ARMCLang V6 в Опциях - Асм.
Только это надо не на весь проект вешать, а только на свои файлы. А то не откомпилируется стартап файл.

Re: Ассемблер KEIL

Пт фев 28, 2020 05:44:54

Сегодня не поленился к ассемблерной процедурке накидать сишный аналог. Погонял с разными настройками.
Ну что тут сказать. Компилятор откровенно странный. Он потрясающе хорошо исправляет ошибки программиста в плане оптимизации. ТО есть он очень тщательно анализирует контексты, учитывает константы (так что забывать про const не стоит!). Например, при оптимизации О3 единожды вызываемая ассемблерная функция, получающая параметром массив констант, оказалась даже больше, чем сгенерированная компилятором. При этом половину вычислений компилятор произвел во время компиляции, анализируя значения параметров. Функция, понятно, была развернута inline.
Увы, такое возможно лишь при однократном вызове функции. При вызове ее несколько раз с разными параметрами результат, понятно, оказался иным. Как и при использовании не константного, а обычного массива.
Вобщем, местами компилятор просто великолепен... Что только увеличивает досаду из-за совершенно не понятных допускаемых им ляпов. Так, он крайне плохо работает с адресной арифметикой. Иногда в пустую гоняет данные между регистрами или выполняет иные, ни чем не объяснимые действия. В итоге - откомпилированный код в полтора - три раза больше, чем ассемблерный аналог. Если не поленюсь, я завтра скину результаты и листинги.
Да, еще одно сильное свойство этого компилятора - при объявлении классов без данных и без виртуальных методов, компилятор не создает переменных для их экземпляров. Что при написании библиотек для работы с железом может быть очень ценно.

Re: Ассемблер KEIL

Пт мар 13, 2020 01:26:54

protoder

Мур, если что! Возможно я не знаю всей истории. Но понял так, что вы пытаетесь писать на чистом ассемблере для ARM? Но тогда зачем вам Кейл? Переходите на binutils.

Заодно, получите скорость компиляции, предельную компактность среды разработки и полную русификацию - переменные и имена меток можно объявлять на русском языке!

Понадобится только блокнот с раскраской :beer:

Re: Ассемблер KEIL

Пт мар 13, 2020 14:50:41

protoder

Но тогда зачем вам Кейл? Переходите на [url=http://stm32asm.ru/407/new_clear_gcc.htm]binutils


Ну, как минимум, в Кейле (и в IARе) есть достаточно удобная отладка и т.д. и т.п., причём доступная "из коробки" -- а чтобы победить GDB, нужно приложить довольно большие усилия, если раньше с ним дел не имел.

Re: Ассемблер KEIL

Сб мар 14, 2020 20:02:28

Все таки LUFA - качественная штука и на С вполне годится, если причесать немного под себя.
Что там качественного? Вещь кривая, со многими багами. На днях запускал USB-device на XMC4500. За основу взял LUFA и перепиливал её под себя. В процессе этого наткнулся на несколько багов. И это при том, что я не так уж и много чего использовал из функционала USB (никаких профилей, только базовый обмен через эндпоинты; и только FS USB-device).

Re: Ассемблер KEIL

Пт май 22, 2020 13:53:08

Здравствуйте товарищи!
Помогите завести SPI2 на STM32F100RBT
В общем то суть проблемы в том, что данные в регистр SPI2_DR не записываются в режиме отладки (да даже и не в режиме отладки), хотя при работе в симуляторе регистр обновляется! Не могу понять в чем проблема. Пробовал зацикливать передачу данных, но на осциллографе не вижу ничего на ножках SCK и MOSI...
Мой код

Спойлер
Код:
            
            
            
            GET_BBand_Addr_To TMP2, RCC_APB1ENR, SPI2_EN
            STR _1, [TMP2]

            GET_Addr_To TMP1, SPI2_CR1
            MOV TMP2, #(0<<BR_0 | 0<<BR_1 | 1<<BR_2 | 1<<CPOL | 1<<CPHA | 1<<DFF | 0<<LSBFIRST | 1<<SSM | 1<<SSI | 1<<MSTR)
            STR TMP2, [TMP1]

            GET_BBand_Addr_To TMP2, SPI2_CR1, SPE
            STR _1, [TMP2]
            
            
            GET_Addr_To TMP1, SPI2_DR
            
            GET_BBand_Addr_To TMP2, SPI2_SR, BSY
            
            MOV TMP3, #0x01            
loop         
            export loop
            LDR TMP4, [TMP2]
            CMP _1, TMP4
            STREQ TMP3, [TMP1]
            ADDEQ TMP3, #1
            
            B loop


Команды GET_... это макросы, которые просто записывают адреса регистров и т.п. в регистры ЦПУ. В общем биты требуемого режима SPI2 (в режиме Master) выставляются правильно. Но именно в регистр DR ничего не пишется :oops:

Re: Ассемблер KEIL

Пт май 22, 2020 19:05:30

Команды GET_... это макросы

а STREQ, ADDEQ? Вроде команд таких нету:
http://infocenter.arm.com/help/index.js ... DIGAC.html
На всякий:
Флаг TXE автоматически устанавливается при записи в регистр данных - SPI_DR, и сбрасывается когда значение из регистра данных уходит в сдвиговый регистр. Флаг BSY устанавливается в "1", когда сдвиговый регистр не пуст, т.е. идет передача на линию.
На С приблизительно так:
Код:
    SPI2->DR=(value);
    while (!(SPI2->SR & SPI_I2S_FLAG_TXE) || (SPI2->SR & SPI_I2S_FLAG_BSY));

Re: Ассемблер KEIL

Пт май 22, 2020 19:50:10

Команды GET_... это макросы

а STREQ, ADDEQ? Вроде команд таких нету:
http://infocenter.arm.com/help/index.js ... DIGAC.html
На всякий:
Флаг TXE автоматически устанавливается при записи в регистр данных - SPI_DR, и сбрасывается когда значение из регистра данных уходит в сдвиговый регистр. Флаг BSY устанавливается в "1", когда сдвиговый регистр не пуст, т.е. идет передача на линию.
На С приблизительно так:
Код:
    SPI2->DR=(value);
    while (!(SPI2->SR & SPI_I2S_FLAG_TXE) || (SPI2->SR & SPI_I2S_FLAG_BSY));


Вы с assembler на ARM поверхностно наверное знакомы? (не в обиду сказано, я и сам недавно начал по книге, но что-то уже понял :)) )
На асме для армов есть корень команды, всякие суффиксы, гибкие операнды и тд и тп.
STR - команда записи (корень), а за счёт суффикса EQ (equal) выполняется команда только если результат сравнения (CMP) "положительный", иначе они пропускаются.
Это получается псевдокоманда, компилятор кейла создает блоки If-Then автоматически.

По поводу проверки BSY это я только для теста сделал. Пускай новые данные пишутся после передачи данных... Да хоть как-нибудь пускай это заработает)) Даже если неверное значение будет передаваться, с этим разберемся.
А вот с записью в регистр SPI_DR ума не приложу, в чём проблема...

Re: Ассемблер KEIL

Пт май 22, 2020 20:17:03

А вот с записью в регистр SPI_DR ума не приложу, в чём проблема...

Может в DR и пишет, а режимы для пинов неправильно настроены...

Re: Ассемблер KEIL

Пт май 22, 2020 20:22:26

Вы с assembler на ARM поверхностно наверное знакомы?

Немного тренировался (делал несложный проектик), но на другом хорошем (имхо) ассемблере Fasmarm - там без суфиксов все прекрасно и понятно. Тут примерчик с единственным и понятным макросом "movlit", все остальное стандартно:
http://openefi.blogspot.com/2012/05/arm ... rrupt.html
ELF, сделаный Fasmarm прекрасно дебажит и симулирует...Keil и Протеус. В Fasmarm есть всяких прекрасных фишек, которых нет у других ассемблеров - например структуры, а метки можно везде по тексту одинаковые типа "@@" и т.д..

Re: Ассемблер KEIL

Пт май 22, 2020 20:26:50

Reflector, ставлю по RM0041, страница 546. Да и сверялся с различными источниками, например теми, кто писал на C настройку режима.
oleg110592, Может быть и хороший, может быть тоже попробую, но пока что зашел кейловский, т.к. есть хорошая и единственная методичка на русском чисто по асму :))
Ответить