Semihosting является таким механизмом, таким образом, что целевой работать на ARM коде, если хост - компьютер работает отладчик, то код может использовать устройство ввода и вывод хоста - компьютер.
Это важно, потому что на ранней стадии развития, она может быть разработчики не знают , какие устройства ввода и вывода на подлокотнике устройств, в то время как полу-основной базой механизм , так что вы не знаете , периферийные устройства ARM устройств, использование входных периферийных хост - компьютера может быть достигнуто отладочный вывод.
Таким образом, использование устройств ввода и вывода на ARM целевого устройства, выключить первый половину механизмов хозяина. O перенаправлены на ARM устройства, такие как Printf и Scanf, и вам необходимо переопределить функцию fputc fgetc. Вот Printf и зсапЕ перенаправлены на UART код.
из fputc INT (INT CH, файл * F)
{
это время (USART_GetFlagStatus (The USART1, USART_FLAG_TC) == СБРОС)
{
}
USART_SendData (The USART1, (uint8_t) СН);
возврата СН;
}
Int fgetc (файл * F)
{
INT CH;
это время (USART_GetFlagStatus (The USART1, USART_FLAG_RXNE) == СБРОС)
{
}
СН = USART_ReceiveData (The USART1);
это время (USART_GetFlagStatus (The USART1, USART_FLAG_TC) == СБРОС)
{
}
USART_SendData (The USART1, (uint8_t) СН);
возврата СН;
}
в Printf функция () или тому подобное, используя режим полу-хоста. Используйте стандартную библиотеку заставят программу не запускать, следующий обходной путь:
1. Использование микро-библиотеки, потому что использование микро-библиотеки, она не будет использовать режим половинного хоста.
Если вы используете MDK, пожалуйста «Target» Свойства проекта - проверка в «» Code Generation «» Использовать MicroLIB " , так что позже вы можете
использовать Printf, Sprintf функцию
метода 2 по- прежнему использовать стандартную библиотеку, добавьте следующую строку в основной программе Код:
/ * чтобы гарантировать , что ни одна из функций , которые используют semihosting библиотеки C из ссылки, потому что они не используют половину хозяина, некоторые из стандартного с использованием библиотекой stdio.h semihosting
функции, чтобы переписать, вы должны предоставить собственную реализацию этих функций * /
импорт #pragma (__ use_no_semihosting) // чтобы не использовать половину связи хоста из функций библиотеки C
_sys_exit (INT х) // определить _sys_exit () для того , чтобы избежать использования режима полу-хоста
{
X = X;
}
STRUCT // стандартная библиотека требует __FILE опорная функция
{
INT ручка;
};
/ * Файл будет ЬурейеЕ «в stdio.h D * /.
в файле __stdout;
В отдельном приложении, вы вряд ли поддержат semihosting операции. Таким образом, вы должны убедиться , что ваше приложение не связывает библиотеки С semihosting функции.
Для того, чтобы убедиться , что функция не использует semihosting библиотеки C по ссылке, вы должны импортировать символ __use_no_semihosting. Может быть выполнена в любой из ваших C или исходный ассемблерный файл проекта этой операции следующим образом :
В модуле C, используя директиву #pragma:
#pragma Import (__ use_no_semihosting)
в модуле ассемблера, используйте директиву ИМПОРТ:
ИМПОРТ __use_no_semihosting
если до сих пор ссылаются функция использует semihosting, компоновщик выдает сообщение об ошибке.
----------------
Предупреждение: Данная статья является оригинальной статьи CSDN блоггеры «Robben.Han» и следовать CC 4.0 BY-SA авторского соглашения, воспроизведены, пожалуйста , приложите оригинал и ссылки это утверждение.
Оригинальная ссылка: https: //blog.csdn.net/hxlawf/article/details/89491088