неділю, 17 грудня 2017 р.

STM Studio -- монітор змінних STM32

Намагаючись дійти толку із SemiHosting без зневаджувача, натрапив на цікавий інструмент: STM Studio. Не слід плутати із купою інших "студій", це не IDE, це: "run-time variables monitoring and visualization tool for STM32 microcontrollers" -- програма, яка дозволяє інтерактивно спостерігати за змінними програми, залитої в мікроконтролер.
Вона використовує згадуваний тут режим моніторингу, тому теж змінює налаштування відладки MCU, але, принаймні (іноді) очищає їх, на відміну від OpenOCD.
Така можливість корисна тоді, коли зупинка в дебагері -- не варіант. Наприклад, при зневадженні коду SemiHosting ;-). Або коли відбуваються якісь процеси, де паузи -- неприйнятні.  

Чудес від цього, доволі простого, інструменту, очікувати не доводиться, але він корисний -- шкодую, що не знав про нього раніше. Не претендуючи на повноту, коротко глянемо, як його можна використовувати.

четвер, 14 грудня 2017 р.

USB VCP інших плат сімейства STM32 Discovery

"USB Zoo"
Мікроконтролери навіть в межах одного сімейства трішки відрізняються один від одного. Якщо користуватися HAL, портабельність буде високою, але, все ж, не абсолютною. Вирішив повторити описане в попередньому пості, про USB на STM32F3Discovery, для інших плат, обладнаних роз'ємом USB, поміж описаних тут. Їх три (Blue pill поки не розглядав):
  • STM32F4Discovery, із MCU STM32F407VG -- ARM Cortex M4F,
  • STM32F072BDiscovery, із MCU STM32F072RBT6 -- ARM Cortex M0,
  • 32L0538Discovery, із STM32L053C8T6 -- ARM Cortex M0+.
Кожна із цих плат чимось цікава, наприклад, акселерометр та мікрофон в F4, e-Ink-дисплей в L0 тощо -- думаю, ще не раз до них повернемося. Але тут говоритимемо лише про USB CDC VCP.


вівторок, 12 грудня 2017 р.

Досьє на плати сімейства STM32 Discovery

Останнім часом, у нас, в CS@UCU, завелося багато демоплат, поміж них, за кількістю, домінують плати Discovery від STM32. В них почав плутатися вже й і я, що говорити про студентів. Тому вирішив написати такий собі довідничок: короткий опис плати, ключові компоненти, зокрема -- присутня на платі периферія, особливості її мікроконтролера (MCU), супроводжуючи інформацію посиланнями на офіційні сторінки, даташіти і т.д. 
Варто зауважити, що на офіційних сторінках мікроконтролерів, крім даташітів є також посилання на величезну кількість так-званих AppNote -- прикладів використання якихось можливостей мікроконтролерів. Дуже рекомендую ознайомитися хоча б із списками. :-)
Порядок плат менш-більш довільний, грубо -- по спаданню потужності мікроконтролера на платі та різноманітності периферії.

Описано:
  • STM32F4Discovery
  • STM32F3Discovery
  • 32F072BDISCOVERY  
  • 32L0538DISCOVERY  
  • 32L152CDISCOVERY
  • STM32VLDISCOVERY
  • китайська "Blue pill"
  • екзотична M24LR-DISCOVERY
Вони обладнані мікроконтролерами на базі ядер ARM Cortex M0, M0+, M3, M4F, а M24LR обладнана 8-бітним MCU із сімейства STM8.

STM32F4Discovery

Цікава плата із одним із найпотужніших мікроконтролерів сімейства (на М7 не заглядатимемося поки). Новіший варіант, (із кодом замовлення STM32F407G-DISC1).

четвер, 7 грудня 2017 р.

Зовсім просто про Virtual COM Port поверх USB плати STM32F3Discovery

Взято тут.
Шина USB, Universal Serial Bus, складна. Звична плата за універсальність і простоту використання. На жаль, я поки із нею знайомий лише побіжно. Однак, не тільки в мене такі проблеми :-). Тому багато популярних мікроконтролерів містять периферію, котра бере турботу про низькорівневі подробиці функціювання USB на себе. Зокрема, є підтримка і у багатьох MCU STM32. На платах STM32F3DiscoverySTM32F4Discovery та інших навіть виведено окремий роз'єм (Mini-B та Micro-B, відповідно).
Є він і у ряду плат серії STM32F0, на клонах Maple Mini із STM32F103, тощо. Про них напишу трішки пізніше. Але не ARM-ами єдиними. Поміж плат на AVR теж такі трапляються, зокрема, в сімействі плат Arduino. Я б виділив Digispark -- найменший із Arduino. Детальніше про AVR + USB див. серію статей "AVR ATtiny USB Tutorial Part", але, в принципі, такі фокуси можливі і з іншими Arduino.
Крім того, STMicroelectronics надає Middleware, програмні бібліотеки, які спрощують роботу із USB до майже тривіальної -- якщо не хотіти чогось хитрого.

