Pull to refresh

Comments 66

> потом внезапно убрал в черновики статью о плане написать про создание своей ОС для архитектуры ARM

> я буду рассказывать о том, как программировать микроконтроллеры ARM на нарастающих по сложности примерах, пока мы не напишем свою ОС или пока мне не надоест.

т.е. Вы планировали написать пост, продолжения которого может не быть потому, что Вам это надоело? Правильно что убрали в черновики — такие посты тут не надо. И так вон горы обещаний типа: «в следующем посте я расскажу поподробнее» и привет на долгие года.
Нет, я написал пост для которого у меня уже было две статьи продолжений. Но люди попросили больше конкретики, и я изменил концепцию (этот текст – это компоновка материала из первых двух частей, третья сейчас в переработке).
какой отрицательный отзыв
UFO just landed and posted this here
Итого, треть заинтересованных, пишите! А пролистывающие еще заинтересуются.

Вопрос про RT. Насколько по-вашему реально сделать что-то вроде звукового FX-процессора на подобном?
Я, если честно, не сильно в теме RT, но мне кажется что тут лучше бы подошел FPGA. Есть подозрение, что у M-ок не хватит числодробилки, тут бы что-то с FPU (впрочем, у Cortex-M4 есть FPU).
Для звукового процессора лучше использовать специализированные решения aka DSP или FPGA.
Лучше DSP. Работали как то над IP телефоном. Blackfin подороже TI шные обычно чуть дешевле. С Blackfin работать проще.
> ARM делает замечательные встраиваемые процессоры
ARM не делает процессоры. ARM проектирует процессорные ядра и лицензирует их.
Да, конечно вы правы, обновил текст.
Почему по адресу 0х4 лежит 0х69, а main начинается с 0х68?
0-й бит адреса означает Thumb режим. Есть три набора инструкций: ARM (4-байтный), Thumb (2-байтный), Thumb2 (4-байтный, расширяет возможности Thumb). Cortex-Mx поддерживают только Thumb режим, так что в указателях младший бит всегда будет 1. В Cortex-Ax можно изменяя этот бит при прыжке перейти из ARM-режима в Thumb и наоборот.
Мне казалось, что Thumb2 — это 32-битные и 16-битные команды вперемешку, и Cortex-M поддерживает только этот режим.
Thumb2, насколько я помню, новых 16-битных команд не добавляет.

Cortex-M0 поддерживает только Thumb (16-битные) и 6 команд из Thumb2. Cortex-M3 поддерживает Thumb/Thumb2 целиком.
В любом случае, фраза про то, что РС указывает на текущую инструкцию + 4 байта, не очень корректна. Скорее уж РС указывает на следующую команду.
Подождите. Вы говорите, что процессор «читает значение по адресу 0x00000004 и записывает его в PC (PC – регистр, который указывает на текущую инструкцию + 4 байта)». По адресу 0х4 у нас 0х69. Это не адрес текущей команды + 4, это адрес следующей команды!
Ох, я маленький кусок абзаца захватил значит :-)



При записи мы переходим по адресу, который записали.
При чтении мы получаем адрес инструкции, которая читает + 4.
Ок, спасибо за разъяснения. Стараюсь узнать наших конкурентов получше :)
> Просьба тем, у кого есть тестовая платформа на базе ARM – пишите в комментариях – какая. Я могу пересмотреть аппаратную базу для дальнейших статей.

