OSDev http://osdev.su/ |
|
ARM Assebmler http://osdev.su/viewtopic.php?f=6&t=3904 |
Страница 2 из 3 |
Автор: | SII [ 28 ноя 2019, 15:12 ] |
Заголовок сообщения: | Re: ARM Assebmler |
Да, это оно. Описание, похоже, ужасно (грубо говоря, кратко указаны функции регистров и отдельных битов в них, а как это использовать -- догадывайся сам), но, в общем-то, уже достаточно, чтобы что-то делать. Для того, чтобы проц просто завести для более-менее нормальной работы, надо осилить главы 2, 7 и 8. Кроме того, для управления питанием у них встроено ядро Cortex-M0 (это архитектура ARMv6-M), так что, вполне возможно, сначала придётся его побеждать. В общем, для новичка задача выглядит неподъёмной (Для собаку съевшего на подобных процах, но никогда не работавшего конкретно с этим семейством -- ну, на месяц-другой работы; мне -- пожалуй, на полгода, если каких-то особо замороченных вещей там не окажется) |
Автор: | user999 [ 28 ноя 2019, 15:23 ] |
Заголовок сообщения: | Re: ARM Assebmler |
Сложноватая задача, но такая интересная... И столько времени может понадобиться(по Вашим меркам - полгода), чтобы написать под конкретный ARM процессор на asm простой "Hello, World." ??? А ещё ко всему этому набору нужен ведь компилятор. А ссылку на компилятор я прикладывал в первом сообщении. ARM продаёт лицензию на компилятор. А финансы поют романсы. Да и странно было бы покупать лицензию, чтобы просто получить некий опыт и сделать подобие ОС с простым выводом "Hello, World.". |
Автор: | SII [ 28 ноя 2019, 15:33 ] |
Заголовок сообщения: | Re: ARM Assebmler |
user999 писал(а): И столько времени может понадобиться(по Вашим меркам - полгода), чтобы написать под конкретный ARM процессор на asm простой "Hello, World." ??? Это, во-первых, мне (я с такими сложными дела не имел, но с более простыми опыт большой, плюс ассемблер сам по себе никаких проблем не представляет), а во-вторых, не для "хелловорлда" на экране, а лишь чтобы сам проц завести (ну и помигать светодиодом -- собственно, в низкоуровневых вещах именно моргание светодиодом является аналогом "хелловорлда": во-первых, дисплея зачастую нет вообще, ибо он далеко не всегда нужен; во-вторых, запуск графики сам по себе может оказаться весьма нетривиальной задачей; ну а в-третьих, при низкоуровневой работе ты не можешь вывести строку символов просто так -- надо добавлять шрифт и как-то рендерить его в видеобуфер). user999 писал(а): А ещё ко всему этому набору нужен ведь компилятор. А ссылку на компилятор я прикладывал в первом сообщении. ARM продаёт лицензию на компилятор. А финансы поют романсы. Да и странно было бы покупать лицензию, чтобы просто получить некий опыт и сделать подобие ОС с простым выводом "Hello, World.". Ну, всё украдено до нас, так что найти -- не такая большая проблема, особенно по сравнению со всем прочим... Но вообще, если интересует низкоуровневое программирование, я бы посоветовал не пытаться сразу настолько сложный проц освоить, а начать с чего-то простого -- хотя деньги понадобятся, да Если говорить про ARMы, то самыми популярными являются разные микроконтроллеры фирмы ST (STM32-и-дальше-разные-буковки-циферки). Это архитектура ARMv7-M (редко более примитивная ARMv6-M, крайне редко, если вообще уже есть -- ARMv8-M, но последняя никаких принципиальных отличий от первых двух не имеет, новый номер -- маркетинговый ход). Для работы нужна сама плата с МК и парой кнопок-светодиодов как минимум, но желательно нечто понавороченнее, если хочется не только светодиодами мигать. Кроме того, нужен программатор-отладчик. Если он интегрирован на саму плату, проблем нет, если нет -- нужно покупать отдельно, а это готовьте ещё несколько тыщ (клонированный Segger J-Link; их у нас, например, "Стартеркит" штампует; сам пользуюсь в т.ч. им). Наконец, обычно "продвинутое" общение с пользователем (да и для отладки полезно) идёт не через дисплей (которого, повторюсь, может и не быть либо он может быть ещё не запущен), а через UART по интерфейсу RS-232, более известному как COM-порт. Поскольку на современных ПК его почти никогда нет, нужен ещё переходник RS-232 -- USB. Вот с таким набором можно действительно хоть полноценную ось написать (если возможности МК позволят), чем я и страдаю в свободное от работы время (ну и почти все, обретающиеся на этом сайте, тоже -- но каждый пилит своё и почти все под ПК). |
Автор: | user999 [ 28 ноя 2019, 15:52 ] |
Заголовок сообщения: | Re: ARM Assebmler |
Я давно программировал AVR микроконтроллеры. У меня есть друг заядлый электронщик программист. Он программирует STM32f103xxxx и STM32f4Discovery программировал, ещё занимается освоением ПЛИС, пишет что-то на Verilog. Он даже мне показывал как там пишется программа на STM32f103c8t6 и мигал светодиодом. Некое представление в программировании микроконтроллеров я представляю, но это на Си. Меня заинтересовал видеоматериал, который я прикладывал в первом сообщении. Продублирую в это. https://www.youtube.com/watch?v=9KrZRvJsOeo&feature=emb_logo Я помнимаю, что там на i386. Читал, что большУю часть работы выпоняет БИОС, почему в ассемблере меньше требуется писать кода. Посмотрев это видео, я подумал, что на ARM, не так, конечно, просто, можно так же вывести какую-нибудь строчку на экран. Начал проводить ассоциации кода, который пишется на видеоуроке для i386 с кодом для ARM-A. Немного что-то получается. Казалось попроще будет реализовать, чем Вы мне описали. |
Автор: | SII [ 28 ноя 2019, 16:11 ] |
Заголовок сообщения: | Re: ARM Assebmler |
user999 писал(а): Я давно программировал AVR микроконтроллеры. У меня есть друг заядлый электронщик программист. Он программирует STM32f103xxxx и STM32f4Discovery программировал, ещё занимается освоением ПЛИС, пишет что-то на Verilog. Он даже мне показывал как там пишется программа на STM32f103c8t6 и мигал светодиодом. Некое представление в программировании микроконтроллеров я представляю, но это на Си. Может, тогда сможете у друга арендовать ту же Дискавери поиграться (программатор на ней встроенный, так что ничего, кроме самой платы, и не понадобится)? И для начала -- помигать светодиодом на сях, а затем самому ручками переписать это дело на асм. user999 писал(а): Меня заинтересовал видеоматериал, который я прикладывал в первом сообщении. Продублирую в это. https://www.youtube.com/watch?v=9KrZRvJsOeo&feature=emb_logo Я помнимаю, что там на i386. Читал, что большУю часть работы выпоняет БИОС, почему в ассемблере меньше требуется писать кода. На ПК абсолютно всю низкоуровневую инициализацию выполняет BIOS. Более того, кой-какие вещи там BIOS делает и в процессе работы (например, управляет электропитанием проца и памяти, скоростью вращения вентиляторов и т.п.). ОС сама по себе это сделать не может (следствие как весьма специфической, цензурно выражаясь, архитектуры ПК, так и недоступности многой низкоуровневой информации по железу даже для Microsoft). Соответственно, на навороченном АРМе (а "телефонные" АРМы -- т.е. практически все ядра архитектур ARMv7-A и ARMv8-A -- именно что навороченные) фактически нужно написать некий мини-биос перед тем, как делать хоть что-то, относящееся к собственно решаемой задаче. Отсюда и высокая сложность (одного кода написать придётся от нескольких тысяч до нескольких десятков тысяч строк на асме; на сях, кстати, не слишком меньше, так как код по своей сути низкоуровневый -- записать число в регистр, прочитать другой регистр, проверить бит, если установлен, записать другое число в ещё какой-то регистр...). На ПК вывод на экран -- это запись в видеобуфер и, возможно, дёрганье пары-тройки функций BIOS для включения нужного видеорежима. На АРМе -- вроде то же самое, но надо настроить вывод на дисплей (сформировать видеобуфер и запустить собственно вывод, указав энное количество параметров -- грубо говоря, число строк и пикселей в строке, частоты строчной и кадровой развёртки и ещё кой-что). Но вывод всего этого дела требует определённой частоты опорного генератора, а значит, его надо сначала настроить (сразу после сброса процессор работает на малой частоте от нестабильного внутреннего источника синхронизации и поэтому ни для чего серьёзного не годится). А чтобы настроить синхронизацию, надо настроить питание (ибо чем выше частота, тем выше пиковое потребление проца, и схемы управления питанием должны правильно на это реагировать). Причём вполне может быть, что одно тесно связано с другим весьма нетривиальным образом... В общем, та ещё работка. Плюс не забывайте, что у Вас нет отладчика (а купить его... ну, готовьте несколько тысяч евро -- для 64-разрядного A-профиля отладчик очень дорогой; про работоспособные клоны я не слышал; и кстати, скорей всего, на Вашей плате подключать отладчик просто некуда -- не разведены соответствующие ноги проца), а отлаживать программу вслепую... застрелишься. Потому под такие платы практически все только под Линух и пишут. |
Автор: | user999 [ 28 ноя 2019, 16:16 ] |
Заголовок сообщения: | Re: ARM Assebmler |
Совсем из головы вылетело. На СТМ мне тоже доводилось писать, после того, как друг рассказал, как работать с ней. Я управлял двигателями. Делал мини-ногу роботу, сгибал и разгибал её. Да... Довольно много работы нужно провернуть, чтобы прийти к задуманной цели. |
Автор: | SII [ 28 ноя 2019, 16:19 ] |
Заголовок сообщения: | Re: ARM Assebmler |
Вот, кстати, кусок инициализации для одного нашего прибора -- настройка контроллера памяти: Код: ; Настройка контроллера внешней памяти в расчёте на частоту процессора ; 72 или 120 МГц и использование SDR SDRAM-133 с организацией 16М * 16. ldr R3, =BASE_SYSC + 0x180 MOVC R0, 1 << p_SYSC_CLKOUTCFG_CLKOUT_EN str R0, [R3, #SYSC_CLKOUTCFG - 0x180] MOVC R0, 0xA05 str R0, [R3, #SYSC_EMC_DLYCTL - 0x180] ; Настройка таймингов и режимов контроллера памяти. ldr R6, =BASE_EMC ldr R7, =BASE_EMC + DYNAMIC_CONFIG0 MOVC R4, (1 << p_EMC_CONTROL_ENABLE) + \ (EMC_CONTROL_MAP_NORMAL << p_EMC_CONTROL_MAP) + \ (EMC_CONTROL_POWER_NORMAL << p_EMC_CONTROL_POWER) str R4, [R6, #EMC_CONTROL] MOVC R4, DYNAMIC_READ_CONFIG_RD_CMD_DELAYED << \ p_DYNAMIC_READ_CONFIG_RD str R4, [R6, #DYNAMIC_READ_CONFIG] IF CPU_CLK <= 72000000 MOVC R4, (DYNAMIC_RAS_CAS_RAS_3 << p_DYNAMIC_RAS_CAS_RAS) + \ (DYNAMIC_RAS_CAS_CAS_2 << p_DYNAMIC_RAS_CAS_CAS) str R4, [R7, #DYNAMIC_RAS_CAS0 - DYNAMIC_CONFIG0] movs R4, #EMC_TIME_2 str R4, [R6, #DYNAMIC_RP] ; 20 нс str R4, [R6, #DYNAMIC_APR] ; 20 нс ? str R4, [R6, #DYNAMIC_MRD] ; 2 такта ? str R4, [R6, #DYNAMIC_RRD] ; 15 нс str R4, [R6, #DYNAMIC_WR] ; 1 такт + 7,5 нс ? movs R4, #EMC_TIME_2 str R4, [R6, #DYNAMIC_SREX] ; 75 нс ? str R4, [R6, #DYNAMIC_XSR] ; 75 нс ? movs R4, #EMC_TIME_4 str R4, [R6, #DYNAMIC_RAS] ; 45 нс str R4, [R6, #DYNAMIC_DAL] ; 2 такта + 20 нс movs R4, #EMC_TIME_5 str R4, [R6, #DYNAMIC_RC] ; 65 нс str R4, [R6, #DYNAMIC_RFC] ; 65 нс ? ELSE MOVC R4, (DYNAMIC_RAS_CAS_RAS_3 << p_DYNAMIC_RAS_CAS_RAS) + \ (DYNAMIC_RAS_CAS_CAS_3 << p_DYNAMIC_RAS_CAS_CAS) str R4, [R7, #DYNAMIC_RAS_CAS0 - DYNAMIC_CONFIG0] movs R4, #EMC_TIME_3 str R4, [R6, #DYNAMIC_RP] ; 20 нс str R4, [R6, #DYNAMIC_APR] ; 20 нс ? movs R4, #EMC_TIME_2 str R4, [R6, #DYNAMIC_MRD] ; 2 такта ? str R4, [R6, #DYNAMIC_RRD] ; 15 нс str R4, [R6, #DYNAMIC_WR] ; 1 такт + 7,5 нс ? movs R4, #EMC_TIME_9 str R4, [R6, #DYNAMIC_SREX] ; 75 нс ? str R4, [R6, #DYNAMIC_XSR] ; 75 нс ? movs R4, #EMC_TIME_6 str R4, [R6, #DYNAMIC_RAS] ; 45 нс movs R4, #EMC_TIME_5 str R4, [R6, #DYNAMIC_DAL] ; 2 такта + 20 нс movs R4, #EMC_TIME_8 str R4, [R6, #DYNAMIC_RC] ; 65 нс str R4, [R6, #DYNAMIC_RFC] ; 65 нс ? ENDIF MOVC R4, (DYNAMIC_CONFIG_MEM_TYPE_SDRAM << \ p_DYNAMIC_CONFIG_MEM_TYPE) + \ (DYNAMIC_CONFIG_ADDR_MAP_16_RBC_16M_16 << \ p_DYNAMIC_CONFIG_ADDR_MAP) str R4, [R7, #DYNAMIC_CONFIG0 - DYNAMIC_CONFIG0] ; Выдача команды NOP на минимум 200 мкс. ldr R4, =(DYNAMIC_CONTROL_CE_ALWAYS << p_DYNAMIC_CONTROL_CE) + \ (DYNAMIC_CONTROL_CLKOUT_ALWAYS << \ p_DYNAMIC_CONTROL_CLKOUT) + \ (DYNAMIC_CONTROL_INIT_NOP << p_DYNAMIC_CONTROL_INIT) str R4, [R6, #DYNAMIC_CONTROL] ldr R4, =10000 100 subs R4, #1 bne %B100 ; Выдача команды PRECHARGE ALL и установка периода регенерации. ldr R4, =(DYNAMIC_CONTROL_CE_ALWAYS << p_DYNAMIC_CONTROL_CE) + \ (DYNAMIC_CONTROL_CLKOUT_ALWAYS << \ p_DYNAMIC_CONTROL_CLKOUT) + \ (DYNAMIC_CONTROL_INIT_PRECHARGE_ALL << \ p_DYNAMIC_CONTROL_INIT) str R4, [R6, #DYNAMIC_CONTROL] movs R4, #1 str R4, [R6, #DYNAMIC_REFRESH] movs R4, #128 200 subs R4, #1 bne %B200 IF CPU_CLK <= 72000000 movs R4, #33 ELSE movs R4, #55 ENDIF str R4, [R6, #DYNAMIC_REFRESH] ; Выдача команды MODE. ldr R4, =(DYNAMIC_CONTROL_CE_ALWAYS << p_DYNAMIC_CONTROL_CE) + \ (DYNAMIC_CONTROL_CLKOUT_ALWAYS << \ p_DYNAMIC_CONTROL_CLKOUT) + \ (DYNAMIC_CONTROL_INIT_MODE << p_DYNAMIC_CONTROL_INIT) str R4, [R6, #DYNAMIC_CONTROL] IF CPU_CLK <= 72000000 ldr R5, =0xA0023000 ELSE ldr R5, =0xA0033000 ENDIF ldr R4, [R5] ; Переход в нормальный режим работы. movs R4, #(DYNAMIC_CONTROL_CE_ALWAYS << p_DYNAMIC_CONTROL_CE) + \ (DYNAMIC_CONTROL_CLKOUT_ALWAYS << \ p_DYNAMIC_CONTROL_CLKOUT) + \ (DYNAMIC_CONTROL_INIT_NORMAL << p_DYNAMIC_CONTROL_INIT) str R4, [R6, #DYNAMIC_CONTROL] ; Включение буферов. MOVC R4, (DYNAMIC_CONFIG_MEM_TYPE_SDRAM << \ p_DYNAMIC_CONFIG_MEM_TYPE) + \ (DYNAMIC_CONFIG_ADDR_MAP_16_RBC_16M_16 << \ p_DYNAMIC_CONFIG_ADDR_MAP) + \ (1 << p_DYNAMIC_CONFIG_BUFFER_ENABLE) str R4, [R7, #DYNAMIC_CONFIG0 - DYNAMIC_CONFIG0] Память здесь обычная SDRAM, а не навороченные современные (DDR-2-3-4), так что и инициализация довольно простая. Но строк, как видите, уже довольно много. |
Автор: | user999 [ 28 ноя 2019, 16:29 ] |
Заголовок сообщения: | Re: ARM Assebmler |
Да, довольно интересно. |
Автор: | user999 [ 28 ноя 2019, 17:27 ] |
Заголовок сообщения: | Re: ARM Assebmler |
Мне тут подсказали asm компилятор GAS. Не особо понимаю, подойдёт ли он для ARM. |
Автор: | SII [ 28 ноя 2019, 17:41 ] |
Заголовок сообщения: | Re: ARM Assebmler |
Он подходит практически для всего подряд (естественно, в версии под нужную архитектуру), но он... довольно странный, скажем так. Особенно странный, конечно, при работе с IA-32 (ибо, вместо того чтобы использовать интеловскую нотацию, они используют нотацию PDP-11, т.е. совершенно другой архитектуры), но и с остальными архитектурами тоже не без странностей. Причина, в частности, в том, что никто серьёзно его как инструмент для разработки не рассматривал -- по сути, это "приложение" к GCC для перевода того, что нагенерил GCC, в объектный формат (ибо GCC не умеет объектные файлы генерить -- он выдаёт ассемблерный текст, просто пользователь обычно этого не видит). Лично я пользуюсь родным АРМовским ассемблером (поставляется в составе АРМовских IDE -- Keil и DS-5), но, по большому счёту, это не особо важно. |
Страница 2 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |