Просмотр исходного кода

Implement transparent printf support

Vadim Kaushan 5 лет назад
Родитель
Сommit
d39d2265e3
3 измененных файлов с 35 добавлено и 2 удалено
  1. 33 2
      core/tty_uart.c
  2. 1 0
      target_f1/Inc/FreeRTOSConfig.h
  3. 1 0
      target_f2/Inc/FreeRTOSConfig.h

+ 33 - 2
core/tty_uart.c

@@ -1,3 +1,5 @@
+#define _GNU_SOURCE
+#include <stdio.h>
 #include "furi.h"
 #include "main.h"
 
@@ -7,14 +9,43 @@ void handle_uart_write(const void* data, size_t size, void* ctx) {
 	HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)data, (uint16_t)size, HAL_MAX_DELAY);
 }
 
+static ssize_t stdout_write(void *_cookie, const char *buf, size_t n) {
+    FuriRecordSubscriber *log = pvTaskGetThreadLocalStoragePointer(NULL, 0);
+    if (log == NULL) {
+        log = furi_open("tty", false, false, NULL, NULL, NULL);
+        vTaskSetThreadLocalStoragePointer(NULL, 0, log);
+    }
+    if (buf == 0) {
+        /*
+         * This means that we should flush internal buffers.  Since we
+         * don't we just return.  (Remember, "handle" == -1 means that all
+         * handles should be flushed.)
+         */
+        return 0;
+    }
+
+    furi_write(log, buf, n);
+
+    return n;
+}
+
 bool register_tty_uart() {
 	if(!furi_create("tty", NULL, 0)) {
 		return false;
 	}
-	
+
 	if(furi_open("tty", false, false, handle_uart_write, NULL, NULL) == NULL) {
 		return false;
 	}
 
+    FILE* fp = fopencookie(NULL, "w+", (cookie_io_functions_t) {
+        .read = NULL,
+        .write = stdout_write,
+        .seek = NULL,
+        .close = NULL,
+    });
+    setvbuf(fp, NULL, _IONBF, 0);
+    stdout = fp;
+
 	return true;
-}
+}

+ 1 - 0
target_f1/Inc/FreeRTOSConfig.h

@@ -68,6 +68,7 @@
 #define configQUEUE_REGISTRY_SIZE                8
 #define configUSE_PORT_OPTIMISED_TASK_SELECTION  1
 #define configUSE_COUNTING_SEMAPHORES			 1
+#define configNUM_THREAD_LOCAL_STORAGE_POINTERS  1
 
 /* Co-routine definitions. */
 #define configUSE_CO_ROUTINES                    0

+ 1 - 0
target_f2/Inc/FreeRTOSConfig.h

@@ -68,6 +68,7 @@
 #define configQUEUE_REGISTRY_SIZE                8
 #define configUSE_PORT_OPTIMISED_TASK_SELECTION  1
 #define configUSE_COUNTING_SEMAPHORES			 1
+#define configNUM_THREAD_LOCAL_STORAGE_POINTERS  1
 
 /* Co-routine definitions. */
 #define configUSE_CO_ROUTINES                    0