CODE

di il
1 risposte

CODE

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);

1 Risposte

  • Re: CODE

    Prima di tutto, non dovresti scusarti per non aver inserito i tag code, ma dovresti impiegare dieci minuti per inserire correttamente i tag code, come rispetto del regolamento e di tutti quelli che vorrebbero leggere il codice e risponderti.

    In secondo luogo, non capisco perché devi "modificare" un codice (l'hai scritto tu?) e non scrivere il codice che ti serve direttamente.
Devi accedere o registrarti per scrivere nel forum
1 risposte