Forum: Compiler & IDEs Atmel SAME70 (Cortex-M7) unter linux ans Laufen bringen..


von Florian O. (simuru)


Lesenswert?

Ein schönen Sonntag euch allen.

Ich versuche nun seit längerem mein Atmel Xplained Eval-Board mit dem 
SAME70Q21 unter Linux ans laufen zu bringen. Erste Versuche mit den 
GNU-ARM-Eclipse Plugins scheiterten gnadenlos. Deswegen Versuche ich es 
im Moment manuell. Und habe nun mir unerklärliches Verhalten beobachten 
können. Wenn ich über gdb den Wert einer Variable auslese ist es immer 
der Initialisierungswert und ändert sich nie.

Rahmenbedingunen:
HW: JLink V8 (Alte EDU Version)
OpenOCD: 0.10.00 (aktuelles release)
GCC: gcc-arm-none-eabi-4.9 in der 2015 q3 Version

Ich habe ein Atmel Studio 7.0 Projekt genomment (CHIPID_EXAMPLE) und das 
Makefile angepasst, dass es unter Linux kompiliert -- also nur Pfade 
angepasst und es lief. Ich benutze also das Linker Script von Atmel und 
auch die entsprechenden Startup und Syscall Routinen/Dateien.


Das ganze kompiliert ordentlich ohne Fehler durch. Ich starte OpenOCD 
eine Telnet Sessiond und gdb.

Meine Main (chipid_example.c) sieht nun so aus: (habe viel gelöscht um 
ein minimal-projekt zu haben):

1
volatile int i=0;
2
volatile int cvar=15;
3
volatile int funky_variable = 123;
4
5
int fn(int v)
6
{
7
   return (v++);
8
}
9
int main(void)
10
{
11
   /* Initialize the system */
12
   sysclk_init();
13
   board_init();
14
   i = 0x2;
15
   i = 0x2;
16
17
   i = cvar;
18
19
   i = fn(cvar);
20
21
   funky_variable = fn(i);
22
23
   while (1) 
24
   {
25
   }
26
}

geflasht wird über gdb:
1
(gdb): mon flash write_bank 0 CHIPID_EXAMPLE1.bin 0
2
>> wrote 9352 bytes from file CHIPID_EXAMPLE1.bin to flash bank 0 at offset 0x00000000 in 0.349893s (26.102 KiB/s)
3
4
(gdb): mon reset halt
5
>> target halted due to debug-request, current mode: Thread                                                            >> xPSR: 0x01000000 pc: 0x00400f5c msp: 0x20402918
6
7
(gdb): load
8
>> Loading section .text, size 0x1c3c lma 0x400000
9
>> Loading section .relocate, size 0x84c lma 0x401c3c
10
>> Start address 0x400f5c, load size 9352
11
>> Transfer rate: 5 KB/sec, 4676 bytes/write.
12
13
(gdb): break chipid_example.c:403
14
>> Breakpoint 1 at 0x40129c: file ../src/chipid_example.c, line 403.
15
16
(gdb): continue
17
>> Breakpoint 1, main () at ../src/chipid_example.c:403

Der Breakpoint in Zeile 403 entspricht der ersten i = 0x2; Anweisung 
nach board_init(); Von diesem Zeitpunkt an kann ich im single-step 
Verfahren durch mein Programm gehen und mir die Werte von
1
i, cvar und funky_variable
 anschauen.
Dabei würde ich erwarten, dass sich die Werte ändern, aber sie bleiben 
immer bei ihrer Initialisierung sprich:
i = 0,
cvar = 15,
funky_variable = 123

Die Zuweisungen scheinen nichts zu machen. Wenn ich im single-step bis 
in die Funktion fn() gehe ich mir dort die lokale variable v ausgeben 
lasse, hat diese den un-initialisierten Wert von 541075....

Hier noch ein Auszug:
1
│(gdb) s
2
│406        i = cvar;
3
│(gdb) p i
4
│$41 = 0
5
│(gdb) s
6
│408        i = fn(cvar);
7
│(gdb) s
8
│fn (v=541075696) at ../src/chipid_example.c:396
9
│396        return (v++);
10
│(gdb) p v
11
│$42 = 541075696                                                                                                                    │(gdb)

