реклама на сайте
подробности

 
 
> STM32: как бы мне отключить буферизацию вывода?
Я.К.
сообщение Feb 12 2016, 17:51
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 4-12-08
Из: Москва
Пользователь №: 42 205



Есть у меня проект под 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);
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
smalcom
сообщение Feb 12 2016, 19:29
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Добавьте в конце выводимой строки "\r\n".
Go to the top of the page
 
+Quote Post
Я.К.
сообщение Feb 12 2016, 21:09
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 4-12-08
Из: Москва
Пользователь №: 42 205



Цитата(smalcom @ Feb 12 2016, 23:29) *
Добавьте в конце выводимой строки "\r\n".


Пробовал. Без толку.
Go to the top of the page
 
+Quote Post
johnshadow
сообщение Feb 15 2016, 07:22
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 25-09-08
Пользователь №: 40 477



Посмотрите на функцию 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. Но вывод станет медленнее.

Сообщение отредактировал johnshadow - Feb 15 2016, 07:24
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 09:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016