Illegal instruction



  • hallo allerseits,
    ich habe eine problem was mich seit 2 Tagen ohne Schlaf lässt vielleicht ist da jemand der mir helfen kann.
    ich arbeite gerade an HW projekt, in dem ich ein analoges Signal abtaste und die Daten einfach in einem Puffer ablege, dafür habe ich eine ADC platine entwickelt, die ich mit der Parallelinterface von stamp 537 (ist eine DSP Board unter uClinux) verbunden habe.
    Das Problem ist folgendes :
    die Daten werden richtig gelesen aber nach einiger Zeit ( manchmal dauert es lang) wird meine Anwendung unterbrochen ,Der code zum lesen ist folgendes:

    while (1)
    {
    bytes_read = read( ppiFD, (char *)pData, pDataSize );
    pt1=pData;
    for (pData,i=0;pData<pt1+LINELEN;pData++,i++)
    { printf("pData[%i]=%d\n",i,*pData);}
    //sleep(2);
    }
    return(0);
    }

    pData ist ein Zeiger auf den mit malloc reservierten Puffer und p1 ist auch richtig deklariert.

    ich denke etwas ist an die for Schleife nicht ganz Sauber weil wenn ich sie durch die folgende for schleife ersetze läuft das programm ohne unterbrechung

    for(i = 0; i < 1000; i++)
    {
    printf("pData[%i]: %d \n", i, (pData + isizeof(unsigned short)));
    }

    der Puffer hat eine Länge von 1000= LINELEN.
    die Ausgabe sieht so aus:
    pData[26]=8
    pData[27]=8
    pData[28]=8
    pData[29]=8
    pData[30]=8
    pData[31]=8
    pData[32]=7
    pData[33]=7
    pData[34]=8
    pData[35]=8
    pData[36]=8
    pData[37]=8
    pData[38]U7ndpDefa[in]=ed
    p itans0]tr
    ucatti41on
    p -ta M2]ay
    edDa t[4o =8empDula[at]=e
    pintast6]ru
    tDaha[4t =8arpDe a[no]=t
    pdetafi0]ne
    8 atfo51r

    p ata p2]ar
    r Dapr[5oc=8essor implementation.

    CURRENT PROCESS:

    COMM=ppi-youn PID=30
    TEXT = 0x03608040-0x0360b4e0 DATA = 0x0360b4e4-0x0360c8c4
    BSS = 0x0360c8c4-0x0360cb14 USER-STACK = 0x0360ff7c

    return address: 0x03608258; contents of [PC-16...PC+8]:
    0008 0007 0007 0008 0008 0008 0008 0008
    0007 0008 0007 0008 0008 0008 0008 0008 X
    0008 0008 0008 0008 0007 0008 e100 c518

    RETE: 00000000 RETN: 0350e000 RETX: 03608258 RETS: 0360826c
    IPEND: 0030 SYSCFG: 0036
    SEQSTAT: 00000021 SP: 0350df24
    R0: 0000000b R1: 0000000b R2: 00000002 R3: 0000000b
    R4: 00000001 R5: 0360cb10 R6: 00000003 R7: 00000001
    P0: 00000004 P1: 0000007f P2: 036080d6 P3: 000000c8
    P4: 0360c8e0 P5: 0360819c FP: 0360fefc
    A0.w: 00000000 A0.x: 00000000 A1.w: 00000000 A1.x: 00000000
    LB0: 03609495 LT0: 03609492 LC0: 00000000
    LB1: 00000001 LT1: 00000000 LC1: 00000000
    B0: 00000000 L0: 00000000 M0: 00000000 I0: 0360c514
    B1: 00000000 L1: 00000000 M1: 00000000 I1: 00000004
    B2: 00000000 L2: 00000000 M2: 00000000 I2: 00000000
    B3: 00000000 L3: 00000000 M3: 00000000 I3: 00000000

    USP: 0360fef0 ASTAT: 02000020
    DCPLB_FAULT_ADDR=0360c8e0
    ICPLB_FAULT_ADDR=03608258

    Hardware Trace:
    0 Target : <0x00004e3c> { _trap_c + 0x0 }
    Source : <0x00008778> { _exception_to_level5 + 0xb4 }
    1 Target : <0x000086c4> { _exception_to_level5 + 0x0 }
    Source : <0x000086c2> { _ex_trap_c + 0x4e }
    2 Target : <0x00008674> { _ex_trap_c + 0x0 }
    Source : <0x00008818> { _trap + 0x28 }
    3 Target : <0x000087f0> { _trap + 0x0 }
    Source : <0x03608278> [ ppi-youn + 0x278 ]
    4 Target : <0x0360826c> [ ppi-youn + 0x26c ]
    Source : <0x03608472> [ ppi-youn + 0x472 ]
    5 Target : <0x0360846e> [ ppi-youn + 0x46e ]
    Source : <0x036089ce> [ ppi-youn + 0x9ce ]
    6 Target : <0x036089c4> [ ppi-youn + 0x9c4 ]
    Source : <0x0360899c> [ ppi-youn + 0x99c ]
    7 Target : <0x03608996> [ ppi-youn + 0x996 ]
    Source : <0x036086a6> [ ppi-youn + 0x6a6 ]
    8 Target : <0x03608694> [ ppi-youn + 0x694 ]
    Source : <0x03609824> [ ppi-youn + 0x1824 ]
    9 Target : <0x0360981c> [ ppi-youn + 0x181c ]
    Source : <0x036097d0> [ ppi-youn + 0x17d0 ]
    10 Target : <0x036097ce> [ ppi-youn + 0x17ce ]
    Source : <0x03608582> [ ppi-youn + 0x582 ]
    11 Target : <0x03608576> [ ppi-youn + 0x576 ]
    Source : <0x03609768> [ ppi-youn + 0x1768 ]
    12 Target : <0x03609760> [ ppi-youn + 0x1760 ]
    Source : <0x03609700> [ ppi-youn + 0x1700 ]
    13 Target : <0x036096fe> [ ppi-youn + 0x16fe ]
    Source : <0x03609720> [ ppi-youn + 0x1720 ]
    14 Target : <0x03609714> [ ppi-youn + 0x1714 ]
    Source : <0x0360a364> [ ppi-youn + 0x2364 ]
    15 Target : <0x0360a35c> [ ppi-youn + 0x235c ]
    Source : <0x0360a34e> [ ppi-youn + 0x234e ]
    Stack from 0350df04:
    00000000 0000877c 0012678c 0012678c 00126788 0000000b 0000000b 0360a346
    03608258 00000030 00000021 00000000 0350e000 03608258 03608258 0360826c
    0000000b 02000020 00000001 03609495 00000000 03609492 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000004 0360c514 0360fef0 0360fefc 0360819c 0360c8e0
    Call Trace:

    pData[55]=8
    pData[56]=8
    pData[57]=8
    pData[58]=8
    pData[59]=8
    pData[60]=8
    pData[61]=7
    pData[62]=7
    pData[63]=8
    pData[64]=8
    pData[65]=7
    pData[66]=8
    pData[67]=8
    pData[68]=8
    pData[69]=8
    pData[70]=7
    pData[71]=8
    pData[72]=8
    pData[73]=7
    pData[74]=8
    pData[75]=8
    pData[76]=8
    pData[77]=8
    pData[78]=8
    pData[79]=8
    pData[80]=8
    pData[81]=8
    pData[82]=7
    pData[83]=8
    pData[84]=8
    pData[85]=8
    pData[86]=7
    pData[87]=7
    pData[88]=8
    pData[89]=8
    pData[90]=7
    pData[91]=7
    pData[92]=7
    pData[93]=7
    pData[94]=8
    pData[95]=8
    pData[96]=7
    pData[97]=8
    pData[98]=8
    pData[99]=8
    pData[0]=7
    Illegal instruction



  • Schon mal das ganze mit valgrind laufen lassen?



  • Hallo,

    hast Du das mittlerweile gelösst?

    Bin grad nur zufällig drübergestossen, habs auch nicht länger angeschaut jetzt, aber eins is mir aufgefallen, das könnte schon der Fehler sein: In der oberen Schleife wird die Variable pData incrementiert. Also wirst Du beim nächsten read() in einen anderen Speicherbereich einlesen. Da es mit while(1) eine Endlosschleife ist, kommst Du sicher irgendwann zu Speicher, der nicht allokiert ist.

    In der unteren Variante wird pData hingegen nicht verändert.

    uli


Anmelden zum Antworten