В « 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 |
externvoidinitialise_monitor_handles(void); /* prototype */
intmain(void) {
initialise_monitor_handles(); /* initialize handles */
for(;;) {
printf("hello world!\r\n");
}
}
|
При этом я могу использовать printf () и scanf () через соединение с отладчиком.
Резюме
Хотя я не люблю printf () по многим причинам, иногда полезно обмениваться данными с хостом. При использовании полухостинга физическое соединение не требуется, так как связь происходит через отладчик. Это несколько навязчиво и добавляет накладные расходы на код и данные, но библиотеки GNU ARM Embedded (launchpad) (как newlib, так и newlib-nano) имеют встроенный полухостинг. Необходимо включить его в настройках компоновщика и отладчика и инициализировать дескрипторы в приложении.
Happy Semihosting ?






