STM32 직렬 printf 출력 디버그 정보 문제

2249 단어 STM32
STM32 직렬 printf 출력 디버그 정보 문제
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 이 성명은 프로그램이 이 파일들의 조작 함수를 만났을 때 이 인터럽트에서 멈추지 않도록 합니다.

좋은 웹페이지 즐겨찾기