저는 Arduino 대신 Arduino 부트 로더를 사용하기는하지만, 이 아닌 ATmega328p에서 실행되는 프로그램을 작성하고 있습니다. 그래도).avr-libc의 fprintf()가 즉시 충돌합니다.
는 I는 희망 명백한 방식으로 UART에 쓸 stdout
을 설정 한 :
void uart_putc(char c)
{
// Turn LFs into CRLFs
if(c == '\n')
uart_putc('\r');
while(!(UCSR0A & _BV(UDRE0)))
;
UDR0 = c;
}
static int _putc(char c, FILE *_)
{
uart_putc(c);
return 0;
}
...
fdev_setup_stream(stdout, &_putc, NULL, _FDEV_SETUP_WRITE);
나는 이제 fputc
및 fputs
모든 작품을 잘 사용하여 내 프로그램을 작성합니다. snprintf()
을 호출하여 서식이 지정된 문자열을 char buffer[16]
으로 렌더링 한 다음 fputs()
으로 렌더링 할 수도 있습니다. 이 모든 것들이 잘 작동합니다.
fputs("Hello, world\n", stdout); /* works fine */
char buffer[16];
snprintf(buffer, sizeof buffer, "Hello, %s\n", "world");
fputs(buffer, stdout); /* also works fine */
그러나, 순간 나는 ATMEGA를 진정한 fprintf()
stdout
에 프로그램이 충돌을 수행하려고하고 재부팅 :
fprintf(stdout, "Hello, %s\n", "world");
심지어 여기에 초기 H
를 출력하기 전에 즉시 충돌합니다.
누구나 누락 될 수있는 것을 제안 할 수 있습니까? snprintf()
과 fputs()
모두 잘 작동하면 fprintf()
이 작동하지 않을 수 있습니까?
실행할 수있는 디버거가있는 시뮬레이터가 있는지 확인할 수 있습니다. –
'fprintf'에 들어가서 크래시가 발생할 때까지 해체를 '걸음'합니다. 그런 다음 다시 실행하고 충돌을 유발하는 명령을 실행하기 직전에 레지스터보기를 열고 모든 레지스터를 복사 한 다음 여기에 게시하십시오. 또한 충돌을 일으키는 지침을 게시하십시오. 이것은 중요한 정보를 우리에게 제공 할 수 있습니다. BTW, 당신은'fputs'와 똑같이 할 수 있고, 하나가 어떻게 작동하고 다른 하나는 작동하지 않는지 스스로를 볼 수 있습니다. –
printf 함수와 관련된 충돌로 인해 스택 오버플로가 발생합니다. 스택 크기를 늘려보십시오. – kkrambo