FINAL SUBb

 avatar
unknown
c_cpp
a year ago
13 kB
3
Indexable
#include <stdio.h>
#include <stdlib.h>
#include "diag/trace.h"
#include <stdint.h>
#include <limits.h>
#include "led.h"

/* Kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "timers.h"
#include "semphr.h"
#define CSV_FILENAME "freertos_log.csv"

// CSV header format
#define CSV_HEADER "Iteration,Total_Successful_Messages,Total_Blocked_Messages,Sent1,Blocked1,Sent2,Blocked2,Sent3,Blocked3,Avg_Tsender,Tsender1,Tsender2,Tsender3\n"

FILE *csv_file;
#include <time.h>   // Include for time operations

#define CCM_RAM __attribute__((section(".ccmram")))
#define FIXED_Receiver_Time pdMS_TO_TICKS(100)

// LED-related definitions
#define BLINK_PORT_NUMBER         (3)
#define BLINK_PIN_NUMBER_GREEN    (12)
#define BLINK_PIN_NUMBER_ORANGE   (13)
#define BLINK_PIN_NUMBER_RED      (14)
#define BLINK_PIN_NUMBER_BLUE     (15)
#define BLINK_ACTIVE_LOW          (false)

struct led blinkLeds[4];

static void prvOneShotTimerCallback(TimerHandle_t xTimer);
static void prvAutoReloadTimerCallback(TimerHandle_t xTimer);
static void vSender1TimerCallback(TimerHandle_t xTimer);
static void vSender2TimerCallback(TimerHandle_t xTimer);
static void vSender3TimerCallback(TimerHandle_t xTimer);
static void vReceiverTimerCallback(TimerHandle_t xTimer);
// Timer handles
static TimerHandle_t xTimerOneShot = NULL;
static TimerHandle_t xTimerAutoReload = NULL;
static TimerHandle_t xTimer1;
static TimerHandle_t xTimer2;
static TimerHandle_t xTimer3;
static TimerHandle_t xTimer4;
int Tsender1, Tsender2, Tsender3;
double tot3,tot2,tot1 =0;
BaseType_t xTimer1Started, xTimer2Started;

// Task and Queue handles
QueueHandle_t xQueue;
SemaphoreHandle_t xSemaphoreSender1, xSemaphoreSender2, xSemaphoreSender3, xSemaphoreReceiver;
TickType_t Treceiver = pdMS_TO_TICKS(100);
TickType_t lower_arr[6] = {50, 80, 110, 140, 170, 200};
TickType_t upper_arr[6] = {150, 200, 250, 300, 350, 400};
int sent1, sent2, sent3, block1, block2, block3;
int received_message, total_number_of_blocked_messages, total_number_of_successfully_sent_messages, upper, lower;
int iteration = -1;
int callback1, callback2, callback3;

// Uniform distribution function
int uniform_dist() {
    return (rand() % (upper - lower + 1)) + lower;
}

// Sender task functions
static void Sender1(void *parameters) {
    char ivaluetosend[50];
    BaseType_t xStatus;

    while (1) {
        xSemaphoreTake(xSemaphoreSender1, portMAX_DELAY);
        snprintf(ivaluetosend, sizeof(ivaluetosend), "Time is %lu", xTaskGetTickCount());
        xStatus = xQueueSend(xQueue, ivaluetosend, 0);
      //  trace_printf("Tsender1 :...%d\n",Tsender1);

        if (xStatus == pdPASS) {
            sent1++;
        } else {
            block1++;
        }
       // Tsender1=uniform_dist();
        	callback1++;
          tot1=tot1+Tsender1;
          xTimerChangePeriod(xTimer1, pdMS_TO_TICKS(Tsender1), 0);
          Tsender1=uniform_dist();

       // xTimerStart(xTimer1, 0);
    }
}

static void Sender2(void *parameters) {
    char ivaluetosend[50];
    BaseType_t xStatus;

    while (1) {
        xSemaphoreTake(xSemaphoreSender2, portMAX_DELAY);
        snprintf(ivaluetosend, sizeof(ivaluetosend), "Time is %lu", xTaskGetTickCount());
        xStatus = xQueueSend(xQueue, ivaluetosend, 0);
   //     trace_printf("Tsender2 :...%d\n",Tsender2);

        if (xStatus == pdPASS) {
            sent2++;
        } else {
            block2++;
        }
       // Tsender2=uniform_dist();
        	callback2++;
          tot2=tot2+Tsender2;
          xTimerChangePeriod(xTimer2, pdMS_TO_TICKS(Tsender2), 0);
          Tsender2=uniform_dist();

       // xTimerStart(xTimer2, 0);
    }
}

static void Sender3(void *parameters) {
    char ivaluetosend[50];
    BaseType_t xStatus;

    while (1) {
     //   trace_printf("Sender3: Waiting for semaphore...\n");
        xSemaphoreTake(xSemaphoreSender3, portMAX_DELAY);
     //   trace_printf("Sender3: Semaphore taken\n");
       // trace_printf("Tsender3 :...%d\n",Tsender3);
        snprintf(ivaluetosend, sizeof(ivaluetosend), "Time is %lu", xTaskGetTickCount());
        xStatus = xQueueSend(xQueue, ivaluetosend, 0);

        if (xStatus == pdPASS) {
      //      trace_printf("Sender3: Message sent successfully\n");
            sent3++;
        } else {
          //  trace_printf("Sender3: Failed to send message (queue full)\n");
            block3++;
        }
     //   Tsender3=uniform_dist();
        callback3++;
        tot3=tot3+Tsender3;
        xTimerChangePeriod(xTimer3, pdMS_TO_TICKS(Tsender3), 0);
        Tsender3=uniform_dist();

     //   xTimerStart(xTimer3, 0);
    }
}

// Receiver task function
static void Receiver(void *parameters) {
    char receivedValue[50];
    BaseType_t xStatus;

    while (1) {
        // Wait for the semaphore to be given by the timer callback
        xSemaphoreTake(xSemaphoreReceiver, portMAX_DELAY);
        // Attempt to read from the queue, wait up to Treceiver ticks if necessary
        xStatus = xQueueReceive(xQueue, &receivedValue, Treceiver);

        if (xStatus == pdPASS) {
            received_message++;
            printf("Received message: %s\n", receivedValue);
        }

        // Check if 1000 messages have been received
        if (received_message >= 1000) {
            Reset();
        }

        // Restart the receiver timer
       //  xTimerStart(xTimer4, 0);
    }
}

// Timer callback functions
void vSender1TimerCallback(TimerHandle_t xTimer) {
    xSemaphoreGive(xSemaphoreSender1);

}

void vSender2TimerCallback(TimerHandle_t xTimer) {
    xSemaphoreGive(xSemaphoreSender2);

}

void vSender3TimerCallback(TimerHandle_t xTimer) {
  //  trace_printf("I'm callback 3\n");
    xSemaphoreGive(xSemaphoreSender3);


}

void vReceiverTimerCallback(TimerHandle_t xTimer) {
   // trace_printf("I'm callback Receiver\n");
    xSemaphoreGive(xSemaphoreReceiver);
}

// Reset function
void Reset() {
    if (iteration == -1) { // Initial start
        received_message = 0;
        iteration++;
        upper = upper_arr[iteration];
        lower = lower_arr[iteration];
        Tsender1 = uniform_dist();
        Tsender2 = uniform_dist();
        Tsender3 = uniform_dist();

    } else if (iteration <= 5) {
        total_number_of_successfully_sent_messages = sent1 + sent2 + sent3;
        total_number_of_blocked_messages = block1 + block2 + block3;
        	int tavg1=tot1/callback1;
        	int tavg2=tot2/callback2;
        	int tavg3=tot3/callback3;
        	int totavg=(tavg1+tavg2+tavg3)/3;
        printf("Total Successful Messages: %d\n", total_number_of_successfully_sent_messages);
        printf("Total Blocked Messages: %d\n", total_number_of_blocked_messages);
        printf("Statistics for first lower  priority:\n");//first lower
        printf("  Total Successful Messages: %d\n", sent1);
        printf("  Total Blocked Messages: %d\n", block1);
        printf("Statistics for second lower priority:\n");
        printf("  Total Successful Messages: %d\n", sent2);
        printf("  Total Blocked Messages: %d\n", block2);
        printf("Statistics for highest   priority:\n"); //highest
        printf("  Total Successful Messages: %d\n", sent3);
        printf("  Total Blocked Messages: %d\n", block3);
        printf("  Avg Tsender: %d\n", totavg);
        printf("  avgTsender1: %d\n", tavg1);
        printf("  avgTsender2: %d\n", tavg2);
        printf("  avgTsender3: %d\n", tavg3);

        // Write data to CSV file
        fprintf(csv_file, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
                iteration,
                total_number_of_successfully_sent_messages,
                total_number_of_blocked_messages,
                sent1, block1,
                sent2, block2,
                sent3, block3,
				totavg, tavg1, tavg2, tavg3);

        fflush(csv_file); // Ensure the data is written to the file
        tavg1,tavg2,tavg3,totavg=0;
        iteration++;
        upper = upper_arr[iteration];
        lower = lower_arr[iteration];


    } else {


        printf("Game Over\n");
        fclose(csv_file);
        exit(0);
        vTaskEndScheduler();
        return;
    }

    // Reset counters
    xQueueReset(xQueue);
    total_number_of_successfully_sent_messages = 0;
    total_number_of_blocked_messages = 0;
    received_message = 0;
    sent1 = 0;
    sent2 = 0;
    sent3 = 0;
    block1 = 0;
    block2 = 0;
    block3 = 0;
}

int main() {
    trace_printf("Hello from main\n");
    srand((unsigned int)time(NULL));

    xQueue = xQueueCreate(10, sizeof(char[50]));

    if (iteration == -1) {
        Reset();
    }

    xSemaphoreSender1 = xSemaphoreCreateBinary();
    xSemaphoreSender2 = xSemaphoreCreateBinary();
    xSemaphoreSender3 = xSemaphoreCreateBinary();
    xSemaphoreReceiver = xSemaphoreCreateBinary();

    BaseType_t status1 = xTaskCreate(Sender1, "Sender1", 2000, NULL, 1, NULL);
    BaseType_t status2 = xTaskCreate(Sender2, "Sender2", 2000, NULL, 1, NULL);
    BaseType_t status3 = xTaskCreate(Sender3, "Sender3", 2000, NULL, 2, NULL);
    BaseType_t status4 = xTaskCreate(Receiver, "Receiver", 2000, NULL, 3, NULL);

    xTimer1 = xTimerCreate("Tsender1", pdMS_TO_TICKS(Tsender1), pdTRUE, (void *)1, vSender1TimerCallback);
    xTimer2 = xTimerCreate("Tsender2", pdMS_TO_TICKS(Tsender2), pdTRUE, (void *)2, vSender2TimerCallback);
    xTimer3 = xTimerCreate("Tsender3", pdMS_TO_TICKS(Tsender3), pdTRUE, (void *)3, vSender3TimerCallback);
    xTimer4 = xTimerCreate("Treceiver", FIXED_Receiver_Time, pdTRUE, (void *)4, vReceiverTimerCallback);

    BaseType_t startoftimer1 = xTimerStart(xTimer1, 0);
    BaseType_t startoftimer2 = xTimerStart(xTimer2, 0);
    BaseType_t startoftimer3 = xTimerStart(xTimer3, 0);
    BaseType_t startoftimer4 = xTimerStart(xTimer4, 0);


    // LED setup
    blinkLeds[0] = createLed(BLINK_PORT_NUMBER, BLINK_PIN_NUMBER_GREEN, BLINK_ACTIVE_LOW);
    blinkLeds[1] = createLed(BLINK_PORT_NUMBER, BLINK_PIN_NUMBER_ORANGE, BLINK_ACTIVE_LOW);
    blinkLeds[2] = createLed(BLINK_PORT_NUMBER, BLINK_PIN_NUMBER_RED, BLINK_ACTIVE_LOW);
    blinkLeds[3] = createLed(BLINK_PORT_NUMBER, BLINK_PIN_NUMBER_BLUE, BLINK_ACTIVE_LOW);

    for (int i = 0; i < 4; i++) {
        power_up(&blinkLeds[i]);
    }

    xTimerOneShot = xTimerCreate("Timer1", pdMS_TO_TICKS(2000), pdFALSE, (void *)0, prvOneShotTimerCallback);
    xTimerAutoReload = xTimerCreate("Timer2", pdMS_TO_TICKS(1000), pdTRUE, (void *)1, prvAutoReloadTimerCallback);

    csv_file = fopen(CSV_FILENAME, "w");
    if (csv_file == NULL) {
        printf("Failed to open CSV file for writing.\n");
        return -1;
    }

    // Write CSV header
    fprintf(csv_file, CSV_HEADER);
    fflush(csv_file); // Ensure the header is written to the file

    vTaskStartScheduler();
    trace_printf("Not enough heap memory...\n");

    return 0;
}

#pragma GCC diagnostic pop

// Timer callback implementations
static void prvOneShotTimerCallback(TimerHandle_t xTimer) {
    trace_puts("One-shot timer callback executing");
    turn_on(&blinkLeds[1]);
}

static void prvAutoReloadTimerCallback(TimerHandle_t xTimer) {
    trace_puts("Auto-Reload timer callback executing");

    if (isOn(blinkLeds[0])) {
        turn_off(&blinkLeds[0]);
    } else {
        turn_on(&blinkLeds[0]);
    }
}

// FreeRTOS hook functions
void vApplicationMallocFailedHook(void) {
    for (;;);
}

void vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName) {
    (void)pcTaskName;
    (void)pxTask;
    for (;;);
}

void vApplicationIdleHook(void) {
    volatile size_t xFreeStackSpace = xPortGetFreeHeapSize();
    if (xFreeStackSpace > 100) {
        // Adjust heap size if needed
    }
}

void vApplicationTickHook(void) {}

StaticTask_t xIdleTaskTCB CCM_RAM;
StackType_t uxIdleTaskStack[configMINIMAL_STACK_SIZE] CCM_RAM;

void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) {
    *ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
    *ppxIdleTaskStackBuffer = uxIdleTaskStack;
    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}

StaticTask_t xTimerTaskTCB CCM_RAM;
StackType_t uxTimerTaskStack[configTIMER_TASK_STACK_DEPTH] CCM_RAM;

void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize) {
    *ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
    *ppxTimerTaskStackBuffer = uxTimerTaskStack;
    *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}
Editor is loading...
Leave a Comment