І ось поверх цього USB демоплат можна влаштувати зручний та дуже швидкий (особливо в порівнянні із semihosting) канал обміну інформацією із комп'ютером --  віртуальний COM-порт (чи UART) , VCP. Подивимося, як це можна зробити.

Зміст:
  1. Огляд USB
  2.  USB VCP на STM32F3Discovery -- початок
  3.  USB VCP -- доводимо до юзабельності


середу, 6 грудня 2017 р.

SemiHosting без дебаггера

Взято із: "Getting printf Output from Target to Debugger".
Якщо ви користувалися SemiHosting, то могли зауважити -- коли програма виконується без під'єднаного відладчика (зневаджувача), нічого корисного вона не робить. Звичайно, без згаданого відладчика, чим вона зайнята, не видно, але жодної зовнішньої активності (мигання світлодіодами, комунікація шинами) після спроби скористатися семихостингом не буде. В чому справа і як із тим боротися? 

Найпростіший варіант -- мати "Debug" i "Release" версію програми, і в останній SemiHosting   повністю викидати. В принципі, враховуючи, що даний інтерфейс -- чисто відладочний, це, певне, найкращий варіант -- не варто залишати відладочний код в приладі. Але він має й свої мінуси -- зростає громіздкість коду, більше способів його зламати (див. весь список заперечень проти використання умовної компіляції), все таке. 

Щоб знати, що ще можна зробити, слід розібратися, а чого, власне, програма зупиняється на використанні SemiHosting. Потім -- придумати, як із тим боротися. Наперед скажу -- на жаль, повністю вирішити проблему не вдасться. Все рівно буде потрібно вимкнути-ввімкнути живлення мікроконтролера (демоплати), перш ніж код зможе працювати автономно.

Update 12.12.2017:  Описано особливості ARM Cortex M0 та M0+.

середу, 11 жовтня 2017 р.

Література до принципів організації комп'ютера -- Інтернет

Взято тут.
Продовжуючи список літератури, тепер -- значно більш ефемерні джерела, посилання в Інтернеті. Зате їх більше. :-)

Цей список складається із двох частин -- літератури для безпосереднього вивчення теми та окремий історичний підрозділ. Прочитайте хоча б вступ до нього! :-)

Почнемо із вікіпедії. Звичайно, тут легко втонути, список може стати величезним, тому, в основному, посилання "першого рівня" -- вглиб треба рухатися самостійно.

Загальні посилання:
Елементна база:
  • 7400 series -- найбільш популярна серія мікросхем, включає реалізації всіх тих компонент, про які пише Токхейм та інші. 
  • List of 7400 series integrated circuits -- список членів цього сімейства мікросхем.
  • 4000 series -- ще одна така серія. Зараз, на загал, менш популярна, ніж 74хх, але трапляється. 
  • List of 4000 series integrated circuits.
  • NE555 -- таймер, генератор імпульсів і взагалі дуже корисна штука.
  • Не на вікі, ще один список мікросхем серії 74xx, привабливий тим, що містить схеми розташування виводів більшості мікросхем серії -- сильно спрощує практичну роботу із ними. 

Мікропроцесорний "напрямок":

вівторок, 10 жовтня 2017 р.

Література до принципів організації комп'ютера -- книги

Взято тут.
Один із курсів, що викладаю в УКУ -- "Принципи організації комп'ютера". Він складається із двох частин. Перша присвячена елементарним блокам комп'ютера, від способів представлення даних -- чисел та тексту, до простих логічних елементів, мультиплексорів, тригерів та защібок, з яких будуються блоки пам'яті, арифметичні та арифметично-логічні (ALU) модулі тощо. Друга -- програмуванню простих обчислювальних систем без допомоги операційної системи -- так-би мовити, bare metal. 
На жаль, через обмеження часу, в цьому курсі доводиться користуватися такою собі логарифмічною шкалою -- стрибати між рівнями абстракцій, не заповнюючи проміжки щільно. Після арифметичних модулів, мінімалістичних блоків пам'яті та оглядом функціонування ALU зразу слідує bare-metal програмуванням сучасних систем.

