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 atfo51rp 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 = 0x0360ff7creturn 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 c518RETE: 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: 00000000USP: 0360fef0 ASTAT: 02000020
DCPLB_FAULT_ADDR=0360c8e0
ICPLB_FAULT_ADDR=03608258Hardware 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