/* Store one log message of give size */ int LogMessage(uint8_t level, char* buf, uint32_t size){ if(size < LOG_BUFFER_SIZE - sizeof(mTail)){ uint32_t buffpos; uint64_t new_cursor, old_cursor; mTail tail; tail.msgsize = size; tail.tick = __tick; PLC_GetTime(&tail.time); /* We cannot increment both msg index and string pointer in a single atomic operation but we can detect having been interrupted. So we can try with atomic compare and swap in a loop until operation succeeds non interrupted */ do{ old_cursor = LogCursor[level]; buffpos = (uint32_t)old_cursor; tail.msgidx = (old_cursor >> 32); new_cursor = ((uint64_t)(tail.msgidx + 1)<<32) | (uint64_t)((buffpos + size + sizeof(mTail)) & LOG_BUFFER_MASK); }while(AtomicCompareExchange64( (long long*)&LogCursor[level], (long long)old_cursor, (long long)new_cursor)!=(long long)old_cursor); copy_to_log(level, buffpos, buf, size); copy_to_log(level, (buffpos + size) & LOG_BUFFER_MASK, &tail, sizeof(mTail)); return 1; /* Success */ }else{
void PLC_task_proc(void *arg) { PLC_SetTimer(common_ticktime__, common_ticktime__); while (!PLC_shutdown) { PLC_GetTime(&__CURRENT_TIME); __run(); if (PLC_shutdown) break; rt_task_wait_period(NULL); } }
void runPLC(void) { PLC_GetTime( &__CURRENT_TIME ); __run(); }