При отладке я вывожу диагностику в консольку посредством функции printf с помощью semihosting'а. Я честно переопределил тамошний PrintChar, вставив туда SH_SendChar, и теперь оно как-то работает.
Одна беда: вывод, зараза, буферизован. И пока там не наберётся 16, что ли, символов, ничегошеньки он не выведет. И даже если строка длинная, то он выведет только число символов, кратное 16. А остатки строки будут ждать, пока буфер переполнится.
Когда же я пытаюсь делать fflush(stdout), то у меня происходит нехорошее.
Код
GCC HOME: C:\Program Files (x86)\GNU Tools ARM Embedded\5.2 2015q4\bin
compile:
[mkdir] Created dir: C:\CooCox\CoIDE\workspace\MegaProj\megaproj\Debug\bin
[mkdir] Created dir: C:\CooCox\CoIDE\workspace\MegaProj\megaproj\Debug\obj
[cc] 10 total files to be compiled.
[cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -Wall -ffunction-sections -g -O0 -c -DSTM32F407VG -DSTM32F4XX -DUSE_STDPERIPH_DRIVER -D__ASSEMBLY__ -IC:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib\include -IC:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib -IC:\CooCox\CoIDE\workspace\MegaProj\cmsis -IC:\CooCox\CoIDE\workspace\MegaProj -IC:\CooCox\CoIDE\workspace -IC:\CooCox\CoIDE\workspace\MegaProj\semihosting -IC:\CooCox\CoIDE\workspace\MegaProj\cmsis_boot C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c C:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib\source\stm32f4xx_usart.c C:\CooCox\CoIDE\workspace\MegaProj\cmsis_boot\startup\startup_stm32f4xx.c C:\CooCox\CoIDE\workspace\MegaProj\main.c C:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib\source\stm32f4xx_rcc.c C:\CooCox\CoIDE\workspace\MegaProj\stdio\printf.c C:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib\source\stm32f4xx_gpio.c C:\CooCox\CoIDE\workspace\MegaProj\semihosting\sh_cmd.s C:\CooCox\CoIDE\workspace\MegaProj\cmsis_boot\system_stm32f4xx.c C:\CooCox\CoIDE\workspace\MegaProj\syscalls\syscalls.c
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c:27:7: warning: array subscript has type 'char' [-Wchar-subscripts]
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c: In function 'SH_SendChar':
[cc] g_buf[g_buf_len++] = ch;
[cc] ^
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c:28:7: warning: array subscript has type 'char' [-Wchar-subscripts]
[cc] g_buf[g_buf_len] = '\0';
[cc] ^
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c: In function 'SH_SendString':
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c:47:6: warning: unused variable 'j' [-Wunused-variable]
[cc] int j;
[cc] ^
[cc] Starting link
[cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -g -nostartfiles -Wl,-Map=MegaProj.map -O0 -Wl,--gc-sections -LC:\CooCox\CoIDE\configuration\ProgramData\MegaProj -Wl,-TC:\CooCox\CoIDE\configuration\ProgramData\MegaProj/arm-gcc-link.ld -g -o MegaProj.elf ..\obj\semihosting.o ..\obj\stm32f4xx_usart.o ..\obj\startup_stm32f4xx.o ..\obj\main.o ..\obj\stm32f4xx_rcc.o ..\obj\printf.o ..\obj\stm32f4xx_gpio.o ..\obj\sh_cmd.o ..\obj\system_stm32f4xx.o ..\obj\syscalls.o
[cc] c:/program files (x86)/gnu tools arm embedded/5.2 2015q4/bin/../lib/gcc/arm-none-eabi/5.2.1/../../../../arm-none-eabi/lib/armv7e-m\libg.a(lib_a-impure.o):(.data._impure_ptr+0x0): multiple definition of `_impure_ptr'
[cc] ..\obj\printf.o:(.data+0x428): first defined here
[cc] collect2.exe: error: ld returned 1 exit status
BUILD FAILED
Total time: 2 seconds
compile:
[mkdir] Created dir: C:\CooCox\CoIDE\workspace\MegaProj\megaproj\Debug\bin
[mkdir] Created dir: C:\CooCox\CoIDE\workspace\MegaProj\megaproj\Debug\obj
[cc] 10 total files to be compiled.
[cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -Wall -ffunction-sections -g -O0 -c -DSTM32F407VG -DSTM32F4XX -DUSE_STDPERIPH_DRIVER -D__ASSEMBLY__ -IC:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib\include -IC:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib -IC:\CooCox\CoIDE\workspace\MegaProj\cmsis -IC:\CooCox\CoIDE\workspace\MegaProj -IC:\CooCox\CoIDE\workspace -IC:\CooCox\CoIDE\workspace\MegaProj\semihosting -IC:\CooCox\CoIDE\workspace\MegaProj\cmsis_boot C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c C:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib\source\stm32f4xx_usart.c C:\CooCox\CoIDE\workspace\MegaProj\cmsis_boot\startup\startup_stm32f4xx.c C:\CooCox\CoIDE\workspace\MegaProj\main.c C:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib\source\stm32f4xx_rcc.c C:\CooCox\CoIDE\workspace\MegaProj\stdio\printf.c C:\CooCox\CoIDE\workspace\MegaProj\cmsis_lib\source\stm32f4xx_gpio.c C:\CooCox\CoIDE\workspace\MegaProj\semihosting\sh_cmd.s C:\CooCox\CoIDE\workspace\MegaProj\cmsis_boot\system_stm32f4xx.c C:\CooCox\CoIDE\workspace\MegaProj\syscalls\syscalls.c
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c:27:7: warning: array subscript has type 'char' [-Wchar-subscripts]
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c: In function 'SH_SendChar':
[cc] g_buf[g_buf_len++] = ch;
[cc] ^
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c:28:7: warning: array subscript has type 'char' [-Wchar-subscripts]
[cc] g_buf[g_buf_len] = '\0';
[cc] ^
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c: In function 'SH_SendString':
[cc] C:\CooCox\CoIDE\workspace\MegaProj\semihosting\semihosting.c:47:6: warning: unused variable 'j' [-Wunused-variable]
[cc] int j;
[cc] ^
[cc] Starting link
[cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -g -nostartfiles -Wl,-Map=MegaProj.map -O0 -Wl,--gc-sections -LC:\CooCox\CoIDE\configuration\ProgramData\MegaProj -Wl,-TC:\CooCox\CoIDE\configuration\ProgramData\MegaProj/arm-gcc-link.ld -g -o MegaProj.elf ..\obj\semihosting.o ..\obj\stm32f4xx_usart.o ..\obj\startup_stm32f4xx.o ..\obj\main.o ..\obj\stm32f4xx_rcc.o ..\obj\printf.o ..\obj\stm32f4xx_gpio.o ..\obj\sh_cmd.o ..\obj\system_stm32f4xx.o ..\obj\syscalls.o
[cc] c:/program files (x86)/gnu tools arm embedded/5.2 2015q4/bin/../lib/gcc/arm-none-eabi/5.2.1/../../../../arm-none-eabi/lib/armv7e-m\libg.a(lib_a-impure.o):(.data._impure_ptr+0x0): multiple definition of `_impure_ptr'
[cc] ..\obj\printf.o:(.data+0x428): first defined here
[cc] collect2.exe: error: ld returned 1 exit status
BUILD FAILED
Total time: 2 seconds
P.S. Да, пока что я обхожусь костылём, прописывая в конце каждой выводимой строки 16 пробелов, но это явно не лучший вариант.
P.P.S. Настройки проекта:
Нажмите для просмотра прикрепленного файла
P.P.P.S. Код main.c:
Код
#include <stdio.h>
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_rcc.h>
const char* terminator = " \r\n"; // More than 16 symbols to overload the buffer ^_^
int main(void)
{
// setbuf(stdout, NULL);
printf("Hello World!%s", terminator);
// fflush(stdout);
while(1)
{
printf("Oy vey!%s", terminator);
fflush(stdout);
}
}
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_rcc.h>
const char* terminator = " \r\n"; // More than 16 symbols to overload the buffer ^_^
int main(void)
{
// setbuf(stdout, NULL);
printf("Hello World!%s", terminator);
// fflush(stdout);
while(1)
{
printf("Oy vey!%s", terminator);
fflush(stdout);
}
}
P.P.P.P.S. Код PrintChar в printf.c:
Код
void PrintChar(char c)
{
SH_SendChar(c);
}
{
SH_SendChar(c);
}