Project 1 - Implement a fully functional Queue in C language using Linked lists
PROGRAM :
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "queue_set.h"
#include "driverlib/uart.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
// Queue Handles
QueueHandle_t xQueueAccelerometer, xQueueGyroscope;
QueueSetHandle_t xQueueSet;
#define QUEUE_LENGTH 10
#define ITEM_SIZE sizeof(SensorData_t)
// Struct for sensor data
typedef struct {
float x, y, z;
} SensorData_t;
// UART output function prototype
void SendToUART(uint8_t uartBase, SensorData_t data);
void AccelerometerTask(void *pvParameters) {
SensorData_t accData;
while(1) {
// Simulate or read real data from accelerometer
accData = GetAccelerometerData();
// Send to queue
xQueueSend(xQueueAccelerometer, &accData, portMAX_DELAY);
vTaskDelay(pdMS_TO_TICKS(100)); // 10Hz sample rate
}
}
void GyroscopeTask(void *pvParameters) {
SensorData_t gyroData;
while(1) {
// Simulate or read real data from gyroscope
gyroData = GetGyroscopeData();
// Send to queue
xQueueSend(xQueueGyroscope, &gyroData, portMAX_DELAY);
vTaskDelay(pdMS_TO_TICKS(100)); // 10Hz sample rate
}
}
void QueueSetTask(void *pvParameters) {
QueueSetMemberHandle_t xActivatedMember;
SensorData_t receivedData;
while(1) {
// Wait for any queue in the set to have data
xActivatedMember = xQueueSelectFromSet(xQueueSet, portMAX_DELAY);
if (xActivatedMember == xQueueAccelerometer) {
xQueueReceive(xQueueAccelerometer, &receivedData, 0);
SendToUART(UART0_BASE, receivedData);
} else if (xActivatedMember == xQueueGyroscope) {
xQueueReceive(xQueueGyroscope, &receivedData, 0);
SendToUART(UART1_BASE, receivedData);
}
}
}
void SendToUART(uint8_t uartBase, SensorData_t data) {
char buffer[64];
snprintf(buffer, sizeof(buffer), "X:%.2f Y:%.2f Z:%.2f\n", data.x, data.y, data.z);
for (char *p = buffer; *p != '\0'; p++) {
UARTCharPut(uartBase, *p);
}
}
int main(void) {
// System and UART Init
// UARTInit(UART0_BASE);
// UARTInit(UART1_BASE);
// Create queues
xQueueAccelerometer = xQueueCreate(QUEUE_LENGTH, ITEM_SIZE);
xQueueGyroscope = xQueueCreate(QUEUE_LENGTH, ITEM_SIZE);
// Create queue set
xQueueSet = xQueueCreateSet(QUEUE_LENGTH * 2);
xQueueAddToSet(xQueueAccelerometer, xQueueSet);
xQueueAddToSet(xQueueGyroscope, xQueueSet);
// Create tasks
xTaskCreate(AccelerometerTask, "AccelTask", 128, NULL, 2, NULL);
xTaskCreate(GyroscopeTask, "GyroTask", 128, NULL, 2, NULL);
xTaskCreate(QueueSetTask, "QueueSetTask", 256, NULL, 3, NULL);
vTaskStartScheduler();
while(1);
}
OUTPUT :
