Challenge

Project 1 - Implement a fully functional Queue in C language using Linked lists

An IMU has two sensors:

  • Accelerometer
  • Gyroscope

Integrate the IMU with the development board and classify the data coming from the accelerometer and gyroscope. Send the data from respective sensors on “Separate Queues” to a particular task. This task will identify which source is sending the data using “queue sets” and transfer the data to the respective UART channel.

To integrate the IMU (Inertial Measurement Unit) with a development board and implement the described functionality, you would typically need to use a microcontroller or a development board with sufficient GPIO pins, UART channels, and programming capabilities. Below is a conceptual example using a hypothetical microcontroller and assuming you're programming in a language like C.

First, let's outline the steps:

1. Initialize the accelerometer and gyroscope sensors.

2. Set up separate queues for accelerometer and gyroscope data.

3. Create a task to handle the incoming data from both sensors.

4. Identify the source of the data using queue sets.

5. Transfer the data to the respective UART channels.

Here's how you might implement this:

#include <stdio.h>

#include <stdint.h>

#include "your_imu_library.h" // Your IMU library

#include "your_uart_library.h" // Your UART library

#include "your_os_library.h" // Your operating system library (e.g., FreeRTOS)

#define ACCELEROMETER_QUEUE_LENGTH 10

#define GYROSCOPE_QUEUE_LENGTH 10

QueueHandle_t accelerometerQueue;

QueueHandle_t gyroscopeQueue;

void IMU_Task(void *pvParameters) {

while (1) {

// Read data from accelerometer

AccelerometerData acc_data = read_accelerometer();

// Send accelerometer data to its queue

xQueueSend(accelerometerQueue, &acc_data, portMAX_DELAY);

// Read data from gyroscope

GyroscopeData gyro_data = read_gyroscope();

// Send gyroscope data to its queue

xQueueSend(gyroscopeQueue, &gyro_data, portMAX_DELAY);

}

}

void DataProcessingTask(void *pvParameters) {

while (1) {

// Wait for data from either accelerometer or gyroscope queues

QueueSetMemberHandle_t triggered_queue;

triggered_queue = xQueueSelectFromSet(accelerometerQueue, gyroscopeQueue, portMAX_DELAY);

// Determine the source of data and read from the respective queue

if (triggered_queue == accelerometerQueue) {

AccelerometerData acc_data;

xQueueReceive(accelerometerQueue, &acc_data, portMAX_DELAY);

// Send accelerometer data to UART

send_data_to_uart(acc_data);

} else if (triggered_queue == gyroscopeQueue) {

GyroscopeData gyro_data;

xQueueReceive(gyroscopeQueue, &gyro_data, portMAX_DELAY);

// Send gyroscope data to UART

send_data_to_uart(gyro_data);

}

}

}

int main() {

// Initialize IMU

initialize_IMU();

// Create queues

accelerometerQueue = xQueueCreate(ACCELEROMETER_QUEUE_LENGTH, sizeof(AccelerometerData));

gyroscopeQueue = xQueueCreate(GYROSCOPE_QUEUE_LENGTH, sizeof(GyroscopeData));

// Create tasks

xTaskCreate(IMU_Task, "IMU_Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

xTaskCreate(DataProcessingTask, "DataProcessingTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

// Start scheduler

vTaskStartScheduler();

// Should never reach here

return 0;

}

This code sets up two separate queues for the accelerometer and gyroscope data. The IMU task continuously reads data from both sensors and sends them to their respective queues. The data processing task waits for data from either queue using `xQueueSelectFromSet()`, determines the source of the data, and then sends it to the UART channel.

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.