26 #define _CRTDBG_MAP_ALLOC 45 LARGE_INTEGER StartingTime;
46 LARGE_INTEGER TicksPerSecond;
52 #define TIMER_PS_1US (1000000UL) 53 #define TIMER_PS_10US (100000UL) 54 #define TIMER_PS_100US (10000UL) 56 #define TIMER_PS_1MS (1000UL) 57 #define TIMER_PS_10MS (100UL) 58 #define TIMER_PS_100MS (10UL) 59 #define TIMER_PS_1S (1UL) 62 #if XCP_DAQ_TIMESTAMP_UNIT == XCP_DAQ_TIMESTAMP_UNIT_1US 63 #define XCP_HW_TIMER_PRESCALER (TIMER_PS_1US) 64 #elif XCP_DAQ_TIMESTAMP_UNIT == XCP_DAQ_TIMESTAMP_UNIT_10US 65 #define XCP_HW_TIMER_PRESCALER (TIMER_PS_10US) 66 #elif XCP_DAQ_TIMESTAMP_UNIT == XCP_DAQ_TIMESTAMP_UNIT_100US 67 #define XCP_HW_TIMER_PRESCALER (TIMER_PS_100US) 68 #elif XCP_DAQ_TIMESTAMP_UNIT == XCP_DAQ_TIMESTAMP_UNIT_1MS 69 #define XCP_HW_TIMER_PRESCALER (TIMER_PS_1MS) 70 #elif XCP_DAQ_TIMESTAMP_UNIT == XCP_DAQ_TIMESTAMP_UNIT_10MS 71 #define XCP_HW_TIMER_PRESCALER (TIMER_PS_10MS) 72 #elif XCP_DAQ_TIMESTAMP_UNIT == XCP_DAQ_TIMESTAMP_UNIT_100MS 73 #define XCP_HW_TIMER_PRESCALER (TIMER_PS_100MS) 74 #elif XCP_DAQ_TIMESTAMP_UNIT == XCP_DAQ_TIMESTAMP_UNIT_1S 75 #define XCP_HW_TIMER_PRESCALER (TIMER_PS_1S) 77 #error Timestamp-unit not supported. 78 #endif // XCP_DAQ_TIMESTAMP_UNIT 80 #define TIMER_MASK_1 (0x000000FFUL) 81 #define TIMER_MASK_2 (0x0000FFFFUL) 82 #define TIMER_MASK_4 (0xFFFFFFFFUL) 87 static void XcpHw_InitLocks(
void);
89 static void XcpHw_DeinitLocks();
91 static uint64_t XcpHw_GetElapsedTime(uint32_t prescaler);
96 void XcpTl_PrintConnectionInformation(
void);
98 void FlsEmu_Info(
void);
100 void XcpDaq_Info(
void);
102 void XcpDaq_PrintDAQDetails();
104 bool XcpDaq_QueueEmpty(
void);
106 bool XcpDaq_QueueDequeue(uint16_t *len, uint8_t *data);
108 void XcpHw_MainFunction(
void);
116 CRITICAL_SECTION XcpHw_Locks[XCP_HW_LOCK_COUNT];
121 void XcpHw_Init(
void) {
123 QueryPerformanceFrequency(&HwState.TicksPerSecond);
124 QueryPerformanceCounter(&HwState.StartingTime);
128 void XcpHw_Deinit(
void) { XcpHw_DeinitLocks(); }
130 static uint64_t XcpHw_GetElapsedTime(uint32_t prescaler) {
133 LARGE_INTEGER Elapsed;
135 QueryPerformanceCounter(&Now);
136 Elapsed.QuadPart = Now.QuadPart - HwState.StartingTime.QuadPart;
137 Elapsed.QuadPart /= (HwState.TicksPerSecond.QuadPart / prescaler);
138 return Elapsed.QuadPart;
141 uint32_t XcpHw_GetTimerCounter(
void) {
142 uint64_t Now = XcpHw_GetElapsedTime(XCP_HW_TIMER_PRESCALER);
144 #if XCP_DAQ_TIMESTAMP_SIZE == XCP_DAQ_TIMESTAMP_SIZE_1 145 return (uint32_t)Now & TIMER_MASK_1;
146 #elif XCP_DAQ_TIMESTAMP_SIZE == XCP_DAQ_TIMESTAMP_SIZE_2 147 return (uint32_t)Now & TIMER_MASK_2;
148 #elif XCP_DAQ_TIMESTAMP_SIZE == XCP_DAQ_TIMESTAMP_SIZE_4 149 return (uint32_t)Now & TIMER_MASK_4;
151 #error Timestamp-size not supported. 152 #endif // XCP_DAQ_TIMESTAMP_SIZE 155 uint32_t XcpHw_GetTimerCounterMS(
void) {
156 return (uint32_t)((XcpHw_GetElapsedTime(TIMER_PS_1MS)) & TIMER_MASK_4);
159 static void XcpHw_InitLocks(
void) {
160 uint8_t idx = UINT8(0);
162 for (idx = UINT8(0); idx < XCP_HW_LOCK_COUNT; ++idx) {
163 InitializeCriticalSection(&XcpHw_Locks[idx]);
167 static void XcpHw_DeinitLocks(
void) {
168 uint8_t idx = UINT8(0);
170 for (idx = UINT8(0); idx < XCP_HW_LOCK_COUNT; ++idx) {
171 DeleteCriticalSection(&XcpHw_Locks[idx]);
175 void XcpHw_AcquireLock(uint8_t lockIdx) {
176 if (lockIdx >= XCP_HW_LOCK_COUNT) {
179 EnterCriticalSection(&XcpHw_Locks[lockIdx]);
182 void XcpHw_ReleaseLock(uint8_t lockIdx) {
183 if (lockIdx >= XCP_HW_LOCK_COUNT) {
186 LeaveCriticalSection(&XcpHw_Locks[lockIdx]);
189 void XcpHw_ErrorMsg(
char *
const fun,
int errorCode) {
192 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
193 NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
195 fprintf(stderr,
"[%s] failed with: [%d] %s", fun, errorCode, buffer);
198 void XcpHw_TransmitDtos(
void) {
200 uint8_t *dataOut = Xcp_GetDtoOutPtr();
201 while (!XcpDaq_QueueEmpty()) {
202 XcpDaq_QueueDequeue(&len, dataOut);
203 Xcp_SetDtoOutLen(len);
213 void XcpHw_Sleep(uint64_t usec) {
217 ZeroMemory(&ft,
sizeof(LARGE_INTEGER));
218 ft.QuadPart = -(10 * (int64_t)usec);
219 timer = CreateWaitableTimer(NULL, TRUE, NULL);
220 SetWaitableTimer(timer, &ft, 0, NULL, NULL, 0);
221 WaitForSingleObject(timer, INFINITE);