STM32 직렬 printf 출력 디버그 정보 문제
2249 단어 STM32
By Sky.J 2018.06.01
1, 문제 발생(HAL 라이브러리 사용)
STM32 , printf , , :
UART_HandleTypeDef husart_printf;
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART2 and Loop until the end of transmission */
HAL_UART_Transmit(&husart_printf, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
프로그램이 편집되었는데, 메시지는 직렬로 출력할 수 있을 줄 알았는데, 프로그램 아래에 들어가서 직렬로 출력되지 않았다. 이것은 이상하다. 설마 위의 방향을 바꾸는 부분이 옳지 않은 것입니까?
2, 문제를 찾아 인터넷에서 검색하고 반 호스트 모델과 같은 모델을 발견한다.반호스트는 이런 메커니즘으로 ARM 목표에서 뛰는 코드를 만들 수 있다. 만약에 호스트 컴퓨터가 디버깅/모방기를 실행한다면 이 코드는 이 호스트 컴퓨터의 입력과 출력 장치를 사용할 수 있다. 즉, 호스트 컴퓨터의 외부 장치를 직접 사용하여 입력과 출력 디버깅을 실현할 수 있다. ARM 목표 부품의 외부 장치를 사용하는 입력과 출력 장치가 아니다.간단하게 말하면 반 호스트는 시뮬레이터에 의존해야만 출력 디버깅 정보를 입력할 수 있다.그러나 우리는 단편기의 직렬 외부 장치를 사용한다. 즉, 모의기를 사용하지 않는다면, 우리는 반드시 반 호스트 모드를 비활성화해야 한다.
3. 문제 해결
위에서 이해한 바와 같이 printf ()와 같은 함수는 반 호스트 모드를 사용했다는 것을 알 수 있다. 우리는 이제 반 호스트 모드에서 printf를 사용하지 않으면 문제를 해결할 수 있다.
해결 방법 1: 마이크로 라이브러리 마이크로 LIB를 사용한다. 마이크로 LIB는 C99 표준 라이브러리의 마이크로 축소판으로 마이크로 라이브러리라고 약칭한다. 마이크로 라이브러리를 사용하면 반 호스트 모드를 사용하지 않기 때문에 디버깅 정보를 정상적으로 실행하고 출력할 수 있다.keil5 프로그래밍을 사용할 때 설정에서 Use MicroLIB를 선택하면 됩니다. MicroLIB에 대한 자세한 정보는 스스로 검색할 수 있습니다.
해결 방법 2: 표준 라이브러리를 사용하지만 반호스트 모드를 사용하지 않습니다. 이 방법은 주 프로그램 뒤에 다음과 같은 코드를 추가하면 됩니다.
#pragma import(__use_no_semihosting)
int _sys_exit(int x)
{
x = x;
}
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
__use_no_semihosting_swi, 즉 반호스트 모드를 사용하지 않습니다. 프로그램에서 이러한 함수의 밑바닥을 실현하지 않았기 때문에 장치가 실행될 때 소프트웨어가 중단된BAEB에 들어갈 수 있습니다. 이때use_no_semihosting_swi 이 성명은 프로그램이 이 파일들의 조작 함수를 만났을 때 이 인터럽트에서 멈추지 않도록 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
STM32CubeIDE를 사용해 보자 How To STM32CubeIDE 일본어판 (11) I2C를 사용해 보자 4 Si7020+ssd1306편STM32CubeIDE를 사용해 보자 How To STM32CubeIDE 일본어판 (10) I2C를 사용해 보자 3 ssd1306편의 계속입니다. Nucleo 보드와 Si7020, SSD1306을 연결합니다. 이번에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.