diff -r 000000000000 -r 51f5a3138405 LPCtarget/plc_LPC_main.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LPCtarget/plc_LPC_main.c Sun May 20 11:29:35 2012 +0200 @@ -0,0 +1,145 @@ +/** + * Yagarto specific code + **/ + +#include +#include + +/* provided by POUS.C */ +extern unsigned long long common_ticktime__; +extern unsigned long __tick; + +extern unsigned long idLen; +extern unsigned char *idBuf; + +static unsigned char RetainedIdBuf[128] __attribute__((section (".nvolatile"))); +static unsigned char retain_buffer[RETAIN_BUFFER_SIZE] __attribute__((section (".nvolatile"))); + +static int debug_locked = 0; +static int _DebugDataAvailable = 0; +static unsigned long __debug_tick; + +void LPC_GetTime(IEC_TIME*); +void LPC_SetTimer(unsigned long long next, unsigned long long period); + +long AtomicCompareExchange(long* atomicvar,long compared, long exchange) +{ + /* No need for real atomic op on LPC, + * no possible preemption between debug and PLC */ + long res = *atomicvar; + if(res == compared){ + *atomicvar = exchange; + } + return res; +} + +void PLC_GetTime(IEC_TIME *CURRENT_TIME) +{ + /* Call target GetTime function */ + LPC_GetTime(CURRENT_TIME); +} + +void PLC_SetTimer(unsigned long long next, unsigned long long period) +{ + LPC_SetTimer(next, period); +} + +int startPLC(int argc,char **argv) +{ + if(__init(argc,argv) == 0){ + /* sign retain buffer */ + PLC_SetTimer(0, common_ticktime__); + return 0; + }else{ + return 1; + } +} + +int TryEnterDebugSection(void) +{ + if(!debug_locked && __DEBUG){ + debug_locked = 1; + return 1; + } + return 0; +} + +void LeaveDebugSection(void) +{ + debug_locked = 0; +} + +int stopPLC(void) +{ + __cleanup(); + return 0; +} + +/* from plc_debugger.c */ +int WaitDebugData(unsigned long *tick) +{ + /* no blocking call on LPC */ + if(_DebugDataAvailable && !debug_locked){ + /* returns 0 on success */ + *tick = __debug_tick; + _DebugDataAvailable = 0; + return 0; + } + return 1; +} + +/* Called by PLC thread when debug_publish finished + * This is supposed to unlock debugger thread in WaitDebugData*/ +void InitiateDebugTransfer(void) +{ + /* remember tick */ + __debug_tick = __tick; + _DebugDataAvailable = 1; +} + +void suspendDebug(int disable) +{ + /* Prevent PLC to enter debug code */ + __DEBUG = !disable; + debug_locked = !disable; +} + +void resumeDebug(void) +{ + /* Let PLC enter debug code */ + __DEBUG = 1; + debug_locked = 0; +} + +void ValidateRetainBuffer(void) +{ + memcpy(RetainedIdBuf, idBuf, idLen); +} + +void InValidateRetainBuffer(void) +{ + /* invalidate that buffer */ + RetainedIdBuf[0] = 0; +} + +int CheckRetainBuffer(void) +{ + /* compare RETAIN ID buffer with MD5 */ + /* return true if identical */ + int res = memcmp(RetainedIdBuf, idBuf, idLen) == 0; + return res; +} + +void Retain(unsigned int offset, unsigned int count, void *p) +{ + if(offset + count < RETAIN_BUFFER_SIZE) + /* write in RETAIN buffer at offset*/ + memcpy(&retain_buffer[offset], p, count); +} + +void Remind(unsigned int offset, unsigned int count, void *p) +{ + if(offset + count < RETAIN_BUFFER_SIZE) + /* read at offset in RETAIN buffer */ + memcpy(p, &retain_buffer[offset], count); +}