May 09, 2024, 09:51:55 AM

News:

Own IWBasic 2.x ? -----> Get your free upgrade to 3.x now.........


Asked: functions written in C/C++ or other IWBasic : Microseconds Delays Timers

Started by Techno, May 10, 2013, 04:15:08 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Techno

Hi all,

I ask me of myzelf what kind of Timers APi can I use for create an delays of microseconds?

I read the MSDN site and I found the topics of different manners for create function that generates an delay of microseconds.

Witch one is the best solution for my problem if the user set the delay in microseconds and the function executes the adjustable microseconds of the user.

I hope that here developers knowledge the WinAPI and low level programming. I work under Windows XP/7

We have the chooice of:

1 Multimedia Timer
2. Waitable Timer
3. Queue Timer

1) Whitch is the best chooice of this timers?
2) How can I rewrite the code for use in microseconds?
3) I wish to change in the exists functions (see above) for programming the functions that using the microsecond
    (delay) timer. I don't know how I can change this in the code:

     DECLARE SUB TimeInit_us()
     DECLARE FUNCTION TimeRead_us() AS QUAD
     DECLARE SUB Delay_us(BYVAL wDelay AS WORD)

'------------------------------------------------------------------------------
' TIME functions
'------------------------------------------------------------------------------
' This set of functions is important for various time measurements. Just as
' with DELAY function (in ms) and Delay_us (in µs), TIME functions also operate on millisecond or
' microsecond basis.
' TIMEINIT (in ms) and TIMEINIT_US (in µs) will reset the timers to zero and start them again
' with ms or us precision
' TIMEREAD (in ms) and TIMEREAD_US (in µs) functions will read the amount of time (in ms or us)
' since the last TIMEINIT or TIMEINITUS function was executed. Both functions
' return a 64-bit integer

4) How can I combine it to an Quad word (64 bit)?



#Dim All
#Include "Win32API.inc"

Type LARGE_INTEGER
    low_part  As Long
    high_part As Long
End Type

Global g_TimeUnit               As Double
Global g_Start_Time_Low   As Long
Global g_Start_Time_High   As Long

'========================================================================='
'Milliseconds Delay Timer Functions                                       '
'========================================================================='

Sub TimeInit()
    '==============================================='
    'Reset the milliseconds Timer to Zero
    'will reset the timers to zero and start them again with ms precision
    '===============================================
    Local f As LARGE_INTEGER
    Local t As LARGE_INTEGER
    Local x As Dword

    x = QueryPerformanceFrequency(f)
    g_TimeUnit = 1000 / f.low_part
    x = QueryPerformanceCounter(t)

    g_Start_Time_Low  = t.low_part
    g_Start_Time_High = t.high_part
End Sub

Function TimeRead()  As QUAD
    '=======================================
    ' TIMEREAD functions will read the amount of time (in ms)
    ' since the last TIMEINIT function was executed. The function
    ' return a 64-bit integer
    '=======================================
    Local t As LARGE_INTEGER
    Local x As Dword

    If(g_TimeUnit = 0) Then g_TimeUnit = 0.000838096515
    x = QueryPerformanceCounter(t)
    Function = (t.high_part * 4294967296# + t.low_part - g_Start_Time_High * 4294967296# - g_Start_Time_Low * g_TimeUnit)
End Function

Sub Delay(ByVal wDelay_time As Word)
    '=============================================
    'With the DELAY function is important for various time measurements. Just
    'as with Delay function, Time function also operate on ms basic
    '=============================================
    Local time_start As Double

    time_start = TimeRead()
    While(TimeRead() < (time_start + wDelay_time)) : Wend
End Sub


I hope that here someone help me but I can't written the functions for the microseconds timer. I would it in IWBasic the sourcecode not an DLL or LIB

Kind regards
Stephan

LarryMc

From what I've read it is hard to get an accurate usec delay.
Things that affect the accuracy include:
1)The priority of the thread running the timing loop - a higher priority thread will take a time slice
2) Apparently it makes a difference whether the host computer has a single or multiple processors
3) the cpu speed which determines how fast the looping code can be executed
4) and depends on how a specific version of BIOS code is written

So, I have no idea what to tell you.
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library

GWS

Tomorrow may be too late ..