Forum: Mikrocontroller und Digitale Elektronik Kerne von Prozessor ansteuern


von TM F. (p_richner)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

Ich habe ein XK-1A Development Kit. Ich will mit xTIMEcomposer studio 
ein einfaches Programm schreiben, in dem ich mehrere Kerne(Prozessor hat 
8 Kerne) benutze. Hier ist mein Programm:
1
#include <xs1.h>
2
#include <stdio.h>
3
#include <platform.h>
4
5
out port led1 = XS1_PORT_4F;
6
7
on stdcore[0] : in port button1 = XS1_PORT_1K;
8
on stdcore[1] : in port button2 = XS1_PORT_1L;
9
10
11
int main(void)
12
{
13
        while(1)
14
        {
15
            button1 when pinseq(0) :> void;
16
                led1 <: 0b1100;
17
18
            button1 when pinseq(1) :> void;
19
                led1 <: 0;
20
21
            button2 when pinseq(0) :> void;
22
                led1 <: 0b0011;
23
24
            button2 when pinseq(1) :> void;
25
                led1 <: 0;
26
        }
27
}

Mit dem Befehl pinseq(0) warte ich, bis der Taster "button1" gedrückt 
wurde(Taster sind low-active). Danach leuchten "LED1" und "LED2". Bei 
pinseq(1) warte ich, bis der Taster "button1" losgelassen wurde und 
danach werden alle LEDs ausgeschalten. Dasselbe mache ich mit Taster 
"button2", schalte jedoch "LED3" und "LED4" ein und aus. Mit den zwei 
Kernen möchte ich bezwecken, dass ich die Taster unabhängig voneinander 
drücken kann und nicht die Reihenfolge abarbeiten muss(pinseq() 
blockiert Programm, bis Bedingung erfüllt ist).

Mein Problem ist: wenn ich alles mit Kern0 (stdcore[0]) mache, 
funktioniert es, muss aber die Reihenfolge abarbeiten. Möchte ich aber 
Kern1(stdcore[1]) für "button2" benützen, gibt er einen Fehler aus(siehe 
Anhang).

Weiter Infos zum Kerne-Programmieren sind hier ab Seite 30:
1
https://www.xmos.com/download/public/XC-Programming-Guide(X1009B).pdf

Danke Für eure Hilfe
Gruss prichner

PS. Ich hoffe ihr versteht mein Problem ;)

: Verschoben durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Philipp Richner schrieb:
> PS. Ich hoffe ihr versteht mein Problem ;)
Das FPGA-Forum ist nicht das Richtige für dich...
Ich verschiebe den Thrad zu uC&Elektronik. Das passt besser.

von Peter II (Gast)


Lesenswert?

Philipp Richner schrieb:
> PS. Ich hoffe ihr versteht mein Problem ;)

nein vermutlich nicht.

Vorweg: Ich kenne die CPU nicht.

Aber mit einen Kern kann man (fast) beliebige Anzahl von Taster 
abfragen, man muss nur Funktionen Verwenden die nicht blockieren. Und 
ein C Programm läuft erst mal nur ein einen Thread - also auf einen Kern 
(die Verteilung von Threads auf Kerne übernimmt das BS).

Wenn die wirklich mehre dinge gleichzeitig machen willst, dann muss das 
mit Threads machen - aber damit handelt man sich auch neue Probleme ein.

Suche also lieber, eine Möglichkeit die Taster sinnvoller abzufragen. 
Was willst du sonst machen wenn du mal einen Tastatur mit 104 Tasten 
abfragen willst - 104 Kerne gibt es noch nicht.

von TM F. (p_richner)


Lesenswert?

Es geht mehr darum, WIE man die Kerne ansteuert. Das mit den Tastern ist 
nur zum ausprobieren, ob es geht. Ich möchte wissen, wie die 
Konfiguration ist, um die Kerne einzeln zuzuteilen, damit später das 
Wissen vorhanden ist.
Weiter Infos zu Hardware, etc. sind hier :
1
https://www.xmos.com/products/xkits/starter#xk-1a-development-kit

von GB (Gast)


Lesenswert?

[c]
/...
int main(void)
{
        while(1)
        par {                                //par fehlt!
            button1 when pinseq(0) :> void;
                led1 <: 0b1100;

            button1 when pinseq(1) :> void;
                led1 <: 0;

            button2 when pinseq(0) :> void;
                led1 <: 0b0011;

            button2 when pinseq(1) :> void;
                led1 <: 0;
        }
}

von GB (Gast)


Lesenswert?

1
/...
2
int main(void)
3
{
4
        while(1)
5
        {
6
        par {                                //par fehlt!
7
            button1 when pinseq(0) :> void;
8
                led1 <: 0b1100;
9
10
            button1 when pinseq(1) :> void;
11
                led1 <: 0;
12
13
            button2 when pinseq(0) :> void;
14
                led1 <: 0b0011;
15
16
            button2 when pinseq(1) :> void;
17
                led1 <: 0;
18
            }
19
        }
20
}

Muss natürlich so sein, Klammerebene vergessen.

von GB (Gast)


Lesenswert?

Sorry, immer noch ein Fehler, genaues steht auf S. 30 im Programing 
Guide.

von TM F. (p_richner)


Lesenswert?

Mittlerweile habe ich eine Lösung gefunden:
1
#include <xs1.h>
2
#include <stdio.h>
3
#include <platform.h>
4
5
on stdcore[0] : out port led1 = XS1_PORT_4A;
6
on stdcore[0] : out port led2 = XS1_PORT_1D;
7
8
on stdcore[0] : in port button1 = XS1_PORT_1K;
9
on stdcore[0] : in port button2 = XS1_PORT_1L;
10
11
void fooA();
12
void fooB();
13
14
int main(void)
15
{
16
    par{
17
        fooA();
18
        fooB();
19
    }
20
    return 0;
21
}
22
void fooA()
23
{
24
    while(1)
25
    {
26
27
        button1 when pinseq(0) :> void;
28
            led1 <: 0b1111;
29
30
        button1 when pinseq(1) :> void;
31
            led1 <: 0;
32
    }
33
}
34
35
void fooB()
36
{
37
    while(1)
38
    {
39
        button2 when pinseq(0) :> void;
40
            led2 <: 1;
41
42
        button2 when pinseq(1) :> void;
43
            led2 <: 0;
44
45
    }
46
}

Man kann die Ports vom Ausgang manuell noch verändern, wenn man dies 
will.

Danke für die Hilfe
prichner

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.