Forum: Mikrocontroller und Digitale Elektronik Assembler Code in *.c File integrieren, nur wie im CCE?


von Samur (Gast)


Lesenswert?

In meinem C-Büchlein welches ich habe, steht, dass man Assembler Code 
ganz einfach in einem *.c File einbinden kann, nämlich so:
1
asm("instruction");

Nur leider funktioniert das in meinem Code Composer V3 nicht.
Es gibt beim Kompilieren eine Fehlermeldung.

Weiss jemand von euch wie man das im CCE machen kann?

von GAST (Gast)


Lesenswert?

prinzipiell ist asm(); erstmal eine Funktion, ohne die Fehlermeldung 
jetzt zu kennen ist es evt möglich, dass Du die entsprechende lib mit 
dieser funktion vergessen hast!?

von Christian R. (supachris)


Lesenswert?

Also bei mir klappt das. CCE V3

asm("nop"); wird problemlos übersetzt.

von Samur (Gast)


Lesenswert?

Bei mir bringt er die Fehler:


"Illegal mnemonic specified"
mov  #0xFFFE,R12

"Symbol mov has already been defined"
mov  @R12,PC

"Illegal mnemonic specified"
mov  @R12,PC


PS: Wie kann man im CCE bequem nachschauen wie viel Flash das Programm 
benötigt?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Das sit aber kein Fehler vom Compiler sondern vom assembler der deine 
Anweisungen nicht versteht oder der Meinung ist das was falsch ist.
Fang erstmal mit minimalbeispiel (nop) an, und dann Zeile für Zeile dein 
ASM rein.

von Samur (Gast)


Lesenswert?

Ist merkwürdig.
Also mit "nop" funktioniert es.

Es ist eben so, dass ich vorher IAR Workbench benutzte und da 
funktionierte dies super.

Muss ich das jetzt versuchen umzuschreiben?

von Tobias K. (kurzschluss81)


Lesenswert?

C ist jetzt seit CCE V3 im CCE und in IAR gleich
aber Asembler wird in CCE teilweise andsers umgesetzt als in IAR.
Du must deine ASM Befehle an CCE anpassen

von Samur (Gast)


Lesenswert?

Hmm, und wie mache ich das?
Hab von Assembler keine Ahnung.

Die Funktion ist einfach die, dass der ProgramCounter an den absoluten 
Programmanfang springt, also vor die Initialisierung der Variablen etc.

von Christian R. (supachris)


Lesenswert?

Also ein "Kaltstart"? Kannst ja auch den Watchdog abschießen, dann hast 
du einen kompletten Neustart...
z.B. mit

WDTCTL = 0xDEAD;

Problem an deinem Code ist, dass er nicht atomar ist, der C-Compiler 
kann also im ungünstigsten Fall die Befehle so verteilen, dass sie nicht 
direkt hintereinander stehen....du müsstest dann eine extra asm-Datei 
schreiben, da eine Funktion deklarieren und diese dann aus C aufrufen. 
Wie das geht, steht im User Guide des CCE v3.

Achso, CCE zeigt leider erst beim Flashen an, wie groß der Code geworden 
ist....hab da auch noch nix anderes gefunden. Höchstens TI-txt file 
erzeugen lassen und nachschauen....

von Christian R. (supachris)


Lesenswert?

Übrigens, so klappts im CCE:
1
asm(" mov.w #0xFFFE,R12");

Wichtig ist der Freiraum vor dem mov. Auszug aus dem User Guide:

"The inserted code must be a legal assembly language statement. Like all 
assembly language statements, the line of code inside the quotes must 
begin with a label, a blank, a tab, or a comment (asterisk or 
semicolon)."

von Samur (Gast)


Lesenswert?

Hey super, danke.

Mit dem Leerschlag funktioniert es.

von Samur (Gast)


Lesenswert?

Nur so aus Interesse:
was ist der Unterschied zwischen "mov" und "mov.w" ? Spielt das eine 
Rolle?

von Christian R. (supachris)


Lesenswert?

Nee, mov ist an sich schon 16 Bit. Gibt aber auch noch mov.b für 8-Bit 
Zugriffe. Mov.w wäre Word-Zugriff.

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.