В ролі bare metal системи обрано демоплату на базі мікроконтролера STM32 -- з одного боку, це цілком серйозний 32-бітний процесор, із 4Гб адресним простором, перериваннями із підтримкою пріоритету, DMA, MPU (але, на жаль, без MMU) і все таке (на противагу крихітним і простеньким AVR8), мікропроцесори. З іншого боку, у них немає великої і плутаної стандартної периферії машин на базі x86 та складнощів із кешем, суперскалярністю, перевпорядкуванням команд і т.д. "великих процесорів". (Про них говоримо в наступному курсі, але це -- окрема історія. :-). Взагалі, про STM32 в цьому блозі написано багато.

четвер, 5 жовтня 2017 р.

Зовсім просто про semihosting

Структура SemiHosting. Взято тут.
Що таке Semihosting, як його підключити і використовувати із "старим та добрим" printf(), детально описано тут: "Стандартна бібліотека C та SemiHosting (на прикладі STM32 і CoIDE)", хоча, як видно з назви, для іншого середовища розробки. Більше технічної інформації є тут: "SemiHosting без дебаггера".

А зараз опишу як ним можна скористатися із мінімальними зусиллями, так би мовити, для лінивих. :-)

Ідея наступна: існує апаратний інтерфейс для передачі даних із мікроконтролера дебаггеру. Є бажання зробити так, щоб по ньому можна було передавати текст, за допомогою звичних функцій вводу-виводу С: printf(), puts(), тощо. Як описується у згаданому вище пості, для цього слід мати реалізацію стандартної бібліотеки та надати для неї відповідні системні виклики, котрі вмітимуть передавати дані семіхостингом.
Часто із компілятором для мікроконтролера йдуть newlib чи newlib-nano, мінімалістичні реалізації стандартної бібліотеки С. Зокрема, є вона і в збірках компіляторів для MCU ARM Cortex M, тому про неї окремо можна не турбуватися. Хоча знати слід -- коли стандартні налаштування перестануть влаштовувати або просто не працюватимуть як належить.
І тут є два варіанти:
  • Із більшим контролем але і більшою морокою -- надати системні виклики самостійно, як описано за посиланням вище.
  • Скористатися готовою реалізацією, що йде разом із компілятором для наших мікроконтролерів -- ARM Cortex M.
Важливе зауваження: за використання семіхостингу, ваш код перестане працювати без під'єднаного дебаггера! Як вирішити цю проблему, див.  "SemiHosting без дебаггера".

Отож, потрібно виконати наступні кроки:
  1. Дозволити SemiHosting в дебаггері.
  2. За потреби -- додати підтримку вводу/виводу  floating-point чисел.
  3. Надати свою реалізацію системних викликів.
  4. Або використати готову їх реалізацію із підтримкою SemiHosting із GCC.
Розглянемо ці кроки детальніше. 

середу, 4 жовтня 2017 р.

Марсіанські справи -- 1

Увага, це старий текст, написаний на початку 2015-го! З того часу не мав можливості до нього повертатися, але викидати шкода, тому трішки відредагував і викладаю. 

Не маючи можливості охопити неосяжне, пишу (upd кінця 2016: на жаль, ймовірно -- писав) лише про нові місії, зокрема із марсіанських -- MSL Curiosity, MAVEN та MOM. Однак, над тим же Марсом працює багато інших (на загал -- потужніших, якщо говорити про орбітальні) станцій та, що важливіше, наукових колективів. Раніше всілякі цікавинки про них я поміщав під заголовком "Додаток до огляду Curiosity", але на додаток воно мало схоже :-) То завів окрему серію, "Марсіанські справи".

Користуючись наземними телескопами, група дослідників розрахувала ймовірну кількість води на Марсі в епоху Ноя, яка закінчилася 3.7 млрд років тому, коли Марс ще був вологим.  За їх оцінками, об'єм води складав мінімум 20 мільйонів кубічних кілометрів --- достатній, щоб  вкрити всю його поверхню шаром товщиною 140 м. Ймовірно, вона, в основному, містилася в океані, що займав помітну частину теперішньої північної півкулі (орієнтація Марсу в просторі помітно змінюється з часом!), де зараз низини. Його площа могла складати 19% поверхні планети, а глибина досягати 1.6 км.
Так міг виглядати Марс 4 млрд років тому.
(c) ESO/M. Kornmesser/N. Risinger

