OSDev

для всех
Текущее время: 28 мар 2024, 13:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 15:12 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Да, это оно. Описание, похоже, ужасно (грубо говоря, кратко указаны функции регистров и отдельных битов в них, а как это использовать -- догадывайся сам), но, в общем-то, уже достаточно, чтобы что-то делать. Для того, чтобы проц просто завести для более-менее нормальной работы, надо осилить главы 2, 7 и 8. Кроме того, для управления питанием у них встроено ядро Cortex-M0 (это архитектура ARMv6-M), так что, вполне возможно, сначала придётся его побеждать. В общем, для новичка задача выглядит неподъёмной :) (Для собаку съевшего на подобных процах, но никогда не работавшего конкретно с этим семейством -- ну, на месяц-другой работы; мне -- пожалуй, на полгода, если каких-то особо замороченных вещей там не окажется)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 15:23 

Зарегистрирован: 28 ноя 2019, 12:23
Сообщения: 12
Сложноватая задача, но такая интересная...
И столько времени может понадобиться(по Вашим меркам - полгода), чтобы написать под конкретный ARM процессор на asm простой "Hello, World." ???

А ещё ко всему этому набору нужен ведь компилятор. А ссылку на компилятор я прикладывал в первом сообщении. ARM продаёт лицензию на компилятор. А финансы поют романсы. Да и странно было бы покупать лицензию, чтобы просто получить некий опыт и сделать подобие ОС с простым выводом "Hello, World.".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 15:33 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
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. Вот с таким набором можно действительно хоть полноценную ось написать (если возможности МК позволят), чем я и страдаю в свободное от работы время (ну и почти все, обретающиеся на этом сайте, тоже -- но каждый пилит своё и почти все под ПК).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 15:52 

Зарегистрирован: 28 ноя 2019, 12:23
Сообщения: 12
Я давно программировал AVR микроконтроллеры. У меня есть друг заядлый электронщик программист. Он программирует STM32f103xxxx и STM32f4Discovery программировал, ещё занимается освоением ПЛИС, пишет что-то на Verilog. Он даже мне показывал как там пишется программа на STM32f103c8t6 и мигал светодиодом. Некое представление в программировании микроконтроллеров я представляю, но это на Си.

Меня заинтересовал видеоматериал, который я прикладывал в первом сообщении. Продублирую в это.
https://www.youtube.com/watch?v=9KrZRvJsOeo&feature=emb_logo
Я помнимаю, что там на i386. Читал, что большУю часть работы выпоняет БИОС, почему в ассемблере меньше требуется писать кода.

Посмотрев это видео, я подумал, что на ARM, не так, конечно, просто, можно так же вывести какую-нибудь строчку на экран.
Начал проводить ассоциации кода, который пишется на видеоуроке для i386 с кодом для ARM-A. Немного что-то получается.
Казалось попроще будет реализовать, чем Вы мне описали. :lol:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 16:11 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
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-профиля отладчик очень дорогой; про работоспособные клоны я не слышал; и кстати, скорей всего, на Вашей плате подключать отладчик просто некуда -- не разведены соответствующие ноги проца), а отлаживать программу вслепую... застрелишься. Потому под такие платы практически все только под Линух и пишут.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 16:16 

Зарегистрирован: 28 ноя 2019, 12:23
Сообщения: 12
Совсем из головы вылетело. На СТМ мне тоже доводилось писать, после того, как друг рассказал, как работать с ней. Я управлял двигателями. Делал мини-ногу роботу, сгибал и разгибал её. :D

Да... Довольно много работы нужно провернуть, чтобы прийти к задуманной цели. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 16:19 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Вот, кстати, кусок инициализации для одного нашего прибора -- настройка контроллера памяти:

Код:
        ; Настройка контроллера внешней памяти в расчёте на частоту процессора
        ; 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), так что и инициализация довольно простая. Но строк, как видите, уже довольно много.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 16:29 

Зарегистрирован: 28 ноя 2019, 12:23
Сообщения: 12
Да, довольно интересно. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 17:27 

Зарегистрирован: 28 ноя 2019, 12:23
Сообщения: 12
Мне тут подсказали asm компилятор GAS. Не особо понимаю, подойдёт ли он для ARM.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ARM Assebmler
СообщениеДобавлено: 28 ноя 2019, 17:41 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Он подходит практически для всего подряд (естественно, в версии под нужную архитектуру), но он... довольно странный, скажем так. Особенно странный, конечно, при работе с IA-32 (ибо, вместо того чтобы использовать интеловскую нотацию, они используют нотацию PDP-11, т.е. совершенно другой архитектуры), но и с остальными архитектурами тоже не без странностей. Причина, в частности, в том, что никто серьёзно его как инструмент для разработки не рассматривал -- по сути, это "приложение" к GCC для перевода того, что нагенерил GCC, в объектный формат (ибо GCC не умеет объектные файлы генерить -- он выдаёт ассемблерный текст, просто пользователь обычно этого не видит). Лично я пользуюсь родным АРМовским ассемблером (поставляется в составе АРМовских IDE -- Keil и DS-5), но, по большому счёту, это не особо важно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB