amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Programm lässt sich nicht compilieren [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

12.10.2006, 23:53 Uhr

MaikG
Posts: 5172
Nutzer
Ich wollte das hier mit Storm oder HighSoftC oder SASC
Compilieren, bekomme überall die verschiedenste
fehlermeldung.
StormC meldet 10 Fehler, HighSoft scheint cosinus nicht zu
kennen und SASC erzählt da auch irgendwas.

code:
#define NULL 0
    #define SAMPLING_RATE       (8000)
    #define MAX_BINS            (12)
    #define GOERTZEL_N          (92)

    int    sample_count;
    double q1[ MAX_BINS ];
    double q2[ MAX_BINS ];
    double r[ MAX_BINS ];

    /*
     * coef = 2.0 * cos( (2.0 * PI * k) / (float)GOERTZEL_N)) ;
     * Where k = (int) (0.5 + ((float)GOERTZEL_N * target_freq) / SAMPLING_RATE));
     *
     * More simply: coef = 2.0 * cos( (2.0 * PI * target_freq) / SAMPLING_RATE );
     */
    double coefs[ MAX_BINS ] = {
      1.7088388, 1.6339398, 1.5514226, 1.4616719,
      1.1533606, 1.0391679, 0.7968022, 0.5395935,
      -0.6697592, -1.0391679, -1.3651063, -1.7088388
    };


    /*----------------------------------------------------------------------------
     *  post_testing
     *----------------------------------------------------------------------------
     * This is where we look at the bins and decide if we have a valid signal.
     */
    char* post_testing()
    {
      int    row, col, see_digit;
      int    peak_count, max_index;
      double maxval, t;
      int    i;
      char   *row_col_ascii_codes[4][4] = {
             {"1", "2", "3", "A"},
             {"4", "5", "6", "B"},
             {"7", "8", "9", "C"},
             {"*", "0", "#", "D"}};


      /* Find the largest in the row group. */
      row = 0;
      maxval = 0.0;
      for( i=0; i<4; i++ )
      {
        if( r[i] > maxval )
        {
          maxval = r[i];
          row = i;
        }
      }

      /* Find the largest in the column group. */
      col = 4;
      maxval = 0.0;
      for( i=4; i<8; i++ )
      {
        if( r[i] > maxval )
        {
          maxval = r[i];
          col = i;
        }
      }

      /* Check for minimum energy */
      if( r[row] < 4.0e5 || r[col] < 4.0e5 )
      {
        /* energy not high enough */
        return NULL;
      }
      else
      {
        see_digit = 1;

        /* Twist check
         * CEPT => twist < 6dB
         * AT&T => forward twist < 4dB and reverse twist < 8dB
         *  -ndB < 10 log10( v1 / v2 ), where v1 < v2
         *  -4dB < 10 log10( v1 / v2 )
         *  -0.4  < log10( v1 / v2 )
         *  0.398 < v1 / v2
         *  0.398 * v2 < v1
         */
        if( r[col] > r[row] )
        {
          /* Normal twist */
          max_index = col;
          if( r[row] < (r[col] * 0.398) )    /* twist > 4dB, error */
              see_digit = 0;
        }
        else /* if( r[row] > r[col] ) */
        {
          /* Reverse twist */
          max_index = row;
          if( r[col] < (r[row] * 0.158) )    /* twist > 8db, error */
              see_digit = 0;
        }

        /* Signal to noise test
         * AT&T states that the noise must be 16dB down from the signal.
         * Here we count the number of signals above the threshold and
         * there ought to be only two.
         */
        if( r[max_index] > 1.0e9 )
            t = r[max_index] * 0.158;
        else
            t = r[max_index] * 0.010;

        peak_count = 0;
        for( i=0; i<8; i++ ) if( r[i] > t ) peak_count++;
        if( peak_count > 2 ) see_digit = 0;

        return see_digit? row_col_ascii_codes[row][col-4]: NULL;
      }
    }

    static char* NEED_MORE=(char*)1;

    /* goertzel */
    char* goertzel( int sample )
    {
      double q0;
      int    i;

      if( sample_count < GOERTZEL_N )
      {
        sample_count++;
        for( i=0; i<MAX_BINS; i++ )
        {
            q0 = coefs[i] * q1[i] - q2[i] + sample;
            q2[i] = q1[i];
            q1[i] = q0;
        }
        return NEED_MORE;
      }
      else
      {
        for( i=0; i<MAX_BINS; i++ )
        {
          r[i] = (q1[i] * q1[i]) + (q2[i] * q2[i]) - (coefs[i] * q1[i] * q2[i]);
          q1[i] = 0.0;
          q2[i] = 0.0;
        }
        sample_count = 0;
        return post_testing();
      }
    }

    #include <proto/dos.h>
    #include <proto/exec.h>
    #define __NOLIBBASE__
    #define TimerBase (tr->tr_node.io_Device)
    #include <proto/timer.h>
    #include <devices/timer.h>
    #include <stdint.h>

    struct timerequest *open_timer(long unit)
    {
      struct MsgPort *port;
      struct timerequest *req;

      if(port = CreateMsgPort())
      {
        if(req=(struct timerequest*)CreateIORequest(port,sizeof(struct timerequest)))
        {
          if(0 == OpenDevice("timer.device", unit, (struct IORequest*)req, 0))
            return req;
          DeleteIORequest((struct IORequest*)req);
        }
        DeleteMsgPort(port);
      }
      return NULL;
    }
    void start_timer(struct timerequest *req,ULONG secs,ULONG micro)
    {
      if(req)
      {
        req->tr_node.io_Command = TR_ADDREQUEST;
        req->tr_time.tv_secs  = secs;
        req->tr_time.tv_micro = micro;
        SendIO((struct IORequest *)req);
      }
    }
    void end_timer(struct timerequest *req)
    {
      if(req)
      {
        WaitIO((struct IORequest *)req);
      }
    }
    void close_timer(struct timerequest *req)
    {
      struct MsgPort *port;

      if (req)
      {
        CloseDevice((struct IORequest *)req);
        port = req->tr_node.io_Message.mn_ReplyPort;
        DeleteIORequest((struct IORequest *)req);
        DeleteMsgPort(port);
      }
    }

    int main(int x, char**y)
    {
      struct timerequest *tr=open_timer(UNIT_WAITUNTIL);
      struct timeval target, offset={0, 125};// 1e6/8000

      if(!tr) { PrintFault(IoErr(), "Couldn't open timer.device"); return 10; }
      tr->tr_node.io_Command=TR_GETSYSTIME;
      DoIO(&tr->tr_node);
      target=tr->tr_time;
      char* decoded=NULL;
      int check=0;
      volatile uint8_t *parallel_out_mask=(uint8_t*)0xBFE301;
      volatile uint8_t *parallel=(uint8_t*)0xBFE101;
      *parallel_out_mask=0;
      int checkTime=target.tv_secs;
      while(!(SetSignal(0L,0L)&SIGBREAKF_CTRL_C))
      {
        AddTime(&target, &offset);
        start_timer(tr, target.tv_secs, target.tv_micro);
      //VPrintf("wait until { %ld, %ld }\n", (ULONG*)&target);
        signed int sample=*parallel;
        char* _new=goertzel((sample-127)<<8);
        if(_new!=NEED_MORE && _new!=decoded)
          if((decoded=_new)) { PutStr(decoded); Flush(Output()); }
     #if 0
     // mark one second (at least, where it should be one)
        if(checkTime!=target.tv_secs)
        {
          end_timer(tr);
          VPrintf("target time { %ld, %ld }\n", (ULONG*)&target);
          checkTime=target.tv_secs;
          tr->tr_node.io_Command=TR_GETSYSTIME;
          DoIO(&tr->tr_node);
          VPrintf("sys time { %ld, %ld }\n", (ULONG*)&tr->tr_time);
          Flush(Output());
        }
        else
      #endif
          end_timer(tr);
      }
      PutStr("\n");
      close_timer(tr);
      return 0;
    }



[ Dieser Beitrag wurde von MaikG am 12.10.2006 um 23:54 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 00:11 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von MaikG:
Ich wollte das hier mit Storm oder HighSoftC oder SASC
Compilieren, bekomme überall die verschiedenste
fehlermeldung.

'n noch älteren compiler haste wohl nich gefunden, wie?
Nimm vbcc oder gcc.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 08:46 Uhr

gni
Posts: 1106
Nutzer
Zitat:
MaikG:
Ich wollte das hier mit Storm oder HighSoftC oder SASC Compilieren, bekomme überall die verschiedenste fehlermeldung.
StormC meldet 10 Fehler, HighSoft scheint cosinus nicht zu
kennen und SASC erzählt da auch irgendwas.

1) Includes gehören an den Anfang, 2) keiner dieser Compiler kann C99, dh. die kennen stdint.h nicht und können Code und Variablendeklarationen nicht mischen

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 10:06 Uhr

MaikG
Posts: 5172
Nutzer
>'n noch älteren compiler haste wohl nich gefunden, wie?
>Nimm vbcc oder gcc.

vbcc hab ich irgendwie auf PPC geändert, das müsste ich
vermutlich nochmal neu Installieren.
gcc hab ich auch irgendwo, da bin ich mir jedoch nicht sicher
ob das korrekt Installiert ist - muss ich mal probieren.

>1) Includes gehören an den Anfang,

Ja, das weiss ich.

>2) keiner dieser Compiler kann C99, dh. die kennen stdint.h nicht
>und können Code und Variablendeklarationen nicht mischen

Stimmt, einer der Compiler hat gesagt stdint.h nicht gefunden.

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 11:11 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von MaikG:
HighSoft scheint cosinus nicht zu
kennen und SASC erzählt da auch irgendwas.

code:
...

    /*
     * coef = 2.0 * cos( (2.0 * PI * k) / (float)GOERTZEL_N)) ;
     * Where k = (int) (0.5 + ((float)GOERTZEL_N * target_freq) / SAMPLING_RATE));
     *
     * More simply: coef = 2.0 * cos( (2.0 * PI * target_freq) / SAMPLING_RATE );
     */
    double coefs[ MAX_BINS ] = {
      1.7088388, 1.6339398, 1.5514226, 1.4616719,
      1.1533606, 1.0391679, 0.7968022, 0.5395935,
      -0.6697592, -1.0391679, -1.3651063, -1.7088388
    };

...



Der Funktionsprototyp einer Funktion muß vor dem ersten Aufruf bekannt gegeben werden. D.h. hier fehlt der Funktionsprototyp von cos(). Und der ist bekanntlich in math.h definiert.

Fehlt also folgendes:

code:
#include <math.h>


Der Compiler müsste Dir dazu auch eine Warnung ausgeben.
--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 11:36 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von Mad_Dog:
Der Funktionsprototyp einer Funktion muß vor dem ersten Aufruf bekannt gegeben werden.

Soweit richtig.
Zitat:
D.h. hier fehlt der Funktionsprototyp von cos(). Und der ist bekanntlich in math.h definiert.
Was in Kommentaren steht, sollte den compiler überhaupt nicht interessieren.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 11:42 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von gni:
1) Includes gehören an den Anfang,...


Wenn C ein vernünftiges, bzw. überhaupt ein Modulkonzept kennen würde, würde ich, was entsprechende Deklarationen angeht, Dir zustimmen. Bei einem primitven Text-Einfüge und -Ersetzungstool ist das sch...egal, bzw. manchmal auch empfehlenswert, diese Dateien, die mitunter per Makro die unglaublichsten Umdefinitionen vornehmen, möglichst spät einzubinden, um Fehlerquellen zu eliminieren.

Eigentlich handelt es sich bei diesem Quellcode um zwei .c-Dateien, die "jemand" zusammengefügt hat, um nicht noch, eben wegen dem fehlenden Modulkonzept von C, auch noch ein Makefile schreiben zu müssen.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 11:56 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Holger:

Was in Kommentaren steht, sollte den compiler überhaupt nicht interessieren.


Stimmt. Hab den Code nur kurz überflogen. Kommt cos() nicht wirklich vor? Dann dürfte der Compiler sich auch nicht darüber beschweren...

--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 13.10.2006 um 11:56 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 12:59 Uhr

Solar
Posts: 3674
Nutzer
Zitat:
Original von MaikG:
StormC meldet 10 Fehler, HighSoft scheint cosinus nicht zu
kennen und SASC erzählt da auch irgendwas.


Cosinus kommt im von Dir geposteten Quellcode gar nicht vor.

Und ohne die Fehlermeldungen der Compiler wird Dir hier kaum jemand helfen können. "SASC erzählt da auch irgendwas"... die Art, wie Du Deine Probleme präsentierst, läßt arg zu wünschen übrig.

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 15:40 Uhr

MaikG
Posts: 5172
Nutzer
Okay, hab jetzt vbcc nochmal für 68k Installiert und bekomme
genau diese Fehlermeldungen:



13.Work4:vbcc> vc dtmf2.c -lamiga
>typedef signed long long int64_t;
warning 47 in line 7 of "stdint.h": double type-specifier
>typedef unsigned long long uint64_t;
warning 47 in line 20 of "stdint.h": double type-specifier
>typedef signed long long int_least64_t;
warning 47 in line 29 of "stdint.h": double type-specifier
>typedef unsigned long long uint_least64_t;
warning 47 in line 42 of "stdint.h": double type-specifier
>typedef signed long long int_fast64_t;
warning 47 in line 51 of "stdint.h": double type-specifier
>typedef unsigned long long uint_fast64_t;
warning 47 in line 64 of "stdint.h": double type-specifier
>typedef long long intmax_t;
warning 47 in line 78 of "stdint.h": double type-specifier
>typedef unsigned long long uintmax_t;
warning 47 in line 82 of "stdint.h": double type-specifier
> #define NULL 0
error 272 in line 10 of "dtmf2.c": macro 'NULL' redefined unidentically
1 error found!
vbccm68k fehlgeschlagen Rückgabewert 20
vbccm68k -quiet "dtmf2.c" -o= "T:t_13_0.asm" -O=1 -Ivincludeos3: failed


Includes hab ich nach vorne gesetzt und math.h eingefügt.

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 15:45 Uhr

gni
Posts: 1106
Nutzer
Zitat:
MaikG:
Okay, hab jetzt vbcc nochmal für 68k Installiert und bekomme genau diese Fehlermeldungen: [...]

Du hast vergessen den Schalter -c99 zu benutzen.

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 15:49 Uhr

whose
Posts: 2156
Nutzer
@MaikG:

Das "#define NULL 0" aus Deinem Quellcode streichen und beim vbcc-Aufruf in der Shell könnte ein -c99 (korrekt?) nicht schaden, um den C99-Modus des vbcc zu aktivieren. Dann sollte es gehen. Es ginge auch ohne C99, allerdings sollte man sich die int64-Typen dann kneifen (das sind "nur" Warnungen, es käme also schon ein ausführbares Programm dabei heraus). Aktivier C99 aber besser, wenn, dann richtig.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 18:09 Uhr

MaikG
Posts: 5172
Nutzer
@whose

Okay, Null hab ich raus und -c99 mit eingegeben, jetzt kommt
das:

vc dtmf2.c -lamiga -c99
t_12_0.o: In "l19":
Error 21: t_12_0.o (CODE+0x4e): Reference to undefined symbol __ieeecmpd.
t_12_0.o: In "l25":
Error 21: t_12_0.o (CODE+0xb6): Reference to undefined symbol __ieeecmpd.
t_12_0.o: In "l27":
Error 21: t_12_0.o (CODE+0x110): Reference to undefined symbol __ieeecmpd.
t_12_0.o: In "l33":
Error 21: t_12_0.o (CODE+0x14a): Reference to undefined symbol __ieeecmpd.
t_12_0.o: In "l32":
Error 21: t_12_0.o (CODE+0x198): Reference to undefined symbol __ieeecmpd.
t_12_0.o: In "l35":
Error 21: t_12_0.o (CODE+0x202): Reference to undefined symbol __ieeecmpd.
t_12_0.o: In "l36":
Error 21: t_12_0.o (CODE+0x26c): Reference to undefined symbol __ieeecmpd.
t_12_0.o: In "l39":
Error 21: t_12_0.o (CODE+0x2a6): Reference to undefined symbol __ieeecmpd.
t_12_0.o: In "l45":
Error 21: t_12_0.o (CODE+0x34c): Reference to undefined symbol __ieeecmpd.
t_12_0.o: In "l35":
Error 21: t_12_0.o (CODE+0x1e4): Reference to undefined symbol __ieeemuld.
t_12_0.o: In "l36":
Error 21: t_12_0.o (CODE+0x24e): Reference to undefined symbol __ieeemuld.
t_12_0.o: In "l42":
Error 21: t_12_0.o (CODE+0x2e0): Reference to undefined symbol __ieeemuld.
t_12_0.o: In "l43":
Error 21: t_12_0.o (CODE+0x314): Reference to undefined symbol __ieeemuld.
t_12_0.o: In "l64":
Error 21: t_12_0.o (CODE+0x46e): Reference to undefined symbol __ieeemuld.
t_12_0.o: In "l69":
Error 21: t_12_0.o (CODE+0x54a): Reference to undefined symbol __ieeemuld.
Error 21: t_12_0.o (CODE+0x584): Reference to undefined symbol __ieeemuld.
Error 21: t_12_0.o (CODE+0x5dc): Reference to undefined symbol __ieeemuld.
Error 21: t_12_0.o (CODE+0x612): Reference to undefined symbol __ieeemuld.
t_12_0.o: In "l64":
Error 21: t_12_0.o (CODE+0x494): Reference to undefined symbol __ieeesubd.
t_12_0.o: In "l69":
Error 21: t_12_0.o (CODE+0x632): Reference to undefined symbol __ieeesubd.
t_12_0.o: In "l64":
Error 21: t_12_0.o (CODE+0x4a6): Reference to undefined symbol __ieeefltsld.
Error 21: t_12_0.o (CODE+0x4c2): Reference to undefined symbol __ieeeaddd.
t_12_0.o: In "l69":
Error 21: t_12_0.o (CODE+0x5a6): Reference to undefined symbol __ieeeaddd.
vlink fehlgeschlagen Rückgabewert 20
vlink -bamigahunk -x -Bstatic -Cvbcc -nostdlib -Lvlibos3: vlibos3:startup.o "T:t_12_0.o" -lamiga -s -R -lvc -o a.out failed

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 18:52 Uhr

ZeroG
Posts: 1486
Nutzer
@MaikG:
Vergessen die Mathe-Linklibrary beim linken anzugeben?

[ - Antworten - Zitieren - Direktlink - ]

13.10.2006, 19:00 Uhr

MaikG
Posts: 5172
Nutzer
@ZeroG:

oh, tatsache, war schon wieder so lang her mit C.

Okay, Compiliert ist es stürzt aber ab:

LONG-READ from 887A7986 PC: 44B0714E
USP: 44D0C0AC SR: 0004 FLSW: 01010200 TCB: 44B5A590
Data: 443A74C0 00003F88 00000000 00000001 00001000 0000000C 1124A3E9 44B06DB4
Addr: 44C32524 44C32520 44ACC839 443A74C0 443D7CBE 443A4280 44000B40 44D0C0AC
Stck: 0000FFFF 44ACC839 00000000 44000B40 44B071CE 00000014 44ACC839 44394868
Stck: 44B07242 00000014 44ACC839 44B5A590 44000B40 44B06FF2 00000001 443A4290
Stck: 00000000 443A4280 00F9FDEA 00004E20 44B5B0FC 44D0F338 00002920 44D0AAD2
Stck: 6000046C 72003200 7805E8A1 02810000 003F0C81 00000004 6600000C 4EB944D0
Stck: AC966000 044A7200 32007805 E8A10281 0000003F 0C810000 00056600 000C4EB9
Stck: 44D0ABA6 60000428 72003200 7805E8A1 02810000 003F0C81 00000007 6600000C
Stck: 4EB944D0 AD9E6000 04067200 32007805 E8A10281 0000003F 0C810000 000A6600
Stck: 002C4EB9 44D0AE0A 207C44AC A54C2C79 44B08A28 203C8502 50022068 0008227C
----> 44B0714E - "a.out" Hunk 0000 Offset 00000396
----> $44b0714e: TST.L ($443cfcc8.L,A4)
----> 44B071CE - "a.out" Hunk 0000 Offset 00000416
----> $44b071ce: ADDQ.W #$4,A7
----> 44394868 - "a.out" Hunk 0003 Offset 00000000
----> $44394868: ORI.B #$00,D0
----> 44B07242 - "a.out" Hunk 0000 Offset 0000048A
----> $44b07242: ADDQ.W #$4,A7
----> 44B06FF2 - "a.out" Hunk 0000 Offset 0000023A
----> $44b06ff2: MOVEQ #$00,D2
----> 00F9FDEA - "ROM - dos 40.3 (1.4.93)" Hunk 0000 Offset 00000B2E
----> $00f9fdea: MOVEM.L (A7)+,D2-D3
D0--> 443A74C0 - "a.out" Hunk 0004 Offset 00000000
----> $443a74c0: ORI.B #$00,D0
A3--> 443A74C0 - "a.out" Hunk 0004 Offset 00000000
----> $443a74c0: ORI.B #$00,D0
Name: "Shell Process" CLI: "a.out" Hunk 0000 Offset 00000396


[ - Antworten - Zitieren - Direktlink - ]

14.10.2006, 18:10 Uhr

MaikG
Posts: 5172
Nutzer
So ich hab dann nochmal von vorn angefangen, da dieser
Code sowieso nicht mit ReadEClock ist.

Hab jetzt dort ein Problem:

code:
#include <stdio.h>

    #include <exec/exec.h>
    #include <exec/ports.h>
    #include <exec/libraries.h>
    #include <dos/dos.h>
    #include <devices/timer.h>

    #include <proto/dos.h>
    #include <proto/exec.h>


    struct timerequest *TimerIO;
    struct MsgPort *TimerMP;
    struct Message *TimerMsg;

    struct Library *TimerBase;

int main(void)
{

struct timeval ref1, ref2;
        struct EClockVal eclockval;
        unsigned long intervall, ticks;
        long diff;
        LONG error;

        unsigned int repeat = 0;

        TimerMP = (struct MsgPort *)CreatePort(NULL, 0);
        if(!TimerMP)
        {
            Printf("Konnte Timer-Port nicht anlegen!\n");
            exit(RETURN_FAIL);
        }

        TimerIO = (struct timerequest *)CreateExtIO(TimerMP, sizeof(struct timerequest));
        if(!TimerIO)
        {
            Printf("Konnte Timer-IORequest nicht anlegen!\n");
            exit(RETURN_FAIL);
        }

        error = OpenDevice(TIMERNAME, UNIT_WAITECLOCK, (struct IORequest *)TimerIO, 0L);
        if(error)
        {
            Printf("Konnte timer.device nicht öffnen!\n");
            exit(RETURN_FAIL);
        }
        
        TimerBase = (struct Library *)TimerIO->tr_node.io_Device;

        Printf("Gewünschtes Intervall in Hz: ");
        scanf("%lu", &intervall);

        ticks = ReadEClock(&eclockval);
        diff = ticks / intervall; /* Normal müßte man auf - testen */

        Printf("Hi: %lu Lo: %lu\n", eclockval.ev_hi, eclockval.ev_lo);

        /* sehr simpler Überlauf-Test */
        if( ((eclockval.ev_lo) + diff) < eclockval.ev_lo)
        {
            eclockval.ev_hi++;
        }
        else
        {
            eclockval.ev_lo += diff;
        }

        //printf("New Hi: %lu New Lo: %lu\n", eclockval.ev_hi, eclockval.ev_lo);

        TimerIO->tr_node.io_Command = TR_ADDREQUEST;
        TimerIO->tr_time.tv_secs = eclockval.ev_hi;
        TimerIO->tr_time.tv_micro = eclockval.ev_lo;

        SendIO((struct IORequest *)TimerIO);

        GetSysTime(&ref1);

        while(repeat < intervall)
        {
            TimerMsg = WaitPort(TimerMP);
            
            /* Vorsicht, wilde Überläufe ;)  */
            if( ((eclockval.ev_lo) + diff) < eclockval.ev_lo)
            {
                eclockval.ev_hi++;
            }
            else
            {
                eclockval.ev_lo += diff;
            }
            TimerIO->tr_node.io_Command = TR_ADDREQUEST;
            TimerIO->tr_time.tv_secs = eclockval.ev_hi;
            TimerIO->tr_time.tv_micro = eclockval.ev_lo;
            SendIO((struct IORequest *)TimerIO);
            /* hier was sinnvolles tun, sofern vorhanden */
            
            repeat++;
        }    

        GetSysTime(&ref2);

        AbortIO((struct IORequest *)TimerIO);
        WaitIO((struct IORequest *)TimerIO);    

        CloseDevice((struct IORequest *)TimerIO);
        DeleteExtIO((struct IORequest *)TimerIO);
        DeletePort(TimerMP);

        Printf("\n");
        Printf("Intervall(EClock-ticks): %ld\n", ticks / intervall);
        Printf("Referenz 1: %ld %ld\n", ref1.tv_secs, ref1.tv_micro);
        Printf("Referenz 2: %ld %ld\n", ref2.tv_secs, ref2.tv_micro);
        SubTime(&ref2, &ref1);
        Printf("Differenz:  %9ld %ld\n", ref2.tv_secs, ref2.tv_micro);
        
        exit(RETURN_OK);

}


vbcc sagt jetzt:

vc dtmfe.c -lamiga -lmieee -lm040 -lvc -lvcs -c99
> TimerMP = (struct MsgPort *)CreatePort(NULL, 0);
warning 161 in line 222 of "dtmfe.c": implicit declaration of function <CreatePort>
> exit(RETURN_FAIL);
warning 161 in line 226 of "dtmfe.c": implicit declaration of function <exit>
> TimerIO = (struct timerequest *)CreateExtIO(TimerMP, sizeof(struct time
warning 161 in line 229 of "dtmfe.c": implicit declaration of function <CreateExtIO>
> DeleteExtIO((struct IORequest *)TimerIO);
warning 161 in line 301 of "dtmfe.c": implicit declaration of function <DeleteExtIO>
> DeletePort(TimerMP);
warning 161 in line 302 of "dtmfe.c": implicit declaration of function <DeletePort>


[ Dieser Beitrag wurde von MaikG am 14.10.2006 um 18:13 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

14.10.2006, 18:20 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
exit() habe Ich selbst noch nie benutzt, es wird aber irgendwo in den Compiler Includes drinne sein (stdlib.h?), für CreatePort(), das stammt aus der amiga.lib dann mußt du aber noch clib/alib_protos.h includen.


[ Dieser Beitrag wurde von DariusBrewka am 14.10.2006 um 18:21 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

14.10.2006, 18:58 Uhr

whose
Posts: 2156
Nutzer
Edit: Hmpf, irgendwie von der Aktualität überholt worden :lach:

Den Rest des Programms habe ich mir noch nicht näher angesehen, Darius hat aber schon die Sache mit der amiga.lib erwähnt (bzw. das Fehlen der zugehörigen Includes). Eventuell finde ich morgen Zeit, das mal durch den Compiler zu scheuchen und zu testen.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 14.10.2006 um 19:01 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.10.2006, 10:38 Uhr

MaikG
Posts: 5172
Nutzer
>exit() habe Ich selbst noch nie benutzt, es wird aber irgendwo in
>den Compiler Includes drinne sein (stdlib.h?),

Stimmt stdlib.h wars.

>für CreatePort(), das stammt aus der amiga.lib dann mußt du aber
>noch clib/alib_protos.h includen.

Jetzt fällt mir das wieder ein, früher gabs das ja unter exec
noch nicht. Und ich guck extra mit Snoopdos ob er von exec was
evtl. nicht gefunden hat.

Okay, ist Compiliert gibt folgendes aus:

80000
Gewünschtes Intervall in Hz: Hi: 0 Lo: 808747469

Intervall(EClock-ticks): 8
Referenz 1: 908447478 79913
Referenz 2: 908447488 838166
Differenz: 10 758253


Ist das okay?
Das hinter Hz nichts steht sieht etwas komisch aus, aber das muss wohl so.

[ - Antworten - Zitieren - Direktlink - ]

15.10.2006, 13:03 Uhr

Michael_Mann
Posts: 1012
Nutzer
Hmm,

*edit*
C ist schon zu lange her... I-)

Michael




[ Dieser Beitrag wurde von Michael_Mann am 15.10.2006 um 13:04 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.10.2006, 15:46 Uhr

MaikG
Posts: 5172
Nutzer
Mh, okay hab jetzt irgendwie 3 Programme zusammengefügt, compiliert
auch aber keine ausgabe von DTMF.

code:
#include <clib/alib_protos.h>
    #include <clib/exec_protos.h>

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h> 
    #include <exec/exec.h>
    #include <exec/ports.h>
    #include <exec/libraries.h>
    #include <exec/io.h>
    #include <dos/dos.h>

    #include <proto/dos.h>
    #include <proto/exec.h>
    #include <proto/timer.h>
    #include <devices/timer.h>
    #include <stdint.h>
    #include <math.h>

    struct timerequest *TimerIO;
    struct MsgPort *TimerMP;
    struct Message *TimerMsg;
    struct Library *TimerBase;

#define SAMPLING_RATE       8000
#define MAX_BINS            8
#define GOERTZEL_N          92

int    sample_count;
double q1[ MAX_BINS ];
double q2[ MAX_BINS ];
double r[ MAX_BINS ];

/*
 * coef = 2.0 * cos( (2.0 * PI * k) / (float)GOERTZEL_N)) ;
 * Where k = (int) (0.5 + ((float)GOERTZEL_N * target_freq) / SAMPLING_RATE));
 *
 * More simply: coef = 2.0 * cos( (2.0 * PI * target_freq) / SAMPLING_RATE );
 */
double      freqs[ MAX_BINS] = 
{
    697,
    770,
    852,
    941,
    1209,
    1336,
    1477,
    1633
};

double      coefs[ MAX_BINS ] ;


/*----------------------------------------------------------------------------
 *  calc_coeffs
 *----------------------------------------------------------------------------
 * This is where we look calculate the correct co-efficients.
 */

void
calc_coeffs()
{
int n;

  for(n = 0; n < MAX_BINS; n++)
  {
    coefs[n] = 2.0 * cos(2.0 * 3.141592654 * freqs[n] / SAMPLING_RATE);
  }

}

/*----------------------------------------------------------------------------
 *  post_testing
 *----------------------------------------------------------------------------
 * This is where we look at the bins and decide if we have a valid signal.
 */
void
post_testing()
{
int         row, col, see_digit;
int         peak_count, max_index;
double      maxval, t;
int         i;
char *  row_col_ascii_codes[4][4] = {
        {"1", "2", "3", "A"},
        {"4", "5", "6", "B"},
        {"7", "8", "9", "C"},
        {"*", "0", "#", "D"}};


    /* Find the largest in the row group. */
    row = 0;
    maxval = 0.0;
    for ( i=0; i<4; i++ )
    {
        if ( r[i] > maxval )
        {
            maxval = r[i];
            row = i;
        }
    }

    /* Find the largest in the column group. */
    col = 4;
    maxval = 0.0;
    for ( i=4; i<8; i++ )
    {
        if ( r[i] > maxval )
        {
            maxval = r[i];
            col = i;
        }
    }


    /* Check for minimum energy */

    if ( r[row] < 4.0e5 )   /* 2.0e5 ... 1.0e8 no change */
    {
        /* energy not high enough */
    }
    else if ( r[col] < 4.0e5 )
    {
        /* energy not high enough */
    }
    else
    {
        see_digit = TRUE;

        /* Twist check
         * CEPT => twist < 6dB
         * AT&T => forward twist < 4dB and reverse twist < 8dB
         *  -ndB < 10 log10( v1 / v2 ), where v1 < v2
         *  -4dB < 10 log10( v1 / v2 )
         *  -0.4  < log10( v1 / v2 )
         *  0.398 < v1 / v2
         *  0.398 * v2 < v1
         */
        if ( r[col] > r[row] )
        {
            /* Normal twist */
            max_index = col;
            if ( r[row] < (r[col] * 0.398) )    /* twist > 4dB, error */
                see_digit = FALSE;
        }
        else /* if ( r[row] > r[col] ) */
        {
            /* Reverse twist */
            max_index = row;
            if ( r[col] < (r[row] * 0.158) )    /* twist > 8db, error */
                see_digit = FALSE;
        }

        /* Signal to noise test
         * AT&T states that the noise must be 16dB down from the signal.
         * Here we count the number of signals above the threshold and
         * there ought to be only two.
         */
        if ( r[max_index] > 1.0e9 )
            t = r[max_index] * 0.158;
        else
            t = r[max_index] * 0.010;

        peak_count = 0;
        for ( i=0; i<8; i++ )
        {
            if ( r[i] > t )
                peak_count++;
        }
        if ( peak_count > 2 )
            see_digit = FALSE;

        if ( see_digit )
        {
            Printf( "%s", row_col_ascii_codes[row][col-4]);
        }
    }
}



/*----------------------------------------------------------------------------
 *  goertzel
 *----------------------------------------------------------------------------
 */
void
goertzel( int sample )
{
double      q0;
int        i;

    if ( sample_count < GOERTZEL_N )
    {
        sample_count++;
        for ( i=0; i<MAX_BINS; i++ )
        {
            q0 = coefs[i] * q1[i] - q2[i] + sample;
            q2[i] = q1[i];
            q1[i] = q0;
        }
    }
    else
    {
        for ( i=0; i<MAX_BINS; i++ )
        {
            r[i] = (q1[i] * q1[i]) + (q2[i] * q2[i]) - (coefs[i] * q1[i] * q2[i]);
            q1[i] = 0.0;
            q2[i] = 0.0;
        }
        post_testing();
        sample_count = 0;
    }
}


int main(void)
{

struct timeval ref1, ref2;
        struct EClockVal eclockval;
        unsigned long intervall, ticks;
        long diff;
        LONG error;

        unsigned int repeat = 0;

        memset((void *)0xBFE301,0x0,1);

        TimerMP = (struct MsgPort *)CreatePort(NULL, 0);
        if(!TimerMP)
        {
            Printf("Konnte Timer-Port nicht anlegen!\n");
            exit(RETURN_FAIL);
        }

        TimerIO = (struct timerequest *)CreateExtIO(TimerMP, sizeof(struct timerequest));
        if(!TimerIO)
        {
            Printf("Konnte Timer-IORequest nicht anlegen!\n");
            exit(RETURN_FAIL);
        }

        error = OpenDevice(TIMERNAME, UNIT_WAITECLOCK, (struct IORequest *)TimerIO, 0L);
        if(error)
        {
            Printf("Konnte timer.device nicht öffnen!\n");
            exit(RETURN_FAIL);
        }
        
        TimerBase = (struct Library *)TimerIO->tr_node.io_Device;

        Printf("Gewünschtes Intervall in Hz: ");
        scanf("%lu", &intervall);

        ticks = ReadEClock(&eclockval);
        diff = ticks / intervall; /* Normal müßte man auf - testen */

        Printf("Hi: %lu Lo: %lu\n", eclockval.ev_hi, eclockval.ev_lo);

        /* sehr simpler Überlauf-Test */
        if( ((eclockval.ev_lo) + diff) < eclockval.ev_lo)
        {
            eclockval.ev_hi++;
        }
        else
        {
            eclockval.ev_lo += diff;
        }

        //printf("New Hi: %lu New Lo: %lu\n", eclockval.ev_hi, eclockval.ev_lo);

        TimerIO->tr_node.io_Command = TR_ADDREQUEST;
        TimerIO->tr_time.tv_secs = eclockval.ev_hi;
        TimerIO->tr_time.tv_micro = eclockval.ev_lo;

        SendIO((struct IORequest *)TimerIO);

        GetSysTime(&ref1);

        while(repeat < intervall)
        {
            TimerMsg = WaitPort(TimerMP);
            
            /* Vorsicht, wilde Überläufe ;)  */
            if( ((eclockval.ev_lo) + diff) < eclockval.ev_lo)
            {
                eclockval.ev_hi++;
            }
            else
            {
                eclockval.ev_lo += diff;
            }
            TimerIO->tr_node.io_Command = TR_ADDREQUEST;
            TimerIO->tr_time.tv_secs = eclockval.ev_hi;
            TimerIO->tr_time.tv_micro = eclockval.ev_lo;
            SendIO((struct IORequest *)TimerIO);
            /* hier was sinnvolles tun, sofern vorhanden */

/*            BYTE x;
            memmove(&x,(void *)0xBFE101,1);
*/

        volatile uint8_t *parallel=(uint8_t*)0xBFE101;
        signed int sample=*parallel;
        goertzel((sample-127)<<8);

            repeat++;
        }    

        GetSysTime(&ref2);

        AbortIO((struct IORequest *)TimerIO);
        WaitIO((struct IORequest *)TimerIO);    

        CloseDevice((struct IORequest *)TimerIO);
        DeleteExtIO((struct IORequest *)TimerIO);
        DeletePort(TimerMP);

        Printf("\n");
        Printf("Intervall(EClock-ticks): %ld\n", ticks / intervall);
        Printf("Referenz 1: %ld %ld\n", ref1.tv_secs, ref1.tv_micro);
        Printf("Referenz 2: %ld %ld\n", ref2.tv_secs, ref2.tv_micro);
        SubTime(&ref2, &ref1);
        Printf("Differenz:  %9ld %ld\n", ref2.tv_secs, ref2.tv_micro);
        
        exit(RETURN_OK);

}


[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Programm lässt sich nicht compilieren [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2022 by amiga-news.de - alle Rechte vorbehalten.
.