Научная статья на тему 'Тенденции рынка и микроконтроллеры Stellaris от Luminary Micro на базе ядра Cortex-M3'

Тенденции рынка и микроконтроллеры Stellaris от Luminary Micro на базе ядра Cortex-M3 Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
344
76
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Родионов Михаил

В статье рассматриваются некоторые тенденции рынка микроконтроллеров и семейство микроконтроллеров на базе ядра Cortex-M3 — Stellaris, производимых фирмой Luminary Micro. Выполнено сравнение данных устройств с 8-разрядными микроконтроллерами и микроконтроллерами на базе более ранних версий ядра ARM.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Тенденции рынка и микроконтроллеры Stellaris от Luminary Micro на базе ядра Cortex-M3»

Тенденции рынка и микроконтроллеры Stellaris от Luminary Micro

на базе ядра Cortex-M3

Михаил РОДИОНОВ

michael@electrosnab.ru

В статье рассматриваются некоторые тенденции рынка микроконтроллеров и семейство микроконтроллеров на базе ядра Cortex-M3 — Stellaris, производимых фирмой Luminary Micro. Выполнено сравнение данных устройств с 8-разрядными микроконтроллерами и микроконтроллерами на базе более ранних версий ядра ARM.

О тенденциях рынка

Рассмотрим, что происходит на рынке микроконтроллеров за последние 10 лет. На рис. 1 показана динамика роста продаж микроконтроллеров. Обратим свое внимание в основном на 16- и 32-разрядные микроконтроллеры. 16-разрядные микроконтроллеры, как тогда казалось, должны были завоевать рынок и постепенно вытеснить 8-разрядные. Однако этого не произошло. Во-первых, 8-разрядные микроконтроллеры стали значительно быстрее и производительнее. И появились модели микроконтроллеров с большой флэш-памятью команд, находящейся на кристалле. Появились компиляторы Си, поддерживающие архитектуры 8-разрядных микроконтроллеров. Мало того, появились и коммерческие операционные системы, которые можно портировать на 8-разрядные микроконтроллеры.

Представим, что рынок состоит из 3 секторов. Нижний сектор рынка — это тот сектор, в котором находятся 8-разрядные модели, средний — 16-разрядные, верхний — 32-разрядные. Итак, нижний сектор рынка переместился вверх, в сторону более производительных микроконтроллеров. Ну а верхний сектор рынка? Что произошло с ним?

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

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

повышать цену на продукцию, не добавляя новых пользовательских свойств. Из этого можно сделать только один вывод — весь процесс разработки и изготовления должен дешеветь.

И все эти процессы действительно дешевеют. На смену кремниевым пластинам диаметром 200 мм пришли пластины диаметром 300 мм. Сейчас происходит этап становления технологии изготовления пластин 450 мм. А это и дает возможность получить с одной пластины вдвое больше микросхем. Что касается технологических норм, то тут нет необходимости напоминать читателям о том, что и этот процесс идет без остановок. Да, затраты на производство микросхем растут, но прибыли растут еще быстрее.

Теперь пора снова обратиться к 32-разрядным и 16-разрядным микроконтроллерам. Что же определяет их цену? Прежде всего — те компоненты микроконтроллеров, которые занимают самую большую площадь кристалла. А не секрет, что именно память команд и занимает до 60-80% площади микросхемы. Следовательно, для производителей микросхем стоимость процессорной части кристалла не является основной в определении стоимости всей микросхемы. Теперь в дело вступают потребители микросхем, и в первую очередь, программисты. Для 16-разрядных процессоров есть ряд ограничений по использованию операционных систем. Нет возможности напрямую работать с памятью большого объема. А механизм страничного переключения памяти не всегда удобен. Что же касается 32-разрядных микропроцессоров, то у них таких ограничений нет. И память адресуется достаточно большого объема и большинство операционных систем — «родные». Примером этих тезисов может быть рис. 2 [1]. На этом рисунке показано соотношение факторов, влияющих на выбор микроконтроллера.

Как мы видим, при выборе микроконтроллера на первое место пользователи ставят именно программные продукты. На втором месте — цена, на третьем — производительность. И на четвертом — операционная система. И по все этим параметрам 32-разрядные микроконтроллеры оказались привлекательнее, чем 16-разрядные. Именно теперь становится понятным, почему так давно закрылось направление МС8-196. И тихо «ушли» 16-разрядные микроконтроллеры, которые некогда гордо красовались на рынке. Здесь мы не рассматриваем микроконтроллеры, предназначенные для рынка приборов с автономным (батарейным или аккумуляторным) питанием. На этом рынке, где важен каждый микроампер тока питания, совсем другие «правила игры». Так что же получается в итоге? Верхний сектор (32-разрядных микроконтроллеров) завоевал почти всю нишу 16-разрядных микроконтроллеров и вплотную переместился к нижнему сектору 8-разрядных.

Итак, два сектора рынка практически сомкнулись. И остановились в «позиционной войне»? Конечно, нет! Еще раз вспомним глобальную тенденцию рынка — удешевление аппаратных средств. И микроконтроллеры здесь не исключение. Так что же происходит? А происходит дальнейшее давление 32-разрядных микроконтроллеров вниз, теперь уже на сектор 8-разрядных. Еще раз обратимся к рис. 2. На первом месте — программные инструменты. На 4-м — операционные системы. Теперь представим себе ситуацию, когда в изделии надо применить один или несколько 32-разрядных микроконтроллеров и еще «что-то» для вспомогательной задачи, имеющее небольшую производительность и цену. То есть мы можем взять либо 8-разрядный микроконтроллер, либо, с «запасом», — 32-разрядный. Что можно сказать об этой ситуации? Применение двух типов

Timer

I

Comparators

I

PWM PWM

Generator Interrupt

I___________________

Dead-Band

Generator

32 Г >

256 KB Flash

32_ 64 KB SRAM

Clocks, Reset System Control

Systick Timer

4 Timer/PWM/CCP 2

Each 32-bit or 2x16-bit Ш

Watchdog Timer W GPIOs

Battery-Backed

Hibernate

LDO Voltage Regulator

3 Analog Comparators

10-bit ADC 8 channel 1 Msps

Temp Sensor

Actual Forecast

Microcontrollers.

/xie-bit^^^Z-

s—'—«-bit

4-bit^—*

1994 1996 1998 2000 2002 2004 2006 2008 2010

Source: Gartner Dataquest

Рис. 1. Динамика роста продаж микроконтроллеров

Программные инс ггрументы

Производительно сть

Цена ! 1 :

Операционная си стема

Аппаратные инст эументы

Доступные прогр аммы | | |

Периферия Потребляемыя мс Репутаций постав Развитие линейкк Знание \\ опыт ра Поддержка в отл | Популярность Доступность М1 1 щность щи ка микропроцессоров юты сданными микроконтроллерами адке кроконтроллера, как IP

0% 20% 40% 60% 80%

Source: Embedded Systems Programming Q Related tO development tOOlS

Рис. 2. Факторы, влияющие на выбор микроконтроллера

Рис. 4. Блок-схема микроконтроллера Stellaris

микроконтроллеров крайне невыгодно при разработке. Два комплекта программного обеспечения. Два комплекта операционных систем. Два комплекта библиотек и наработок. Наконец, возможно, что это и два комплекта программистов. Выгодно? Скорее всего, нет! Лицензии на ПО, время, затраченное на изучение программных инструментов, и, наконец, увеличение команды разработчиков — все это отрицательные моменты, удорожающие разработку.

Так где же выход?

«ARM за доллар»

Чтобы более полно понять ситуацию на рынке микроконтроллеров, автор данной статьи рекомендует прочесть книгу о маркетинговых войнах [2], в которой подробно описывается процесс завоевания рынка новым товаром. Фирма, атакующая рынок новым товаром, должна найти свою нишу и нанести на этом направлении наиболее мощный удар. Чем же можно пошатнуть рынок 8-разрядных микроконтроллеров, где уже давно есть устоявшиеся лидеры? И кто же на такое отважился?

