Forum: FPGA, VHDL & Co. Xilkernel message queue problem


von Martin S. (martin91)


Lesenswert?

Hallo!

ich vervende den xilkernel auf einem microblaze prozessor auf einem 
virtex5 fpga. Zur IPC verwende ich message queues, die eigentlich gut 
funktionieren. Das einzige problem das ich habe, ist das ich nur char 
senden kann. Möchte ich zb ein int senden empfange ich nur 0.

hat jemand auch so ein problem? Oder kann mir jemand weiterhelfen? 
Eigentlich sollte man ja jeden typ senden können...

danke
mfg
martin

von Klaus F. (kfalser)


Lesenswert?

Ein bischen Code wäre nett.

von Martin S. (martin91)


Lesenswert?

also das ganze sieht so aus:

die struktur für die nachricht ist im .h file und sieht so aus:
qkey ist im moment ein char, ich hätte es aber gerne als key_t.
1
struct _rxmsgq
2
{
3
  char qflag; 
4
  //key_t qkey; 
5
  char qkey;
6
};
beide threads machen ein msgget mit dem selben key disp_qkey,
thread 1 schreibt die daten in die struktur, die dann gesendet wird,
thread 2 ließt die queue aus:

Thread 1:
1
static struct _rxmsgq disptx;
2
3
disp_msgid = msgget(disp_qkey, IPC_CREAT);
4
5
disptx.qflag=0x0; 
6
disptx.qkey=eth_qkey; //key wird in die struktur geschrieben
7
8
if(msgsnd(disp_msgid, &disptx, RXMSGQ_SIZE, 0) < 0)
9
{
10
         //Errorhandling
11
}
Thread 2:
1
static struct _rxmsgq disprx;
2
3
disp_msgid = msgget(disp_qkey, IPC_CREAT);
4
5
while(1)
6
{
7
//RXMSGQ_SIZE ist im moment 2
8
if(msgrcv(disp_msgid,&disprx,RXMSGQ_SIZE,0,IPC_NOWAIT) == RXMSGQ_SIZE)
9
{
10
      //hier wird die struktur dann ausgelesen und die daten    weiterverarbeitet
11
}
12
}
ich hoffe ich hab das verständlich beschrieben und nichts vergessen! mit 
char typen in der struktur funktioniert ja alles wunderbar, ich fürchte 
nur, dass 1 byte zu klein sein wird und desshalb möchte ich key_t 
senden, weil ich einen key einer anderen message queue senden möchte!

mit int habe ich es auch schon probiert, aber wenn es kein char ist 
empfange ich immer 0.

kann das einfach ein einstellungsproblem im edk sein?
oder liegt das am xilkernel?

danke schon mal im voraus!!

martin

von Klaus F. (kfalser)


Lesenswert?

Wie und wo ist RXMSGQ_SIZE definiert?

von Martin S. (martin91)


Lesenswert?

Klaus Falser schrieb:
> Wie und wo ist RXMSGQ_SIZE definiert?

1
#define RXMSGQ_SIZE 2
So ist es definiert, im .h file wo auch die struktur der nachricht 
definiert ist. key_t ist so weit ich weiß 4 byte lang, den wert von 
RXMSGQ_SIZE habe ich auch auf 5 geändert wie ich versucht habe key_t zu 
senden.

danke für die schnelle antwort!

martin

von Klaus F. (kfalser)


Lesenswert?

Korrekt wäre wohl

#define RXMSGQ_SIZE (sizeof(struct _rxmsgq))

Es ist gesagt, dass der Compiler die 2 chars unbedingt nebeneinander 
packt.

Außerdem :
Es hat zwar mit deinem Problem  nichts zu tun, aber Bezeichner mit _ 
sollte man nicht verwenden, diese sind laut Konvention für 
implementierungsinterne Dinge reserviert.

von Martin S. (martin91)


Lesenswert?

danke für den tipp mit RXMSGQ_SIZE! es funktioniert jetzt!

wenn ich RXMSGQ_SIZE mit 8 definiere dann funktioniert es! wobei ich 
nicht weiß wieso, denn wenn key_t 4 byte hat und ein char 1 byte müsste 
RXMSGQ_SIZE doch eigentlich 5 sein oder? der parameter RXMSGQ_SIZE gibt 
ja die größe der nachricht an?

danke

martin

von Martin S. (martin91)


Lesenswert?

Klaus Falser schrieb:
> Korrekt wäre wohl
>
> #define RXMSGQ_SIZE (sizeof(struct _rxmsgq))
>
> Es ist gesagt, dass der Compiler die 2 chars unbedingt nebeneinander
> packt.
>
> Außerdem :
> Es hat zwar mit deinem Problem  nichts zu tun, aber Bezeichner mit _
> sollte man nicht verwenden, diese sind laut Konvention für
> implementierungsinterne Dinge reserviert.

danke für die antwort!
mit sizeof() ist das natürlich am einfachsten gemacht!

danke und lg
martin

von Klaus F. (kfalser)


Lesenswert?

Klaus Falser schrieb:
> Es ist gesagt, dass der Compiler die 2 chars unbedingt nebeneinander
> packt.

Eigentlich wollte ich schreiben :
Es ist NICHT gesagt, dass der Compiler die 2 chars unbedingt 
nebeneinander
packt.

von Klaus F. (kfalser)


Lesenswert?

Martin S. schrieb:
> wenn wenn key_t 4 byte hat und ein char 1 byte müsste
> RXMSGQ_SIZE doch eigentlich 5 sein oder?

Das wurde in diesen Foren sicher schon öfter diskutiert.
Auf einem 32 Bit Prozessor werden die einzelnen Elemente einer Struktur 
meist an 32 Bit Grenzen ausgerichtet.
Das bedeutet das JEDES Element immer ein Vielfaches von 4 Byte benötigt.
Dies wird aus Performance Gründen gemacht, weil der Prozessor, bzw. die 
Hardware sowieso immer 4 Bytes liest.
Dieses Verhalten kann man meistens auch abschalten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
Lade...