PINBOARD II (STM32F103)
Добавлю сюда же HY-Mini STM32V (STM32F103)
Спасибо, Отличная вводная статья… Правда в наших краях LPC почти не бывает… Тем более LPC1114… Учитывая её цену и исполнение в DIP'е, это должно быть раритетом… Из arm'ов мне доступно ti launchpad Stellaris Cortex-M4F и STM32F4-Discovery…
Как раз наоборот. В дипе более новый чипы они появились года два назад, не раньше.
раритет — это не в смысле старые, а в смысле фиг найдешь в продаже… Разве что в Дипе с их долбанутым ценником…
Интернет магазины вас спасут.
Я с ходу LPC1114FN28 не нашёл… В других форм-факторах на AliExpress'е за десять долларов пучок полно предложений…
На mouser.com есть только два ARM-а в DIP исполнении, это не самый популярный формат для этой архитектуры, но очень интересный для экспериментов :)
10 долларов 3 штуки и 120 долларов доставка… Тогда уж лучше в Чип&Дип… ))
Набросил Снежинскому идею, может быть скоро в Чипстере будет.
Если надо недорогая борда с ARM архитектурой на борту, обратите взор на Stellaris Launchpad от TI.
За $10 (пересылка бесплатно) получаем 2 камня на борде + serial «кабель» 5V5 -> 3V2
Она у меня есть. Интересует возможность поиграться аппаратной частью на breadboard'е…
Все же, у слова раритет имеется немного другое значение.
Я знаю только одно. Полагаю у это слова с английским rare (редкий) одно происхождение… Скорей всего от латинского…
Неправильно выразился. Устоявшееся применение другое.
Да и еще есть интересный момент, что чтение из памяти(LDR) в микроконтроллерах на ядре Cortex-M0 должно быть только по выровненным адресам, т.е если мы считываем данные размером 4 байта(LDR), то адрес из которого читаем должен быть кратен 4, так же и для 2 байтавых переменных(LDRH) адрес должен быть кратен 2.
STM32VLDISCOVERY, но интереса у меня почти нет — и без ваших статей опыта в этом деле хватает.
Держите нас в курсе, обязательно!
Я бы кстати в рамках цикла статей «ARM для самых маленьких» с удовольствием почитал небольшой обзор-сравнение с другими RISC-архитектурами микроконтроллеров — MIPS, SPARC и т.д. Фраза «ARM продвигает замечательную архитектуру» выглядит как-то куце без упоминания о том, чем же так замечательна эта архитектура.
Записал идею, подумаю над этой темой.
Очень поддерживаю цикл статей такого плана, с удовольствием почитаю.

Просьба тем, у кого есть тестовая платформа на базе ARM – пишите в комментариях – какая.

У меня TI Stellaris launchpad — она сейчас стоит 10$ и дошла до Питера за 5 дней и бесплатно — по-моему отличный вариант.
Ко мне такая же борда едет, скорее всего добавлю ее как вариант.
Инетресный момент, что ваш собранный бинарник, если прошить его в таком виде как он есть в ROM микроконтроллера даже не запуститься.
Вы используете LPC1114, стоит выделить место в статье и написать о порядке старта программы. Вы упустили очень важную особенность, на которую потом часто нарываются разработчики.
Какую именно, уточните пожалуйста? Я прошиваю собранные бинарники, и они работают. LPC не надо настраивать осциллятор, он по умолчанию стартует с внутреннего в достаточном объеме чтобы работать.
Судя по листингу дизасма, у вас по смещению 0x1C находится заглушка 0x45. В листинге boot.s у вас это место помечено, как RESERVED.
Но, оно же зарезервированно с определенной целью.
В соответствии с параграфом 26.3.3 документации на LPC111x там должна быть контрольная сумма первых 7-ми векторов, подсчитанная таким образом, чтобы сумма первых 8-ми векторов равнялась нулю. Если это условие не выполняется, встроенный в контроллер бутлоадер не будет считать прошивку валидной и никогда ее не запустит. Эта процедура одинаковая для многих cерий LPC контроллеров.
Ну а запускаются ваши бинарники скорее всего потому, что программы, которыми вы прошиваете бинарник в контроллер на ходу его модифицируют и правят это место. Flash Magic это однозначно делает. Считайте ваш бинарник назад из контроллера и увидите, что он модифицирован.
В итоге получается, что ваш бинарник сам по себе не валидный, а возможность его запуска зависит от сторонней утилиты для прошивки.
Интересно. Может, наконец брошу мелкие AVR и возьмусь за лежащие без дела демо-платы

Просьба тем, у кого есть тестовая платформа на базе ARM – пишите в комментариях – какая.


— Launchpad MSP430
— Launchpad Stellaris