Wenn ich nun über Telnet den Speicherbereich von i beschreibe und mir 
dann über gdb i ausgeben lasse hat i den Wert den ich vorher zugewiesen 
habe.

(
1
$43 = (volatile int *) 0x204008dc <i>
)
Telnet: mww 0x204008DC 0x09 1

Deswegen vermute ich, dass mein Debugger-Setup (OpenOCD config etc) 
passt aber ich habe keine Ahnung was da sonst schief laufen könnte.

Kann mir jemand ein Tipp geben?
braucht ihr noch mehr Infos?

Ein schönen Sonntag an alle und schonmal danke fürs Lesen.

von Dennis R. (dennis_r93)


Lesenswert?

Hast du mal den Inhalt vom Flash zurückgelesen und verglichen?
Ich kann mir vorstellen, dass der Flashvorgang nicht korrekt ablief. 
Dass der richtige Code angezeigt wird könnte daran liegen, dass der gdb 
den Code zwischenspeichert.

Hast du dir mal das Disassembly angeschaut und den Registerinhalt?
Mache das mal und steppe dabei nicht durch den C-Code sondern durch die 
Assembler Befehle.

Das ist aber alles nur geraten.

von Florian O. (simuru)


Lesenswert?

Dennis R. schrieb:
> Hast du mal den Inhalt vom Flash zurückgelesen und verglichen?
> Ich kann mir vorstellen, dass der Flashvorgang nicht korrekt ablief.

Wenn ich ein flash verify mache sagt er, dass alles korrekt ist:
1
(gdb) mon flash verify_bank 0 CHIPID_EXAMPLE1.bin 0
2
read 9352 bytes from file CHIPID_EXAMPLE1.bin and flash bank 0 at offset 0x00000000 in 0.140940s (64.799 KiB/s)
3
contents match

Im Listing steht (CHIPD_EXAMPLE1.lss):
1
   i = 0x2;