суботу, 12 серпня 2017 р.

Огляд (CPU) performance counters API

Схема процесора M68000. Взято тут.
Сучасні процесори надають доступ до різноманітної інформації, пов'язаної із їх роботою -- кількість кеш-промахів та кеш-попадань, кількість виконаних переходів та кількість не вгаданих branch-предиктором переходів, кількість виконаних команд різних видів і т.д. і т.п.

Звичайно, до цієї інформації можна доступатися безпосередньо -- якщо ОС надає відповідні права працювати із моделе-специфічними регістрами процесора (MSR) або є можливість завантажити відповідний драйвер. Однак, це складно -- набір регістрів прив'язаний не тільки до архітектури процесора (x86 чи ARM), але й виробника (Intel vs AMD) і конкретної моделі процесора. Код виходить дуже непортабельним, або дуже громіздким. Зате все під контролем. Детальніше про такий підхід -- див., наприклад, сайт славнозвісного Агнера Фога: "Test programs for measuring clock cycles and performance monitoring". 

Однак, розвинені ОС надають і звичайним програмам доступ до цих інструментів. Про відповідні API MS Windows трішки говорилося в попередньому пості. Для повноти коротко (дуже коротко!) розглянемо спеціалізоване API для POSIX систем -- PAPI та кросплатформову бібліотеку від Intel Processor Counter Monitor (PCM).
Як бачимо, повної кросплатформовості немає -- або тільки POSIX (з обмовками), або тільки процесори Intel, при тому -- достатньо сучасні (конкретніше -- див. далі).

неділю, 30 липня 2017 р.

Огляд інструментів трасування та профілювання багатопоточних програм

Взято тут.
Для вирішення описаних раніше задач (та багато яких інших!) існує ряд хороших готових інструментів. З тих чи інших причин вони для задачі, згаданої в попередньому пості, не підходять, зокрема -- через складність автоматизації і не завжди присутню можливість фіксувати фрагменти коду, що досліджуються. Але знати про них слід -- вони дозволяють детально, іноді -- майже інтерактивно, подивитися, як паралельна програма функціонує. Та й автоматизація, в принципі, можлива.

MS Windows - Concurrency Visualizer


Інструмент, власне, візуалізації роботи багатопоточної програми. Може використовуватися як додаток до Visual Studio або самостійно.


понеділок, 24 липня 2017 р.

Вимірювання часу роботи коду

Взято тут.
Для одного дослідження виникла потреба заміряти час виконання шматків програми. При чому -- різних програм, включаючи багатопоточні, які виконуватимуться на різних архітектурах, із різними процесорами.

Задача ця виявилася далеко не тривіальною. Сучасний процесор -- дуже складний пристрій. Який працює із складно організованою пам'яттю -- кеші, NUMA, інші жахіття. А на ньому виконується жахливо складна операційна система.

Однак, задачу таки треба вирішувати. Що важливо -- профайлери, на жаль, не дуже підходять, через необхідність дослідити час виконання певного шматка коду -- достатньо великого, але не цілої програми. Точніше -- десятків програм на різних мовах. Добування потрібної інформації із профілів -- чи не складніша задача, за самостійне вимірювання.

Спробую тут дати короткий огляд підходів. Він не претендує на вичерпність -- це надміру складна та велика сфера, хоча принаймні згадати - де дивитися для глибшого ознайомлення, старатимуся.

Отож, задача: є багатопоточна програма, слід виміряти час виконання її фрагменту, тривалість роботи якого складатиме між секундами і хвилинами.

понеділок, 27 лютого 2017 р.

Проста бібліотека для роботи з гігрометрами DHT11 і DHT22

Приклад виміру.
В попередньому пості ми розглянули трішки нетипові для цього блогу пристрої -- гігрометри. Наведу також приклад коду для роботи із ними. На жаль, код доволі примітивний -- зроблений на явних затримках. Значно елегантнішим було б зробити скінчений автомат на перериваннях. Однак, як завжди, часу жахливо забракло, усвідомив -- якщо буду чекати, поки допишу, то опублікую добре якщо в цьому році. То викладаю, як є -- в ролі "технологічної демонстрації", хай і неелегантної. 

Цей пост цілком може швидко застаріти -- майте на увазі.

Огляд  та використання

