Jag arbetar lite med att skapa en SW FIFO för att kunna samla "stora" mängder data och sedan processera allt istället för att arbeta på byte efter byte som kommer farandes.
Jag designade först såhär, men det finns ett problem. Hur kan jag göra så tex en ISR för högre prioritet och kan lägga in data i FIFOn när den behöver, även när ett användarprogram har låst den, och att mina applikationer får sedan fortsätta sitt arbete.
För just nu så kan det bli ett race-condition mellan en ISR som preemptar en FIFO skrivning/läsning och så ser ISRen att den är upptagen och fastnar i en oändlig loop.
Så programmet väntar på ISRen och ISRen väntar på programmet. Inge bra.
Jag kommer inte på någon bra lösning på detta problem just nu och skulle gärna ha lite tips!
Kanske att man ska ha någon form av tvånivå-system där pherialen för skriver till en liten egen buffer och sedan att den vidarebefordrar det till den stora när den inte är låst?
kanske att jag attackerar problemet med fel vinkel?
fifo.h
Kod: Markera allt
#ifndef __FIFO_H
#define __FIFO_H
typedef struct
{
FlagStatus locked;
uint8_t *base_addr;
uint16_t read_addr;
uint16_t write_addr;
uint16_t size;
} fifo;
void fifo_push(fifo *, uint8_t);
uint8_t fifo_pop(fifo *);
void fifo_flush(fifo *);
#endif
Kod: Markera allt
#include "fifo.h"
/**********************************************
*
* Software FIFO for use of different applications.
* OBSERVE! It is only allowed to use the FIFO via these
* functions, manual change is prohibbited and unpredictable.
*
**********************************************/
void fifo_push(fifo *fifoblock, uint8_t data)
{
// If the FIFO is busy, wait here
while(fifoblock->locked == SET);
fifoblock->locked = SET;
{
kod kod kod...
}
fifoblock->locked = RESET;
}
uint8_t fifo_pop(fifo *fifoblock)
{
// If the FIFO is busy, wait here
while(fifoblock->locked == SET);
fifoblock->locked = SET;
{
kod kod kod...
}
fifoblock->locked = RESET;
return 0;
}
void fifo_flush(fifo *fifoblock)
{
// If the FIFO is busy, wait here
while(fifoblock->locked == SET);
fifoblock->locked = SET;
{
kod kod kod...
}
fifoblock->locked = RESET;
}