# HG changeset patch # User Michael Spacefalcon # Date 1401306850 0 # Node ID 03d034db09fad2f518d935d8f9fa18eeecd70a6b # Parent 62f850da5d49f99d7b2c850115ab881b5e886a12 OSL: os_SendToQueue() reconstructed diff -r 62f850da5d49 -r 03d034db09fa gsm-fw/gpf/osl/Makefile --- a/gsm-fw/gpf/osl/Makefile Thu May 15 11:44:36 2014 +0000 +++ b/gsm-fw/gpf/osl/Makefile Wed May 28 19:54:10 2014 +0000 @@ -3,7 +3,7 @@ IOPTS= -DRUN_INT_RAM XOPTS= -DRUN_FLASH -mthumb -IOBJS= os_pro_ir.o +IOBJS= os_com_ir.o os_pro_ir.o XOBJS= os_com_fl.o os_isr.o os_pro_fl.o all: ${IOBJS} ${XOBJS} diff -r 62f850da5d49 -r 03d034db09fa gsm-fw/gpf/osl/os_com_ir.c --- a/gsm-fw/gpf/osl/os_com_ir.c Thu May 15 11:44:36 2014 +0000 +++ b/gsm-fw/gpf/osl/os_com_ir.c Wed May 28 19:54:10 2014 +0000 @@ -8,13 +8,13 @@ #include #include "gpfconf.h" /* FreeCalypso addition */ #include "../../nucleus/nucleus.h" +#include "../../nucleus/tc_extr.h" /* not seen in original, but needed */ #include "typedefs.h" #include "os.h" #include "gdi.h" #include "os_types.h" #include "os_glob.h" -extern TC_PROTECT TCD_System_Protect; extern T_OS_COM_TABLE_ENTRY ComTable[]; extern unsigned os_tick_to_time_multiplier; @@ -27,9 +27,33 @@ ULONG Suspend, OS_QDATA *Msg) { T_OS_COM_TABLE_ENTRY *pTable; - T_QDATA_ELEMENT *pFreeElement, *pRet; + T_QDATA_ELEMENT *elem; + T_QUEUE *queue; int ret; NU_SEMAPHORE *CBPtr; - + USHORT watmark; + if (ComHandle <= 0 || ComHandle > MaxCommunications) + return(OS_INVALID_QUEUE); + pTable = ComTable + ComHandle; + if (!pTable->Name[0]) + return(OS_INVALID_QUEUE); + CBPtr = &pTable->FreeSemCB; + ret = ObtainSemaphoreCB(CBPtr, Suspend, 1); + if (ret == OS_ERROR || ret == OS_TIMEOUT) + return(ret); + TCT_System_Protect(); + elem = pTable->pFreeElement; + pTable->pFreeElement = elem->pNext; + bcopy(Msg, &elem->Data, sizeof(OS_QDATA)); + queue = &pTable->Queue[Priority - OS_MIN_PRIORITY]; + *queue->pWrite++ = &elem->Data; + if (queue->pWrite - queue->pStart >= pTable->Entries + 1) + queue->pWrite = queue->pStart; + watmark = pTable->Entries - CBPtr->sm_semaphore_count; + if (pTable->MaxUsed < watmark) + pTable->MaxUsed = watmark; + TCT_System_Unprotect(); + ReleaseSemaphoreCB(&pTable->UsedSemCB); + return(ret); }