Challenge

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 :

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.