Бібліотека:
  • Дозволяє під'єднувати довільну кількість гігрометрів -- поки вистачить пінів.
  • Як і попередня бібліотечка для LCD5110, ця -- повністю динамічна, єдиний необхідний пристрою пін задається при ініціалізації. (Зі всіма плюсами і мінусами такого підходу. Обговорення див. у пості за посиланням вище, у розділі "Технічні подробиці").
  • Потребує мікросекундні таймери та можливість вимірювати мікросекундні інтервали. Вона користується кодом, запропонованим тут: "Мікросекундні затримки та відлік мікросекунд для STM32".
  • Сама бібліотека складається із двох файлів, dhtxx.h і dhtxx.c.
  • Поки -- чисто С-на бібліотека.
Скачати бібліотеку можна тут. Архів включає бібліотечку для роботи із мікросекундними інтервалами, але вважає, що в проекті є файл gpio.h, згенерований STM32CubeMX.

понеділок, 23 січня 2017 р.

Гігрометри DHT11 і DHT22

DHT11 та DHT22.
Фото взято тут.
Згадані в назві сенсори користуються певною популярністю поміж любителів. Вони мають терпимі параметри, прості в роботі та зовсім дешеві (на ebay -- менше долара перший, 2.7$ -- другий). Правда, відносно повільні та, іноді, капризні.

При тому, хоча вся інформація про них в мережі є, але вона розсіяна по купі різних місць, а більшість даташітів взагалі китайською, іноді із перекладом у вигляді "підстрочника".  Так що, вирішив і я приєднатися до цього інформаційного хаосу. :-)
Скачати згадані даташіти, накопані на просторах Інтернету, можна тут.

Отож,  DHT11 і DHT22 міряють відносну вологість та температуру. Загальні характеристики:

понеділок, 9 січня 2017 р.

Дисплей Nokia 5110 на контролері PCD8544 - бібліотека для STM32

За мотивами попереднього поста, написав бібліотечку для роботи із ним за допомогою STM32. Бібліотека ще зовсім сира, але нею вже можна користуватися. В подальшому її код знаходитиметься на Github, але поки прикріпляю архівом. Опис нижче орієнтується на System Workbench for STM32 та STM32F3Discovery, хоча ні те ні те не є принциповим.

Увага! Так як бібліотека мала б розвиватися, дана стаття може доволі швидко застаріти. Але гарантій не дам. :-)

Огляд 

В списку нижче, цифрами вказано номери виносок, розшифрованих в технічних подробицях. Отож, бібліотека:
  • Дозволяє під'єднувати довільну кількість дисплеїв (1).
  • Підтримує вивід тексту: окремих літер, С-стрічок,  чисел, та стрічок, форматованих у стилі printf() (2).
  • Підтримує вивід довільних прямих. (5)
  • Вміє виводити прямокутники, зокрема -- заповнені. (5)
  • Вивід може відбуватися як "білими", так і чорними пікселями.
  • Надає доступ до всіх режимів дисплею та безпосереднього керування його параметрами.
  • На кожному дисплеї може використовуватися декілька незалежних вікон. Із кожним вікном пов'язаний свій "графічний" курсор, який задає лівий верхній кут виводу наступної літери (3).
  • Для кожного дисплея підтримує свій "відео"-буфер, котрий при оновленнях передається на пристрій для відображення.
  • Шрифт вкомільовується в код, моноширинний, але розмір символу не фіксується бібліотекою (4). 
  • У шрифті по замовчуванню підтримується кирилиця -- українська та російська. Кодування -- ASCII + CP1251.
  • На жаль, автоматично генерованої документації в коді ще немає. Планується. Поки дивіться код та користуйтеся цим постом. 

неділю, 8 січня 2017 р.

Дисплей Nokia 5110 на контролері PCD8544 - огляд

Власне, LCD Nokia 5110.
Фото звідси, там же можна зразу й
купити, хоча в китайців - дешевше.
Часто доводиться стикатися із цим симпатичним, хоч і зовсім простеньким, дисплеєм, нарешті вирішив описати, як він працює та як його програмувати.

Називають його Nokia 5110, за іменем телефону, де використовувався (також його використовувала Nokia 3310).  У ньому використано контролер дисплея Philips PCD8544.

Для визначеності, розглядатимемо на прикладі китайського модуля, типу того, що на фото праворуч. Adafruit стверджує, що самі дисплеї більше не випускаються -- в продажу старі запаси, але зріє в мене підозра, що китайці їх таки виготовляють потроху.