В « Semihosting с Kinetis Design Studio » я использовал printf () для обмена текстом и данными между целевой платой и хостом, используя отладочное соединение. Студия дизайна Kinetis (KDS) внедрила этот полухостинг в свои библиотеки. Что делать, если использовать инструменты и библиотеки GNU ARM Embedded (launchpad) (см. « Переключение цепочки инструментов и библиотек ARM GNU в Kinetis Design Studio »)? На самом деле это требует еще двух шагов, но тоже очень просто.
Существуют три вещи, которые необходимо использовать для использования полухостинга с библиотеками GNU ARM Embedded (Launchpad):
- Опция в настройках компоновщика GNU
- Включение полухостинга в настройках отладчика
- Инициализация библиотек GNU
Опция линкера
Чтобы включить полухостинг для библиотек GNU ARM Embedded ( Launchpad ), мне нужно добавить
--specs=rdimon.specs
к параметрам компоновщика:
В случае, если я использую newlib-nano и хочу использовать printf () и / или scanf () с поддержкой плавающей запятой, мне нужно явно добавить некоторые символы с помощью параметров компоновщика ‘u’:
-u _scanf_float -u _printf_float
Настройки отладчика
В плагинах GNU ARM Eclipse мне нужно включить полухостинг.
Segger J-Link
Для Segger J-Link я включаю консоль в конфигурации запуска:
Дополнительно я включаю опции полухостинга в опциях запуска отладчика:
P & E Multilink
Для P & E используются следующие настройки:
Настройки для OpenOCD
Следующие настройки используются для OpenOCD:
Инициализация библиотек GNU
Если вы сейчас попытаетесь использовать полухостинг с запуском отладчика, вы, вероятно, получите сообщения об ошибках, подобные этому (например, от Segger J-Link):
WARNING: Semihosting command SYS_FLEN failed. Handle is 0. WARNING: Semihosting command SYS_WRITE failed. Handle is 0. WARNING: Semihosting command SYS_WRITE failed. Handle is 0. WARNING: Semihosting command SYS_WRITE failed. Handle is 0.
Причина в том, что приложение должно активировать полухостинг. Мне нужно позвонить, initialise_monitor_handles()
прежде чем я использую printf()
:
1 2 3 4 5 6 7 8 |
extern void initialise_monitor_handles( void ); /* prototype */
int main( void ) {
initialise_monitor_handles(); /* initialize handles */
for (;;) {
printf ( "hello world!\r\n" );
}
}
|
При этом я могу использовать printf () и scanf () через соединение с отладчиком.
Резюме
Хотя я не люблю printf () по многим причинам, иногда полезно обмениваться данными с хостом. При использовании полухостинга физическое соединение не требуется, так как связь происходит через отладчик. Это несколько навязчиво и добавляет накладные расходы на код и данные, но библиотеки GNU ARM Embedded (launchpad) (как newlib, так и newlib-nano) имеют встроенный полухостинг. Необходимо включить его в настройках компоновщика и отладчика и инициализировать дескрипторы в приложении.
Happy Semihosting ?