Взяты в своё время по $4-6, когда была акция с распродажей и предзаказом, но как-то пока так и лежат без дела :(
#if defined(__ARM_ARCH_6M__)

/* Cortex-M0 это ARMv6-M, код для LPC1114 */
...

#else

/* Иначе просто считаем что это LPC1768 */
...

#endif

Тут есть потенциальные грабли, когда в разросшийся код будет добавлятся новая платформа. Лучше сразу приучить себя писать конструкции вида:

#if defined (__PLATFORM_1__)

    ...

#elif defined (__PLATFORM_2__)

    ...

#else

    #error "Please support new platform here"

#endif
Да я так тоже думал, а потом что-то стало лень дописывать: what could possibly go wrong? :-) Но вы правы – ваш вариант надежнее, обновил.
> Вопрос: как компоновщик знает, куда надо засунуть таблицу прерываний? А он и не знает, там не написано :-). Он просто линкует подряд, начиная с нулевого адреса, так что порядок файлов (boot.o, потом main-c0.o) очень важен! Попробуйте слинковать наоборот или слинковать boot.o два раза и сравните вывод в lst-файле.

Так делать нельзя. Для этого есть ключевое слово .section в gcc ассемблере. В линкерном скрипте первой строчкой вписываете эту секцию — желательно сразу с параметром KEEP.
Да, я упомяну это в следующей части. Сейчас мне хотелось показать что линкер по сути работает «в лоб».
Ровно до того момента, как включите оптимизацию
Просьба тем, у кого есть тестовая платформа на базе ARM – пишите в комментариях – какая.

stm32vldiscovery и STM32F0DISCOVERY.

stm32f0 серия уже есть TSSOP-20 корпусах ( ziblog.ru/2013/08/01/stm32f030-value-line.html и we.easyelectronics.ru/reptile/stm32f050f4-v-tssop20-otladochnaya-plata-i-testovyy-proekt.html )

Цена на STM32F050F4P6 всего 29 руб в розницу!

Ваша статья очень понравилась. Ждем продолжения. Если можно покажите как с LLVM сделать тоже самое.
Ну TSSOP не такая вроде уж и новость вроде, LPC811 тоже в TSSOP есть, но это не так интересно как DIP.

LLVM будет позже (собственно уже есть, но следующая часть про осцилляторы, так что ему прийдется лежать части до третей).
Для меня stm32 легче купить, чем LPC. И когда выбирал микроконтроллер для хобби, не смог найти как прошивать LPC из linux. Поэтому и радуюсь что хоть tssop появился для stm32.
C нетерпением жду продолжения серии статей (про осциляторы тоже очень интересно).
Спасибо большое за наводку на LPC1114. Заказал на таобао, теперь осталось месяц её ждать.

>Интересной особенностью современных ARM-ов является то, что их вполне реально программировать целиком на С
o_O Имею опыт с TI Launchpad MSP430, pic-контроллерами. Асм-код не писал никогда. Зато ни там ни там не писал таблиц прерывай. Смотрится страшно, магически и не понятно. Её нужно писать каждый раз?
нет, в либах лежат уже готовые, конечно же.
по крайней мере с STM32 Mini в комплекте шло всё готовое
Наверно имелись в виду именно современные АРМЫ в противовес не современным.
Для тех же ARM7TDMI и ARM9 нужно было писать стартап-файл на асме.
Большое спасибо за статью, очень интересно.

Скажите, а как вы всему этому научились? Какую литературу посоветуете?
Я начинал с даташитов и ARMARM (референсный мануал по архитектуре). Уверен на 100%, есть более простые методы изучения этого, например та же ардуина (когда физические процессы становятся понятны, можно опуститься «ближе к железу», и смотреть как программа влияет на микроконтроллер).
Привет, автор! Спасибо за статью, сяду читать ночером. Пока имею абстрактный вопрос.
Захотелось мне тут скил поднять, освоить кое в чем arm (опыт только с avr 8b).

К примеру, мне в mcu поступает по цифре RTP-медиа (моно), думаю будет pjmedia. Мне нужно вывести его аналоговым аудиосигналом для передачи ну скажем на блютус-модуль.

Как это сделать проще и дешевле всего? Сугубо без конкретинки, общими фразами, дальше я разберусь. Спасибо!
вывести его аналоговым аудиосигналом для передачи ну скажем на блютус-модуль

так аналоговым или на bluetooth? Для avr'ок есть "канонический" пример в виде ардуины: https://www.arduino.cc/en/Tutorial/SimpleAudioPlayer

Sign up to leave a comment.

Articles