«ARM за доллар» — вот такой лозунг выдвинула некоторое время тому назад новая фирма-изготовитель микроконтроллеров Luminary Micro, находящаяся в Техасе

(www.luminarymicro.com). Чтобы получить продукт, который смог бы незамедлительно конкурировать с известными и популярными микроконтроллерами, необходимо было выйти на рынок с такими микроконтроллерами, которые не требовали бы от пользователя больших усилий в изучении. В качестве ядра процессора для такого микроконтроллера было выбрано ядро ARM. А если говорить более точно, то Luminary Micro разрабатывает, поставляет и продает микроконтроллеры, основанные на технологии ARM® Cortex-M3™, и как ведущий партнер ARM

в технологии Cortex-M3, Luminary Micro выпустила первую в мире реализацию процессора Cortex-M3, обеспечивающего 32-разрядную производительность по стоимости 8/16разрядных микроконтроллеров (рис. 3). Правда, в последнее время сам этот лозунг фирма сняла, но идея завоевания данного сегмента рынка 32-разрядными микроконтроллерами осталась. И эта идея успешно развивается.

Семейство микроконтроллеров Stellaris от Luminary Micro, содержащее более 100 микропроцессоров (рис. 4), основано на ядре ARM Cortex-M3, которое работает на частоте до 50 МГц, имеет встроенную Flash и SRAM, регулятор напряжения питания с низким падением напряжения, режим пониженного энергопотребления, оптимизированный для батарейного питания, встроенный сброс по включению питания и по снижению напряжения, аналоговые компараторы, 10-разрядный АЦП, порты ввода/вывода, таймеры и счетчики. В микроконтроллерах данного семейства также интегрировано несколько последовательных интерфейсов, включая 10/100 Ethernet MAC+PHY, CAN, SSI/SPI, до трех портов UART, порт I2C. Следует также упомянуть наличие специализированных периферийных устройств для управления двигателями и другими приводами, таких как выходы ШИМ для управления исполнительными устройствами, встроенный QEI (Quadrature Encoder Input),

Таблица 1. Программные продукты для ARM MCU Cortex-M3

Производитель Продукты

Keil Software Полный комплекс разработки и отладки программного кода, а также аппаратные средства программирования и отладки

IAR Systems Полный программный комплекс разработки и отладки программного кода

CodeSousery Полнофункциональный комплекс разработки и отладки GNU G++

Rowley Associates Полнофункциональный пакет разработки и отладки CrossWorks

FreeRTOS.org Встраиваемые операционные системы реального времени RTOS

Pumpkin RTOS

Express Logic RTOS, TCP/IP-стеки, файловые системы, USB-стеки

Micrium RTOS, TCP/IP-стеки, файловые системы, USB-стеки, библиотеки для работы с протоколами CAN и Modbus

CMX Systems RTOS, TCP/IP-стеки, файловые системы, USB-стеки

SEGGER Microcontroller Systeme RTOS, GUI, файловые системы, USB-стеки, JTAG-эмуляторы

Interniche Technologies RTOS, сетевые стеки и файловые системы

ппппппппппп

NVIC interface || 1 ETM interface í=¡>

32 bit ALU

Hardware divider

Single cycle 32 bit multiplier

<U

О

u

CO

Control logic

Thumb & Thumb-2 decode

Instruction

interface

Data interface

Ju u u u u Ji

Таблица 2. Параметры ядер процессоров с архитектурой ARM7TDMI-S и Cortex-M3

Параметр Ядро

ARM7TDMI-S Cortex-M3

Ядро ARMv4T ARMv7-M

Архитектура фон Неймана Гарвардская

Поддерживаемые системы команд Thumb Thumb/Thumb-2

Конвейер команд 3-ступенчатый 3-ступенчатый + branch speculation

Прерывания FIQ/IRQ NMI + от 1 до 240 физических прерываний

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Время обработки прерывания 24-42 тактов 12 тактов

Пошаговый режим Нет Интегрирован

Защита памяти Нет 8 регионов защиты памяти

Производительность 0,95 DMIPS/МГц (в режиме ARM) 1,25 DMIPS/МГц

