greg@425: /** greg@425: * Yagarto specific code greg@425: **/ greg@425: edouard@579: #include edouard@518: #include greg@425: greg@425: /* provided by POUS.C */ edouard@518: extern unsigned long long common_ticktime__; edouard@577: extern unsigned long __tick; edouard@577: edouard@579: extern unsigned long idLen; edouard@579: extern unsigned char *idBuf; edouard@579: edouard@579: static unsigned char RetainedIdBuf[128] __attribute__((section (".nvolatile"))); edouard@579: static unsigned char retain_buffer[RETAIN_BUFFER_SIZE] __attribute__((section (".nvolatile"))); edouard@579: edouard@577: static int debug_locked = 0; edouard@577: static int _DebugDataAvailable = 0; edouard@577: static unsigned long __debug_tick; edouard@577: edouard@518: void LPC_GetTime(IEC_TIME*); edouard@518: void LPC_SetTimer(unsigned long long next, unsigned long long period); greg@425: greg@425: long AtomicCompareExchange(long* atomicvar,long compared, long exchange) greg@425: { edouard@518: /* No need for real atomic op on LPC, edouard@518: * no possible preemption between debug and PLC */ edouard@518: long res = *atomicvar; edouard@518: if(res == compared){ edouard@518: *atomicvar = exchange; edouard@518: } edouard@518: return res; greg@425: } greg@425: greg@425: void PLC_GetTime(IEC_TIME *CURRENT_TIME) greg@425: { greg@425: /* Call target GetTime function */ edouard@518: LPC_GetTime(CURRENT_TIME); greg@425: } greg@425: edouard@518: void PLC_SetTimer(unsigned long long next, unsigned long long period) greg@425: { edouard@518: LPC_SetTimer(next, period); greg@425: } greg@425: greg@425: int startPLC(int argc,char **argv) greg@425: { edouard@518: if(__init(argc,argv) == 0){ edouard@579: /* sign retain buffer */ edouard@518: PLC_SetTimer(0, common_ticktime__); greg@425: return 0; edouard@518: }else{ greg@425: return 1; edouard@518: } greg@425: } greg@425: greg@425: int TryEnterDebugSection(void) greg@425: { edouard@577: if(!debug_locked && __DEBUG){ edouard@577: debug_locked = 1; edouard@577: return 1; edouard@577: } edouard@577: return 0; greg@425: } greg@425: greg@425: void LeaveDebugSection(void) greg@425: { edouard@577: debug_locked = 0; greg@425: } greg@425: greg@425: int stopPLC(void) greg@425: { greg@425: __cleanup(); greg@425: return 0; greg@425: } greg@425: greg@425: /* from plc_debugger.c */ edouard@452: int WaitDebugData(unsigned long *tick) greg@425: { edouard@577: /* no blocking call on LPC */ edouard@577: if(_DebugDataAvailable && !debug_locked){ edouard@577: /* returns 0 on success */ edouard@577: *tick = __debug_tick; edouard@577: _DebugDataAvailable = 0; edouard@577: return 0; edouard@577: } edouard@577: return 1; greg@425: } greg@425: greg@425: /* Called by PLC thread when debug_publish finished greg@425: * This is supposed to unlock debugger thread in WaitDebugData*/ greg@425: void InitiateDebugTransfer(void) greg@425: { edouard@577: /* remember tick */ edouard@577: __debug_tick = __tick; edouard@502: _DebugDataAvailable = 1; greg@425: } greg@425: edouard@502: void suspendDebug(int disable) greg@425: { edouard@577: /* Prevent PLC to enter debug code */ edouard@502: __DEBUG = !disable; edouard@577: debug_locked = !disable; greg@425: } greg@425: greg@425: void resumeDebug(void) greg@425: { edouard@577: /* Let PLC enter debug code */ edouard@502: __DEBUG = 1; edouard@577: debug_locked = 0; greg@425: } edouard@483: edouard@580: void ValidateRetainBuffer(void) edouard@580: { edouard@580: memcpy(RetainedIdBuf, idBuf, idLen); edouard@580: } edouard@580: edouard@580: void InValidateRetainBuffer(void) edouard@580: { edouard@580: /* invalidate that buffer */ edouard@580: RetainedIdBuf[0] = 0; edouard@580: } edouard@580: edouard@521: int CheckRetainBuffer(void) edouard@521: { edouard@579: /* compare RETAIN ID buffer with MD5 */ edouard@579: /* return true if identical */ edouard@579: int res = memcmp(RetainedIdBuf, idBuf, idLen) == 0; edouard@579: return res; edouard@521: } edouard@521: edouard@483: void Retain(unsigned int offset, unsigned int count, void *p) edouard@497: { edouard@579: if(offset + count < RETAIN_BUFFER_SIZE) edouard@579: /* write in RETAIN buffer at offset*/ edouard@579: memcpy(&retain_buffer[offset], p, count); edouard@483: } edouard@483: edouard@483: void Remind(unsigned int offset, unsigned int count, void *p) edouard@483: { edouard@579: if(offset + count < RETAIN_BUFFER_SIZE) edouard@579: /* read at offset in RETAIN buffer */ edouard@579: memcpy(p, &retain_buffer[offset], count); edouard@483: }