Got serial+processing multitasking on freertos working
This commit is contained in:
+3
-3
@@ -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)
|
||||
|
||||
|
||||
@@ -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})
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user