Výsledky 1 až 6 z 6

Téma: [VB] [Win98] rychle operacie

  1. #1

    Standardní [VB] [Win98] rychle operacie

    Potreboval by som nejake kratke delaye, radovo mikrosekundy na nejaky podobny kod:

    Kód:
    OutPort (888, "00001111")
    Delay 100   // 100 mikrosekund
    
    OutPort (888, "00001110")
    Ale malo by to byt sofistikovanejsie ako toto:
    Kód:
    OutPort (888, "00001111")
    for i = 1 to 10000   // podla rychlosti PC !-(
    Next i
    
    OutPort (378, "00001110")
    Treba aby to bolo nezavisle na rychlosti PC, nejaky HW casovas pristupny aj z W98 napr. Timer vo VB ma casovanie po milisekundach = moc velky casovy diel.
    DIYS gripmeen >> CPU Wolfdale E8200 MOBO Gigabyte GA-P35-DS3R rev 2.1 RAM A-DATA DDRII 800+ EE VGA Gigabyte 3850 512MB HDD SAMSUNG 500GB HD501LJ
    Fujistu Siemens Scenic >> CPU Pentium III 1000MHz MOBO unknown RAM 256 + 128MB VGA int. i810 HDD 20GB neznameho typu

  2. #2

    Standardní

    Inak sa spytam (skor otazka pre elektronikov - programatorov, spravca databazy asi nebude vediet ). Ked xcem v kompe najst nejaky stabilny casovac, kde ho najdem (rozlisenie radovo desiatky mikrosekund) ?? Ako sa napr. robia SW pre nejake programatory??
    DIYS gripmeen >> CPU Wolfdale E8200 MOBO Gigabyte GA-P35-DS3R rev 2.1 RAM A-DATA DDRII 800+ EE VGA Gigabyte 3850 512MB HDD SAMSUNG 500GB HD501LJ
    Fujistu Siemens Scenic >> CPU Pentium III 1000MHz MOBO unknown RAM 256 + 128MB VGA int. i810 HDD 20GB neznameho typu

  3. #3

    Standardní

    Mikrosekundy vo Windows a este vo Visual Basicu?
    Instrukcia RDTSC pomoze, ale vo Windows to nie je take jednoduche.
    Toto som robil do UniFlashu (v Pascale - ale tam toho Pascalu je, ze )
    Kód:
    procedure _Delay; {v1.22}
    begin
      Delay(100);
    end;
    
    procedure InitTSC;assembler; {Requires Pentium or newer CPU} {v1.22}
    asm
      pushf                     {PUSHF}
      cli                       {CLI}
      dw   310fh                {RDTSC}
      db   66h
      push ax                   {PUSH EAX}
      call _Delay               {DELAY(100)}         {Delay 100ms}
      dw   310fh                {RDTSC}
      db   66h
      pop  bx                   {POP EBX}
      db   66h
      sub  ax,bx                {SUB EAX,EBX}        {Ticks elapsed ->EAX}
      db   66h
      mov  word ptr tsc,ax      {MOV TSC,EAX}        {Ticks per second}
      popf                      {POPF}               {Instead of STI}
    end;
    
    {$F+}
    procedure TSCWait(MicroSec:LongInt);assembler; {v1.22}
    asm
      dw   310fh                {RDTSC}
      db   66h
      mov  bx,ax                {MOV EBX,EAX}
      db   66h
      mov  cx,dx                {MOV ECX,EDX}
      db   66h
      mov  ax,word ptr MicroSec {MOV EAX,MicroSec}
      db   66h
      mul  word ptr uSec        {MUL uSec}          {Ticks to wait ->EDX:EAX}
      db   66h
      add  bx,ax                {ADD EBX,EAX}
      db   66h
      adc  cx,dx                {ADC ECX,EDX}
    @:dw   310fh                {RDTSC}
      db   66h
      cmp  dx,cx                {CMP EDX,ECX}       {Waiting enough?}
      je   @low                 {JE  @low}          {Waiting enough (high)}
      ja   @exit                {JA  @exit}         {Waiting more! Exit!}
      jmp  @                    {JMP @}             {Not enough, wait more}
    @low:
      db   66h
      cmp  ax,bx                {CMP EAX,EBX}       {Waiting enough?}
      jae  @exit                {JL  @}             {Not enough, wait more}
      jmp  @
    @exit:
    end;
    {$F-}
    
    function TSCPresent:Boolean;assembler; {v1.22}
    asm
      db   66h
      pushf                     {PUSHFD}
      db   66h
      pop  ax                   {POP EAX}           {Read EFLAGS register to EAX}
      db   66h
      push ax                   {PUSH EAX}          {Save it for later use}
      db   66h
      or   ax,0h
      dw   20h                  {OR EAX,200000h}    {Set CPUID bit}
      db   66h
      push ax                   {PUSH EAX}
      db   66h
      popf                      {POPFD}             {Put EAX to EFLAGS}
      db   66h
      pushf                     {PUSHFD}
      db   66h
      pop  ax                   {POP EAX}           {Read back EFLAGS to EAX}
      db   66h
      and  ax,0h
      dw   20h                  {AND EAX,200000h}
      db   66h
      cmp  ax,0h
      dw   20h                  {CMP EAX,200000h}   {Is CPUID bit set?}
      jne  @bad                 {JNE @BAD}          {If not, CPUID not supported}
      db   66h
      xor  ax,ax                {XOR EAX,EAX}
      dw   0a20fh               {CPUID}             {Call level 0 CPUID}
      dd   0f88366h             {CMP EAX,0}         {Is MaxLevel 0?}
      je   @bad                 {JE @BAD}           {If yes, it's bad, we need 1}
      db   66h
      xor  ax,ax                {XOR EAX,EAX}
      db   66h
      inc  ax                   {INC EAX}           {MOV EAX,1}
      dw   0a20fh               {CPUID}             {Call level 1 CPUID}
      dd   10e28366h            {AND EDX,10h}
      db   66h
      cmp  dx,10h               {CMP EDX,10h}       {Is TSC bit set?}
      jne  @bad                 {JNE @BAD}          {If not, TSC not present}
      mov  ax,1                 {MOV AX,1}          {Return TRUE}
      jmp  @exit
    @bad:
      xor  ax,ax                {XOR AX,AX}         {Return FALSE}
      jmp  @exit
    @exit:
      db 66h
      popf                      {POPFD}             {Restore EFLAGS register}
    end;
    Na zaciatku to treba kalibrovat:
    Kód:
    InitTSC;
    uSec:=TSC div 100000;
    Funkcia Delay musi byt aspon trochu presna, aby to fungovalo.
    1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm

  4. #4
    Administrátor mince Avatar uživatele Jezevec
    Založen
    08.10.2002
    Bydliště
    Teplice
    Příspěvky
    6 738
    Vliv
    300

    Standardní

    Muzes to povesit na RTC, ale vrele pochybuju ze tak dosahnes presnosti na mikra, maximalne na mili.
    IMPROBE AMOR, QUID NON MORTALIA PECTORA COGIS - krutá jsi, lásko, kam až ty doženeš smrtelná srdce -- Vergilius
    Mnoho je prostředků, které léčí lásku, ale žádný není spolehlivý.
    S tím, čeho se na nás dopustili druzí se už nějak vyrovnáme. Horší je to s tím, čeho jsme se na sobě dopustili sami.
    -- Francois La Rochefoucauld
    Nabídnout přátelství tomu, kdo chce lásku, je jako dát chleba tomu, kdo umírá žízní.

  5. #5
    Senior Member Avatar uživatele pYr0
    Založen
    15.03.2003
    Bydliště
    Senica-Záhorie
    Věk
    35
    Příspěvky
    985
    Vliv
    274
    X2 6000+@3420Mhz(228x15)1.45V,BOX+Windtunnel,MSI K9A2 Platinium V2, 2x2GB A-DATA Vitesta 4-4-4-12, Gainward 4870 790/1063, Corsair 750W TXEU
    Acer Travelmate 4102WLMi: Centrino 1.73Ghz, 1.25GB RAM, ATI X700, 120GB Samsung, Debian lenny

  6. #6
    Senior Member
    Založen
    22.07.2003
    Bydliště
    Ostrava - Homeless putující světem
    Příspěvky
    731
    Vliv
    269

    Standardní Re: [VB] [Win98] rychle operacie

    Citace Původně odeslal iPoK
    Treba aby to bolo nezavisle na rychlosti PC, nejaky HW casovas pristupny aj z W98 napr. Timer vo VB ma casovanie po milisekundach = moc velky casovy diel.
    No to je celkem zábavné VB a mikrosekundy

    1) POkud pouzijes GetTickCount TimeGetTime queryPerformanceCounter QueryPerformanceFrequency , pak věz, že Winy nejsou RealTimeOS - tzn. volaní interních funkcí (zde konkrétně z kernelu) nezajišťuje jejich realtime tzn. alepsoň mikrosekundovou přesnost. Je to z důvodů, že funkce z jádra může volat kterýkoliv spuštěný proces a těch jsou desítky a to může vést ke zpoždění i např. 50 milisekund
    2) Zkus si ve VB udělat smyčku


    Kód:
    DO
      casovac(i) = XXX 'napr. ten QueryPer....
    LOOP
    A podivej se jakych casu tam dosahnes.
    VB opravdu neni jazyk na mikrosekundy! Bez do C/C++.

    3) Nejlepší řešení je obejít Win API a volat přímo RTC RDTSC pomoci instrukci v ASM.

    -VB umožňuje "vkládaný ASM kod" , což umožňuje např. -
    -matem. výpočty + grafika
    - vlastní SEH - nastavení
    - úprava kodu (injection)

    ------- nebo pomocí DLL v ASM (či C/C++) ---
    - všechny hooks + DLL injection
    - podtřídy oken cizích procesů

    Pozn. na vkládání ASM do VB je nejlepší nějaký add-in. Velice programátorsky výživné jsou hard-core metody vkládání ASM do jazyků, které to nepodporují -- u VB napr. vlozenim zkompilovaneho ASM jako stringu pres CByte
    Autor tohoto příspěvku je zpráskaná LAMA. Absolvoval 6 tříd ZŠ. Proto berte obsah příspěvku s rezervou.

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •