Got serial+processing multitasking on freertos working

This commit is contained in:
NaifBanana
2026-10-21 12:42:10 -05:00
parent eaf0b686ab
commit 68b5399f53
3 changed files with 105 additions and 3 deletions
+3 -3
View File
@@ -51,7 +51,7 @@ add_compile_definitions(configTICK_CORE=0)
# )
add_subdirectory(./Blinky)
add_subdirectory(./Listener)
add_subdirectory(./Yeller)
add_subdirectory(./Talky)
# add_subdirectory(./Listener)
# add_subdirectory(./Yeller)
+19
View File
@@ -0,0 +1,19 @@
cmake_minimum_required(VERSION 3.5.0)
set(APP_NAME "Talky")
add_executable(${APP_NAME}
./main.c
)
target_link_libraries(${APP_NAME} LINK_PUBLIC
pico_stdlib
FreeRTOS-Kernel
FreeRTOS-Kernel-Heap4
)
pico_enable_stdio_usb(${APP_NAME} 1)
pico_enable_stdio_uart(${APP_NAME} 0)
pico_add_extra_outputs(${APP_NAME})
+83
View File
@@ -0,0 +1,83 @@
#include <stdio.h>
#include <string.h>
#include <pico/stdlib.h>
#include "FreeRTOS.h"
#include <queue.h>
#include <task.h>
#define BUFFER_SIZE 256
char NULLCHAR = 0x0;
QueueHandle_t MESSAGES = NULL;
void vReadSerial(void* params) {
// Setup
MESSAGES = xQueueCreate(4, BUFFER_SIZE); // Message queue
unsigned int len = 0; // Buffer ptr
int ret;
char ret_char;
char* buffer = pvPortMalloc(BUFFER_SIZE * sizeof(char));
// start loop
while(true) {
ret = getchar_timeout_us(0);
if(ret != PICO_ERROR_TIMEOUT) {
// If returned char exists, or...
ret_char = (char)ret;
if (ret_char & 0xE0) {
// If char is printable, echo it, copy to buffer, and increment ptr
printf("%c", ret_char);
memcpy(buffer+len*sizeof(char), &ret_char, sizeof(char));
len++;
} else if (len) {
// Otw, and if buffer is not empty, check special chars
switch(ret_char) {
// Backspace
// "Delete" char, ie decrement ptr
case 8:
len--;
break;
// CR, LF
// Send message to queue with null char and reset ptr
case 10:
case 13:
memcpy(buffer+len*sizeof(char), &NULLCHAR, sizeof(char));
xQueueSendToBack(MESSAGES, buffer, 50);
printf("\n");
len = 0;
break;
// Otw do nothing
default:
break;
};
}
}
}
}
void vProcessMessages(void* params) {
// Wait for queue to be intialized
while(true) {
if (MESSAGES != NULL) { break; }
}
char* command = pvPortMalloc(BUFFER_SIZE * sizeof(char));
while(MESSAGES != NULL) {
if (xQueueReceive(MESSAGES, command, 50)) {
printf("Recieved message: ");
printf("%s\n", command);
}
}
}
void main() {
stdio_init_all();
busy_wait_ms(1000);
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
xTaskCreate(vReadSerial, "Read serial", 128, NULL, 1, NULL);
xTaskCreate(vProcessMessages, "Process messages", 128, NULL, 1, NULL);
vTaskStartScheduler();
}