Потребляемая мощность 0,28 мВт/МГц 0,19 мВт/МГц

Площадь кристалла, мм2 0,62 (только ядро) 0,86 (ядро и стандартная периферия)

предназначенный для обработки сигналов датчиков. Все это богатство возможностей позволяет с успехом применять микроконтроллеры Luminary Micro в приложениях, где требуется низкая стоимость, высокая производительность, функциональная насыщенность. Сочетание всех этих характеристик позволяет применять данные контроллеры в различных системах промышленного контроля и автоматизации; бытовых устройствах, схемах управления шаговыми двигателями, щеточными и бесщеточными двигателями постоянного тока, двигателями переменного тока, HVAC, в сетевых и коммуникационных устройствах, в медицинских приборах, разнообразном измерительном оборудовании и электронных приборах. Микроконтроллеры Luminary Micro — одни из немногих ARM-микроконтроллеров, имеющих реализацию физического уровня Ethernet.

Данные микроконтроллеры поддерживаются известными производителями инструментального программного обеспечения и разработчиками операционных систем (табл. 1).

Ядро ARM Cortex-M3

Все сказанное выше о новых микроконтроллерах необходимо дополнить небольшим экскурсом в архитектуру нового ядра. Новые тенденции рынка отражаются не только на ценах на 32-разрядные микроконтроллеры, но и на архитектуре ядер этих микроконтроллеров. Если первые реализации

ядер 32-разрядных микроконтроллеров были ориентированы только на «большие» задачи, то для того, чтобы потеснить 16- и 8-разрядные микроконтроллеры, новым процес-

Рис. 5. Блок-схема ядра процессора Cortex-M3

сорным ядрам необходимо было уметь выполнять задачи, присущие этим микроконтроллерам. Причем выполнять их не менее эффективно и пользоваться для этого небольшими объемами памяти программ и данных. Для этого была разработана система команд Thumb-2. Ядро процессора Cortex-M3 содержит декодер как для традиционной системы команд Thumb, так и для новой системы Thumb-2. Кроме этого, в состав процессора входит усовершенствованное АЛУ с поддержкой аппаратного умножения и деления, блок Memory Protection Unit (MPU), блок управляющей логики и интерфейсы к другим компонентам системы [3]. В таблице 2 показаны преимущества процессоров на базе архитектуры Cortex-M3

7 6 5 4 3 2 1 0

|o|o|o|o|o|o|q|o| Read byte from SRAM

Mask and modify bit element |x|x|x|x[x~ 1 |x|x| 7 6 5 4 3/2 1 0

|o|o|o|o|o|l ÖJÖ] Write byte to SRAM 7 6 5 4 3 2 1 0 LDR R0, = 0x200FFFFF ; Setup address

32 MB alias region

I 0x23FFFFFFC 10x23FFFFFF8 | • • • • | 0x23FFFFFE410x23FFFFFE01

1 MB SRAM bit-band region

5 4 3 2 1 0

MOV R2, #0x4 LDRR1,[R0] ORR R1, R2 STR R1, [R0]

; Setup data ; Read ; Modify bit ; Write back result

LDR RO, = 0x23FFFFFC MOV R1, #0x1 STR R1, [R0]

; Setup address ; Setup data ; Write

Traditional bit manipulation method

Direct, single cycle access with bit banding

Рис. 7. Доступ к битовым данным, сравнение работы двух архитектур

Memory Address Alias 0x02800000 0x02800001 0x02800002 0x02800003 0x02800004 0x02800005 0x02800006 0x02800007

Bit 0

Memory Map

Рис. 8. Доступ к битовым данным

перед процессорами на базе классической архитектуры ARM7TDMI-S.

Процессор на базе архитектуры Cortex-M3, как все процессоры ARM, представляет собой 32-разрядный процессор с 32-разрядными шиной данных, банком регистров и интерфейсом с памятью (рис. 5).

Он содержит 13 регистров общего назначения, два указателя стека, регистр связей, счетчик команд, регистр статуса и множество специальных регистров.

