Ragazzi buonasera. Innanzitutto chiedo perdono anticipato se non rispetterò le regole relative a tag o cose del genere, ma essendo un neofita su questo forum devo ancora imparare. Piuttosto mi sono iscritto al fine di poter chiedervi aiuto su un problema. Ho dei file per delle code a priorità e devo modificarli affinchè diventino semplici code FIFO ma sto avendo qualche difficoltà. DI seguito vi posto il codice delle delle strutture e delle principali funzioni delle code a priorità che vorrei diventassero code Fifo:
PS: VI prego di aiutarmi indicandomi le modifiche necessarie, vi ringrazio anticipatamente e scusate ancora per eventuali mancanze del rispetto delle regole del forum.
FILE .c:
#include "prio_queue.h"
int16_t getMin(QueueHandler *queue);
int16_t getMax(QueueHandler *queue);
/* Public functions ----------------------------------------------------------*/
void Queue_Init(QueueHandler *queue) {
queue->min = -1;
queue->max = -1;
queue->num_elem = 0;
}
uint8_t Queue_pop(QueueHandler *queue, uint8_t *buffer) {
QueueItem *it;
uint8_t len;
if(queue->num_elem == 0) return 0;
it = &(queue->queue_data[queue->min]);
for(len = 0; len < it->length; len++) {
buffer[len] = it->data[len];
}
len = it->length;
it->length = 0;
queue->num_elem--;
if(queue->num_elem > 0) {
queue->min = getMin(queue);
} else {
queue->min = -1;
queue->max = -1;
}
return len;
}
uint8_t Queue_push(QueueHandler *queue, uint8_t prio, uint8_t len, uint8_t *buffer) {
uint8_t i, j;
for(i = 0; i < QUEUE_SIZE; i++) {
if(queue->queue_data.length == 0) {
queue->queue_data.priority = prio;
queue->queue_data.length = len;
for(j=0; j<len; j++)
queue->queue_data.data[j] = buffer[j];
queue->num_elem++;
if(queue->num_elem == 1) {
queue->min = i;
queue->max = i;
return 1;
}
if(prio < queue->queue_data[queue->min].priority)
queue->min = i;
else if(prio >= queue->queue_data[queue->max].priority)
queue->max = i;
return 1;
}
}
return 0;
}
int16_t getMin(QueueHandler *queue) {
uint8_t i, ret = 0;
if(queue->num_elem == 0) return -1;
for(i=1; i<QUEUE_SIZE; i++) {
if(queue->queue_data.length > 0) {
if((queue->queue_data.priority < queue->queue_data[ret].priority)
|| queue->queue_data[ret].length == 0) {
ret = i;
}
}
}
return ret;
}
int16_t getMax(QueueHandler *queue) {
uint8_t i, ret = 0;
if(queue->num_elem == 0) return -1;
for(i=1; i<QUEUE_SIZE; i++) {
if(queue->queue_data.length > 0) {
if((queue->queue_data.priority > queue->queue_data[ret].priority)
|| queue->queue_data[ret].length == 0) {
ret = i;
}
}
}
return ret;
}
FILE .h
#define QUEUE_SIZE 5
#define QUEUE_MAX_DATA_LEN 64
/* Exported types ------------------------------------------------------------*/
typedef struct {
uint8_t priority;
uint8_t length;
uint8_t data[QUEUE_MAX_DATA_LEN];
} QueueItem;
typedef struct {
uint8_t num_elem;
uint16_t min;
uint16_t max;
QueueItem queue_data[QUEUE_SIZE];
} QueueHandler;
/* Exported macro ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
void Queue_Init(QueueHandler *queue);
uint8_t Queue_pop(QueueHandler *queue, uint8_t *buffer);
uint8_t Queue_push(QueueHandler *queue, uint8_t prio, uint8_t len, uint8_t *buffer);