2
  40129c:  4b0f        ldr  r3, [pc, #60]  ; (4012dc <main+0x4c>)
3
  40129e:  2202        movs  r2, #2
4
  4012a0:  601a        str  r2, [r3, #0]
5
   i = 0x2;
6
  4012a2:  4b0e        ldr  r3, [pc, #56]  ; (4012dc <main+0x4c>)
7
  4012a4:  2202        movs  r2, #2
8
  4012a6:  601a        str  r2, [r3, #0]
9
10
   i = cvar;
11
  4012a8:  4b0d        ldr  r3, [pc, #52]  ; (4012e0 <main+0x50>)
12
  4012aa:  681b        ldr  r3, [r3, #0]
13
  4012ac:  4a0b        ldr  r2, [pc, #44]  ; (4012dc <main+0x4c>)
14
  4012ae:  6013        str  r3, [r2, #0]
15
16
   i = fn(cvar);
17
  4012b0:  4b0b        ldr  r3, [pc, #44]  ; (4012e0 <main+0x50>)
18
  4012b2:  681b        ldr  r3, [r3, #0]
19
  4012b4:  4618        mov  r0, r3
20
  4012b6:  4b0b        ldr  r3, [pc, #44]  ; (4012e4 <main+0x54>)
21
  4012b8:  4798        blx  r3
22
  4012ba:  4602        mov  r2, r0
23
  4012bc:  4b07        ldr  r3, [pc, #28]  ; (4012dc <main+0x4c>)
24
  4012be:  601a        str  r2, [r3, #0]

Als Assembler unwissender muss ich gleich kurz ein wenig lesen um zu 
verifizieren, dass das passt ;)

von Markus F. (mfro)


Lesenswert?

Das Ding hat einen Data-Cache (in den die CPU - hoffentlich - auch brav 
reinschreibt).

Probier' mal mit "Cache aus".

von Florian O. (simuru)


Lesenswert?

Markus F. schrieb:
> Das Ding hat einen Data-Cache (in den die CPU - hoffentlich - auch brav
> reinschreibt).


Gelesen hatte ich das schon nur gedanklich völlig aussen vor gelassen, 
in der dummen Annahme, dass die Daten die ich über SWD lese eben nicht 
ge-cached werden.

mit
1
SCB_DisableDCache();
funktioniert es auch..


Jetzt habe ich wenigstens eine funktionierende Referenz und weiß dass es 
ansich läuft und kann mit Eclipse weiter schauen.

Vielen Dank euch beiden!

von NoName (Gast)


Lesenswert?

Ich habe das gleiche unter Linux gemacht, allerdings mit Embedded 
Studio:
https://www.segger.com/embedded-studio.html

Das hat sofort funktioniert. Wenn du eh schon einen SEGGER J-Link hast 
wäre das vielleicht auch eine Alternative für dich.

von Florian O. (Gast)


Lesenswert?

Hey NoName,

daran hatte ich auch schon gedacht, aber ich befürchte das wird mit 
meinem alten JLink nicht gehen.

Das Embedded Studio bietet zwar in der kostenfreien Version Support für 
meinen M7 an, aber der JLink nicht. Beim Atmel Studio und den JLink 
Tools unter Windows kommt dann die schöne Meldung
1
"Device not supported."
.
Daher glaube ich nicht, dass es damit klappt und möchte deswegen 
generell vom Atmel Studio, Windows, und den Segger JTools weg.

Unter Linux setze ich für die meisten Sachen die IDE von QT (QTCreator) 
ein, scheue mich aber noch vor dem Konfigurationsaufwand und hielt 
bisher Eclipse für eine sinnvolle Alternative - mal schauen wie sich das 
noch entwickelt.

von NoName (Gast)


Lesenswert?

Florian O. schrieb:
> Das Embedded Studio bietet zwar in der kostenfreien Version Support für
> meinen M7 an, aber der JLink nicht. Beim Atmel Studio und den JLink
> Tools unter Windows kommt dann die schöne Meldung"Device not supported."

Die Meldung kommt aber dann von AtmelStudio und nicht vom J-Link. Der 
J-Link EDU wird auch den Cortex-M7 unterstützen.
Daher gibt es keinen Grund die Segger Tools nicht einzusetzen.

Florian O. schrieb:
> Unter Linux setze ich für die meisten Sachen die IDE von QT (QTCreator)
> ein, scheue mich aber noch vor dem Konfigurationsaufwand und hielt
> bisher Eclipse für eine sinnvolle Alternative - mal schauen wie sich das
> noch entwickelt.
Aber ok, man kann sich das Leben auch schwer machen ;-).
Wenn ich mein Auto reparieren will baue ich auch erst mal Gießerei, um 
meine Werkzeuge selber herzustellen.

von Florian O. (Gast)


Lesenswert?

NoName schrieb:
> Die Meldung kommt aber dann von AtmelStudio und nicht vom J-Link. Der
> J-Link EDU wird auch den Cortex-M7 unterstützen.
> Daher gibt es keinen Grund die Segger Tools nicht einzusetzen.

Richtig.

Aber laut: 
https://www.segger.com/admin/uploads/productDocs/UM08001_JLink.pdf
Seite 34, unterstützt der JLink EDU in der HW-Rev. 8.0 den Cortex-M7 
nicht mehr. Das es doch geht, sehe ich ja mit OpenOCD - aber ich warum 
sollte Seggers IDE das weiter unterstützen und Atmel nicht?

von NoName (Gast)


Lesenswert?

Das hängt nicht von EDU oder nicht EDU ab sondern von der Hardware 
Revision. Ab V9 wird Cortex-M7 unterstützt. Welche HW-Rev. hast du denn?

von Florian O. (Gast)


Lesenswert?

Florian O. schrieb:
> *snip*
> Rahmenbedingunen:
> HW: JLink V8 (Alte EDU Version)
> *snip*

Florian O. schrieb:
> snip unterstützt der JLink EDU in der HW-Rev. 8.0 den Cortex-M7
> nicht mehr *snip*

Rev. 8 ;) mit der aktuellsten firmware die es für diese Version noch gab 
- im kopf hab ich sie grad nicht. aber sollte auch keine rolle spielen

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.