Процессор Cortex-M3 поддерживает два режима работы — Thread и Handler и два уровня доступа — привилегированный и непривилегированный, что позволяет создавать различные по сложности системы, не рискуя безопасностью работы разработанного программного обеспечения. Непривилегированное выполнение кода ограничивает или исключает доступ к ряду ресурсов, таких как определенные команды и определенные расположения памяти. Режим Thread — типичный рабочий режим, и в нем поддерживается как привилегированное, так и непривилегированное выполнение программы. Режим Handler запускается тогда, когда происходит исключение, и весь код в течение этого режима получает привилегированный режим. Кроме того, вся работа процессора может производиться еще в двух режимах — в режиме отладки или в рабочем режиме.

Процессор Cortex-M3 — система, в которой все ее компоненты отображены в поле памяти (рис. 6). Адресуемая процессором память может иметь объем до 4 Гбайт. Распределение зон памяти производится фиксированно для памяти программ, SRAM (пространство памяти данных), внешних блоков памяти или устройств и внутренних или внешних периферийных устройств. Есть также специальная область адресов, зарезервированных производителем.

Процессор Cortex-M3 разрешает прямой доступ к битам данных (рис. 7, 8). Для этого карта памяти включает два региона для bitbang по 1 Мбайт. Операции чтения/записи по

тому адресу, где находится 32-мегабайтная область, перекодируются для доступа к битовой области. Для указания на бит данных используются соответствующие разряды адреса. Однако данная операция не может быть прервана другими действиями, в том числе прерываниями.

Традиционные процессоры на базе архитектуры ARM7 поддерживают доступ только к данным, выровненным по границе слова. Процессоры на базе архитектуры Cortex-M3 позволяют обращаться к невыровненным данным и сводят к минимуму временные задержки, связанные с доступом к данным. Поскольку обращение к невыровненным данным происходит в ядре автоматически, и это прозрачно для пользователя, то процесс программирования упрощается.

Как известно, процессоры ARM имеют возможность работать в одном из двух режимов — ARM и Thumb. Теперь к этим режимам добавился еще и режим Thumb-2.

Обработка прерываний

Более ранние версии процессоров ARM не использовали традиционную стековую архитектуру 8- и 16-разрядных машин. Считалось, что прерывания должны будут обрабатываться программно. И обработка прерываний, а именно сохранение контекста, выполнялась в программном режиме. Однако это снижает производительность и требует дополнительных усилий при разработке софта. Для того чтобы упростить переход от 8-и 16-разрядных процессоров к процессору с новой архитектурой ядра ARM, фирма ARM выполнила контроллер прерываний, работающий в более привычном аппаратном режиме.

Контроллер прерываний NVIC обеспечивает процессору широкие возможности по обработке прерываний, среди которых есть одно немаскируемое и 32 физических прерывания общего назначения с 8 уровнями приоритета. Он может быть сконфигурирован для генерации 240 физических прерываний с 256 уровнями приоритета.

Для обработки прерываний используется перемещаемая таблица векторов, в которой записаны адреса переходов на подпрограм-

Highest IRQ1 IRQ2 I I

Traditional Interrupt Handling Cortex-M3 Interrupt Handling Push | ISR1 | Pop | Push | ISR2 | Pop

26 Cycles 16 Cycles 26 Cycles 16 Cycles

Push ISR1 ISR2 Pop

< > o -<—> 12 Cycles 6 Cycles 12 Cycles Tail-Chaining

Рис. 9. Обработка вложенных прерываний, когда два запроса пришли одновременно

Highest, IRQ1 IRQ2

/

Interrupt Handling Cortex-M3 Interrupt Handling Push Push | ISR1 | Pop | ISR2 | Pop

26 Cycles 26 Cycles 16 Cycles 16 Cycles

Pu ;h| ISR1 | ISR2 Pop

6 Cycles 1^ Cycles Tail-Chaining

Рис. 10. Обработка вложенных прерываний, когда прерывание с высшим приоритетом пришло позже

Highest IRQ1 IRQ2 i \

.

Traditional Interrupt Handling Cortex-M3 Interrupt Handling ISR1 Pop | Push | ISR2 | Pop

