Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32: как бы мне отключить буферизацию вывода?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Я.К.
Есть у меня проект под STM32F4, написанный на C. Ну как проект — болванка с helloworld'ом.

При отладке я вывожу диагностику в консольку посредством функции 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



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);
    }
}


P.P.P.P.S. Код PrintChar в printf.c:
Код
void PrintChar(char c)
{
    SH_SendChar(c);
}
smalcom
Добавьте в конце выводимой строки "\r\n".
Я.К.
Цитата(smalcom @ Feb 12 2016, 23:29) *
Добавьте в конце выводимой строки "\r\n".


Пробовал. Без толку.
johnshadow
Посмотрите на функцию SH_SendChar. В кокосе она такая:

Код
static char g_buf[16];
static char g_buf_len = 0;
...
void SH_SendChar(int ch) {
    g_buf[g_buf_len++] = ch;
    g_buf[g_buf_len] = '\0';
    if (g_buf_len + 1 >= sizeof(g_buf) || ch == '\n' || ch == '\0') {
        g_buf_len = 0;
        /* Send the char */
        if (SH_DoCommand(0x04, (int) g_buf, NULL) != 0) {
            return;
        }
    }
}


Т.е. символы изначально попадают в буфер, а непосредственно вывод осуществляется по одному из условий:
- буфер заполнен, т.е. в нем 16 символов (включая нулевой байт, который добавляется автоматом)
- поступил символ \n ("перевод строки")
- поступил нулевой байт

Т.ч. если она у вас такая же, то поправьте саму функцию или инициируйте вывод передачей \0 или \n. Но вывод станет медленнее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.