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(./Talky)
|
||||||
add_subdirectory(./Listener)
|
# add_subdirectory(./Listener)
|
||||||
add_subdirectory(./Yeller)
|
# 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