1 i Cycles 26 Cycles

ISR1 ISR2 Pop

/ \bandon Pop (1—12 Cycles) o- <—> 6 Cycles 12 Cycles Tail-Chaining

Рис. 11. Обработка вложенных прерываний, когда прерывание с высшим приоритетом пришло после того, как снялся запрос на прерывание с низшим приоритетом

мы обработки прерываний. Эта таблица векторов после сброса расположена по нулевому адресу, но может быть перемещена при записи кода управления в соответствующий управляющий регистр.

Использование стековой архитектуры и аппаратная поддержка сохранения содержания регистров Program Counter, Program Status Register, Link Register и регистров общего назначения R0-R3, R12 в стеке позволила сократить время с 30 тактов до 6. На рис. 9 показано, как производится обработка вложенных прерываний IRQ1 и IRQ2 в том случае, когда они возникли одновременно. Прерывание IRQ1 имеет больший приоритет и обрабатывается первым, следом за ним производится обработка прерывания IRQ2. На рисунке видно, что для более ранних моделей процессоров каждое прерывание обрабатывается отдельно, после каждого прерывания производится восстановление данных. А для ядра Cortex-M3 производится обработка вложенных прерываний.

На рис. 10 показано, как производится обработка вложенных прерываний IRQ1 и IRQ2 в том случае, когда прерывание с высшим приоритетом пришло позже.

На рис. 11 показано, как производится обработка вложенных прерываний IRQ1 и IRQ2 в том случае, когда прерывание с высшим приоритетом пришло после того, как снят запрос на прерывание с низшим приоритетом.

Дополнительные узлы и функции, ими выполняемые

В контроллере NVIC также реализованы схема управления питанием процессора и поддержка нескольких режимов энергосбережения. Кроме того, контроллер ЫУ1С содержит интегрированный 24-разрядный декременти-

рующий системный таймер, который используется для генерирования прерываний при отсчете временных интервалов и является незаменимым блоком при реализации операционных систем реального времени.

MPU (модуль защиты памяти) — дополнительный компонент процессоров архитектуры Cortex-M3, который позволяет существенно улучшить надежность всей системы. MPU производит запрет на обращение к критическим участкам кода, используемого операционной системой.

Поскольку все компоненты системы находятся в общем поле памяти, то блок MPU позволяет получить для каждого компонента системы соответствующий уровень доступа — всего до 8 таких областей, каждая из которых может быть разделена на 8 подобластей.

В состав ядра также входит блок отладки — Debug Access Port (DAP), который подключается либо через двухпроводный Serial Wire Debug Port (SW-DP), либо Serial Wire JTAG Debug Port (SWJ-DP). При отладке могут быть задействованы контрольные точки, точки останова, различные события и т. д.

Стартовые наборы

В разделе «ARM за доллар» говорилось о том, что для успешного продвижения на рынок необходимо не только сделать новый товар, обладающий значительно более привлекательными потребительскими свойствами, чем уже имеющийся в продаже, но и сосредоточить усилия на продвижении этого товара на рынок. Для более успешного продвижения микроконтроллеров, как мы знаем, применяются средства поддержки — стартовые наборы и специализированные программные инструменты. Фирма Luminary Micro выпускает значительное число стартовых наборов (рис. 12), ознакомиться с которыми можно на

сайте фирмы по адресу http://www.luminarymicro.com/products/

kits.html. Кроме того, фирма предлагает очень недорогой оценочный комплект, который может в дальнейшем использоваться как JTAG-адаптер для программирования устройства пользователя.

Выводы

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

Автор не призывает к поголовной замене, но все же там, где раньше был 8-разрядный микроконтроллер, сегодня уже на «вполне законных основаниях» должен быть 32-разрядный. ■

Литература

1. Moving to the ARM® Cortex™-M3 from 8-Bit Applications. www.luminarymicro.com

2. Райс Э., Траут Д. Маркетинговые войны. СПб: Питер.

3. Sadasivan S. An Introduction to the ARM Cortex-M3 Processor. ARM. October 2006.

i Надоели баннеры? Вы всегда можете отключить рекламу.