OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / fifo.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/fifo.c b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/fifo.c
new file mode 100644 (file)
index 0000000..4800888
--- /dev/null
@@ -0,0 +1,193 @@
+\r
+#include "core.h"\r
+\r
+//\8ew\92è\83T\83C\83Y\82Í\81A\83o\83C\83g\92P\88Ê\81B4\83o\83C\83g\90Ø\82è\8eÌ\82Ä\81B\r
+//\93à\95\94\83T\83C\83Y\82Í\81A\83G\83\93\83g\83\8a(uint=4byte)\92P\88Ê\81B\r
+\r
+DATA_FIFO32 *FIFO32_Initialize(IO_MemoryControl memctrl, uint size)\r
+{\r
+       DATA_FIFO32 *fifo;\r
+\r
+       //fifo = Memory_Allocate(memctrl, sizeof(DATA_FIFO32));\r
+       fifo = (DATA_FIFO32 *)System_CommonStruct_Allocate(SYSTEM_STRUCTID_FIFO32);\r
+\r
+       fifo->size = size >> 2;\r
+       fifo->buf = Memory_Allocate(memctrl, fifo->size << 2);\r
+       fifo->free = fifo->size;        /*freesize*/\r
+       fifo->flags.initialized = False;\r
+       fifo->flags.overflow = False;\r
+       fifo->p = 0;    /*write*/\r
+       fifo->q = 0;    /*read*/\r
+       fifo->flags.initialized = True;\r
+       return fifo;\r
+}\r
+\r
+int FIFO32_Put(DATA_FIFO32 *fifo, uint data)\r
+{\r
+       uint eflags;\r
+\r
+       if(fifo == Null){\r
+               return -1;\r
+       }\r
+\r
+       if(!fifo->flags.initialized){\r
+               return -2;\r
+       }\r
+\r
+       eflags = IO_Load_EFlags();\r
+       IO_CLI();\r
+\r
+       if(fifo->free == 0){\r
+               #ifdef CHNOSPROJECT_DEBUG_FIFO\r
+                       debug("FIFO32_Put:Overflow data.\n");\r
+               #endif\r
+               fifo->flags.overflow = True;\r
+               Error_Report(ERROR_FIFO_BUFFER_OVERFLOW, fifo);\r
+               return -1;\r
+       }\r
+       fifo->buf[fifo->p] = data;\r
+       fifo->p++;\r
+       if(fifo->p == fifo->size){\r
+               fifo->p = 0;\r
+       }\r
+       fifo->free--;\r
+\r
+\r
+       if(fifo->task != Null){\r
+               if(fifo->task->flags.linked && !fifo->task->flags.running){\r
+                       #ifdef CHNOSPROJECT_DEBUG_FIFO\r
+                               debug("FIFO32_Put:Task run start.\n");\r
+                       #endif\r
+                       System_MultiTask_Task_Run(fifo->task);\r
+                       #ifdef CHNOSPROJECT_DEBUG_FIFO\r
+                               debug("FIFO32_Put:Task run end.\n");\r
+                       #endif\r
+\r
+               }\r
+       }\r
+\r
+       IO_Store_EFlags(eflags);\r
+\r
+       return 0;\r
+}\r
+\r
+int FIFO32_Put_Arguments(DATA_FIFO32 *fifo, uint args, ...)\r
+{\r
+       int i;\r
+       uint *vargs;\r
+       uint eflags;\r
+\r
+       if(fifo == Null){\r
+               return -1;\r
+       }\r
+\r
+       if(!fifo->flags.initialized){\r
+               return -2;\r
+       }\r
+\r
+       if(args == 0){\r
+               return 0;\r
+       }\r
+\r
+       eflags = IO_Load_EFlags();\r
+       IO_CLI();\r
+\r
+       vargs = (uint *)(&args + 1);\r
+\r
+       for(i = 0; i < args; i++){\r
+               if(fifo->free <= 1){\r
+                       i = -1;\r
+                       break;\r
+               }\r
+               FIFO32_Put(fifo, vargs[i]);\r
+       }\r
+       FIFO32_Put(fifo, SIGNAL_ARGUMENTS_END);\r
+\r
+       IO_Store_EFlags(eflags);\r
+\r
+       return i; \r
+}\r
+\r
+void FIFO32_Set_Task(DATA_FIFO32 *fifo, UI_Task *task)\r
+{\r
+       if(fifo == Null){\r
+               return;\r
+       }\r
+\r
+       fifo->task = task;\r
+       return;\r
+}\r
+\r
+uint FIFO32_Get(DATA_FIFO32 *fifo)\r
+{\r
+       int data;\r
+\r
+       if(fifo == Null){\r
+               return 0;\r
+       }\r
+\r
+       if(!fifo->flags.initialized){\r
+               return 0;\r
+       }\r
+\r
+       if (fifo->free == fifo->size) { /*\83o\83b\83t\83@\82ª\8bó\82Ì\8e\9e\82Í\81A\8dÅ\8cã\82É\93Ç\82Ý\82Æ\82ç\82ê\82½\83f\81[\83^\82ð\8cJ\82è\95Ô\82µ\95Ô\82·*/\r
+               if(fifo->q == 0){       /*\93Ç\82Ý\82¾\82µ\83|\83C\83\93\83g\82ª\8dÅ\8f\89\82Ì\82Æ\82«\82Í\81A\8dÅ\8cã\82É\93Ç\82Ý\82Æ\82ç\82ê\82½\83f\81[\83^\82Í\8fI\92[\82É\82 \82é*/\r
+                       return fifo->buf[fifo->size];\r
+               }\r
+               return fifo->buf[fifo->q - 1];\r
+       }\r
+       data = fifo->buf[fifo->q];\r
+       fifo->q++;\r
+       if (fifo->q == fifo->size) {    /*\93Ç\82Ý\8fo\82µ\83|\83C\83\93\83g\82ª\8fI\92[\82Ü\82Å\8ds\82Á\82½\82Ì\82Å\81A\90æ\93ª\82É\96ß\82·*/\r
+               fifo->q = 0;\r
+       }\r
+       fifo->free++;\r
+       return data;\r
+}\r
+\r
+uint FIFO32_Status(DATA_FIFO32 *fifo)\r
+{\r
+       if(fifo == Null){\r
+               return 0;\r
+       }\r
+\r
+       if(!fifo->flags.initialized){\r
+               return 0;\r
+       }\r
+\r
+       return fifo->size - fifo->free; /*\83o\83b\83t\83@\82É\91\8dÝ\82·\82é\83f\81[\83^\82Ì\83G\83\93\83g\83\8a\90\94(\83G\83\93\83g\83\8a\90\94=uint\82Ì\8cÂ\90\94->\83G\83\93\83g\83\8a\90\94*4=\8eg\82í\82ê\82Ä\82¢\82é\83o\83C\83g\90\94)*/\r
+}\r
+\r
+void FIFO32_Free(DATA_FIFO32 *fifo)\r
+{\r
+       if(fifo == Null){\r
+               return;\r
+       }\r
+\r
+       if(!fifo->flags.initialized){\r
+               return;\r
+       }\r
+\r
+       System_Memory_Free(fifo->buf, fifo->size << 2);\r
+\r
+       fifo->size = 0;\r
+       fifo->buf = 0;\r
+       fifo->free = 0; /*freesize*/\r
+       fifo->flags.initialized = False;\r
+       fifo->p = 0;    /*write*/\r
+       fifo->q = 0;    /*read*/\r
+\r
+       System_CommonStruct_Free(&fifo->common_tag);\r
+       return;\r
+}\r
+\r
+uint FIFO32_MyTaskFIFO_Status(void)\r
+{\r
+       return FIFO32_Status(System_MultiTask_GetNowTask()->fifo);\r
+}\r
+\r
+uint FIFO32_MyTaskFIFO_Get(void)\r
+{\r
+       return FIFO32_Get(System_MultiTask_GetNowTask()->fifo);\r
+}\r
+\r