четвер, 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.
Розглянемо ці кроки детальніше.