mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM7 Eclipse / Debuggen geht, flashen nicht?


Autor: Dominik Gaeta (niknik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Nach dem Schreiben des Programms in den Flash läuft das Prg. beim 
Debuggen. Aber alleine auf dem Rechner läuft es nicht.

Software: Eclipse
Hardware: Olimex-USB-Tiny u. Olimex-Entwicklungsboard für AT91SAM7S64.
Compiler: arm-elf-gcc

Muss man eventuell irgendwo den Debugger am Compiler abschalten?

Gruss

nik

Autor: Dominik Gaeta (niknik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat keiner eine Idee?
nik

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, offensichtlich hat keiner eine Idee, was du überhaupt meinst.

Autor: Dominik Gaeta (niknik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, dann nochmal.
1. Ich schreibe das Programm in den Flash. Keine Fehlermeldung. Aber 
trotz
   Reset blinken die LED's nicht.
2. Ich debugge das Programm, das schon im Flash liegt und es läuft. 
LED's blinken.

Jetzt die Frage: Muss beim compilieren oder flashen irgendein Hebelchen 
betätigt werden?

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Software gibst du Eclipse an. Das ist "nur" eine IDE, meine 
Glaskugel sagt, dass du den arm-elf-gcc verwendest. Schon mal 
Linkerscript und makefile überprüft? Nicht, dass du noch fürs RAM linkst 
und es nur nicht merkst.

Autor: Dominik Gaeta (niknik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Linkerscript:
/* identify the Entry Point  (_vec_reset is defined in file crt.s)  */
ENTRY(_vec_reset)

/* specify the AT91SAM7S64 memory areas  */
MEMORY 
{                      
  flash  : ORIGIN = 0x00000000, LENGTH = 64K    /* FLASH EPROM    */  
  ram    : ORIGIN = 0x00200000, LENGTH = 16K    /* static RAM area  */
}


/* define a global symbol _stack_end  (see analysis in annotation above) */
_stack_end = 0x00203FFC;

/* now define the output sections  */
SECTIONS 
{
  . = 0;                /* set location counter to address zero  */
  
  .text :                /* collect all sections that should go into FLASH after startup  */ 
  {
    *(.text)            /* all .text sections (code)  */
    *(.rodata)            /* all .rodata sections (constants, strings, etc.)  */
    *(.rodata*)            /* all .rodata* sections (constants, strings, etc.)  */
    *(.glue_7)            /* all .glue_7 sections  (no idea what these are) */
    *(.glue_7t)            /* all .glue_7t sections (no idea what these are) */
    _etext = .;            /* define a global symbol _etext just after the last code byte */
  } >flash              /* put all the above into FLASH */

  .data :                /* collect all initialized .data sections that go into RAM  */ 
  {
    _data = .;            /* create a global symbol marking the start of the .data section  */
    *(.data)            /* all .data sections  */
    _edata = .;            /* define a global symbol marking the end of the .data section  */
  } >ram AT >flash                /* put all the above into RAM (but load the LMA initializer copy into FLASH)  */

  .bss :                /* collect all uninitialized .bss sections that go into RAM  */
  {
    _bss_start = .;          /* define a global symbol marking the start of the .bss section */
    *(.bss)              /* all .bss sections  */
  } >ram                /* put all the above in RAM (it will be cleared in the startup code */

  . = ALIGN(4);            /* advance location counter to the next 32-bit boundary */
  _bss_end = . ;            /* define a global symbol marking the end of the .bss section */
}
  _end = .;              /* define a global symbol marking the end of application RAM */

und hier das makefile:
NAME= hello_world_flash

# Abkürzungen, die anstatt der hinteren Befehle genommen werden 
CC      = arm-elf-gcc      #GNU-Compiler
LD      = arm-elf-ld -v      #GNU-Linker
AR      = arm-elf-ar      #
AS      = arm-elf-as      #GNU-Assembler
CP      = arm-elf-objcopy    #GNU Object utility Binary File erzeugen
OD    = arm-elf-objdump    #

# Optionen mit denen der Compiler, Linker, assembler gestartet werden
# arm-elf-...
#-O3 Codeoptimierung
CFLAGS  = -I./ -c -fno-common -O0 -g  
AFLAGS  = -ahls -mapcs-32 -o crt.o
LFLAGS  =  -Map main.map -T hello_world_linker_flash.cmd 
CPFLAGS = --output-target=binary
ODFLAGS  = -x --syms

#Objekte, Libraries
#Reihenfolge beachten, den in dieser wird in den Speicher geschrieben.

OBJECTS = crt.o main.o system.o 


# alle mit make erzeugten Files löschen  (Project -> Clean)
clean:
  @ echo ---------------------------------------           
  @ echo Vorher erzeugte Dateien werden gelöscht
  @ echo ---------------------------------------
#das Minuszeichen vor rm unterdrückt Fehlermeldungen
  -rm $(OBJECTS) main.lst system.lst \
           main.out main.bin main.hex \
           main.map main.dmp crt.lst 
  @ echo ---------------------------------------           
  @ echo Vorher erzeugte Dateien wurden gelöscht
  @ echo ---------------------------------------  
    
# Zieldateien erzeugen, verlinken  (Project -> Build Project)
all: main.out
  @ echo "...copying"          #erscheint in der Konsole
  $(CP) $(CPFLAGS) main.out main.bin    
  $(OD) $(ODFLAGS) main.out >main.dmp

# Libraries einbinden 
main.out: $(OBJECTS) hello_world_linker_flash.cmd 
  
  @ echo ---------------------------------------           
  @ echo *.o werden verlinkt
  @ echo ---------------------------------------
  
  $(LD) $(LFLAGS) -o main.out $(OBJECTS) libc.a libm.a libgcc.a
    
  @ echo ---------------------------------------           
  @ echo *.o wurden verlinkt
  @ echo ---------------------------------------


crt.o: crt.s
  @ echo ".assembling"
  $(AS) $(AFLAGS) crt.s > crt.lst  

# Programmteile  compilieren  
  @ echo ---------------------------------------           
  @ echo *.c werden compiliert
  @ echo ---------------------------------------
main.o: main.c
  @ echo ".compiling"
  $(CC) $(CFLAGS) main.c

system.o: system.c
  @ echo ".compiling"
  $(CC) $(CFLAGS) system.c
  @ echo ---------------------------------------           
  @ echo *.c wurden compiliert
  @ echo ---------------------------------------
  
# **********************************************************************************************
#                            FLASH PROGRAMMING                                         
#
# Alternate make target for flash programming only
#
# You must create a special Eclipse make target (program) to run this part of the makefile 
# (Project -> Create Make Target...  then set the Target Name and Make Target to "program")
#
# OpenOCD is run in "batch" mode with a special configuration file and a script file containing
# the flash commands. When flash programming completes, OpenOCD terminates.
#
# Note that the script file of flash commands (script.ocd) is part of the project
#
# Programmers: Martin Thomas, Joseph M Dupre, James P Lynch
# **********************************************************************************************

# specify output filename here (must be *.bin file)
TARGET = main.bin

# specify the directory where openocd executable and configuration files reside (note: use forward slashes /)
OPENOCD_DIR = 'd:/Programme/openocd-2007re204/bin/'

# specify OpenOCD executable (pp is for the wiggler, ftd2xx is for the USB debuggers)
#OPENOCD = $(OPENOCD_DIR)openocd-pp.exe
OPENOCD = $(OPENOCD_DIR)openocd-ftd2xx.exe

# specify OpenOCD configuration file (pick the one for your device)
#OPENOCD_CFG = $(OPENOCD_DIR)at91sam7s256-wiggler-flash-program.cfg
#OPENOCD_CFG = $(OPENOCD_DIR)at91sam7s256-jtagkey-flash-program.cfg
#OPENOCD_CFG = $(OPENOCD_DIR)at91sam7s256-armusbocd-flash-program.cfg
OPENOCD_CFG = $(OPENOCD_DIR)at91sam7s64-armusbocd.cfg

# program the AT91SAM7S256 internal flash memory
program: $(TARGET)
  @echo "Flash Programming with OpenOCD..."      # display a message on the console
  $(OPENOCD) -f $(OPENOCD_CFG)            # program the onchip FLASH here
  @echo "Flash Programming Finished."          # display a message on the console

 Zitat:"Nicht, dass du noch fürs RAM linkst und es nur nicht merkst."
Nachdem ich den uC abgeschaltet habe und danach wieder debugge ohne 
erneut
zu flashen funktionierts noch immer. Also bin ich doch im Flash?

Autor: Dominik Gaeta (niknik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte es sein, dass es etwas mit dem NVM-Bit zu tun hat. Wenn ja, wie 
und wo
müsste ich es setzen?

Autor: Dominik Gaeta (niknik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider funktioniert das Prg im flash noch immer nicht.

was es nicht ist:

-das Lockbit (Auslesen telnet 4444 (openocd)
Open On-Chip Debugger
> flash info 0
#0: at91sam7 at 0x00000000, size 0x00000000, buswidth 0, chipwidth 0

at91sam7 information: Chip is AT91SAM7S64
cidr: 0x27090540, arch: 0x0070, eproc: ARM7TDMI, version:0x000,  flashsize: 0x00
010000
master clock(estimated): 80425kHz
pagesize: 128, lockbits: 16 0x0000, pages in lock region: 32
securitybit: 0, nvmbits: 0x0

>
-der Code liegt im flash:
make program
Flash Programming with OpenOCD...
d:/Programme/openocd-2007re204/bin/openocd-ftd2xx.exe -f d:/Programme/openocd-2007re204/bin/at91sam7s64-armusbocd.cfg            # program the onchip FLASH here
Info:    openocd.c:93 main(): Open On-Chip Debugger (2007-09-05 09:00 CEST)
Warning: arm7_9_common.c:734 arm7_9_assert_reset(): srst resets test logic, too
Info:    target.c:232 target_init_handler(): executing reset script 'script.ocd'
Info:    configuration.c:50 configuration_output_handler(): waiting for target halted...
Info:    configuration.c:50 configuration_output_handler(): target halted
Info:    configuration.c:50 configuration_output_handler(): core state: ARM
Info:    configuration.c:50 configuration_output_handler(): waiting for target halted...
Info:    configuration.c:50 configuration_output_handler(): target halted
Info:    configuration.c:50 configuration_output_handler(): waiting for target halted...
Info:    configuration.c:50 configuration_output_handler(): target halted
Info:    configuration.c:50 configuration_output_handler(): waiting for target halted...
Info:    configuration.c:50 configuration_output_handler(): target halted
Info:    configuration.c:50 configuration_output_handler(): waiting for target halted...
Info:    configuration.c:50 configuration_output_handler(): target halted
Info:    configuration.c:50 configuration_output_handler(): flash 'at91sam7' found at 0x00100000
Info:    configuration.c:50 configuration_output_handler(): wrote  2676 byte from file main.bin to flash bank 0 at offset 0x00000000 in 0s 531250us (4.919118 kb/s)
Info:    configuration.c:50 configuration_output_handler(): waiting for target halted...
Info:    configuration.c:50 configuration_output_handler(): target halted
Info:    configuration.c:50 configuration_output_handler(): core state: ARM
Info:    configuration.c:50 configuration_output_handler(): target state: halted
Info:    configuration.c:50 configuration_output_handler(): target halted in ARM state due to debug request, current mode: Abort
Info:    configuration.c:50 configuration_output_handler(): cpsr: 0x20000097 pc: 0x000007c8
Warning: arm7_9_common.c:734 arm7_9_assert_reset(): srst resets test logic, too
Flash Programming Finished.

Autor: Jörn Kaipf (joern)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dominik Gaeta wrote:

> master clock(estimated): 80425kHz
> pagesize: 128, lockbits: 16 0x0000, pages in lock region: 32

Wenn die Taktschätzung auch nur etwa stimmt, dann läuft der SAM7 etwa 25 
Mhz über seiner Spezifiaktion. Dreh mal den Takt runter und schaue ob 
das Programm läuft.

Gruß
Jörn

Autor: Jörn Kaipf (joern)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Dominik Gaeta (niknik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Jörn,

der Takt war zu hoch, das habe ich jetzt geändert.

Telnet localhost 4444 zeigt jetzt folgendes an:
Open On-Chip Debugger
> flash info 0
#0: at91sam7 at 0x00100000, size 0x00010000, buswidth 4, chipwidth 0
#0: 0x00000000 (0x10000kB) erase state unknown, protection state unknown

at91sam7 information: Chip is AT91SAM7S64
cidr: 0x27090540, arch: 0x0070, eproc: ARM7TDMI, version:0x000,  flashsize: 0x00010000
master clock(estimated): 50297kHz
pagesize: 128, lockbits: 16 0x0000, pages in lock region: 32
securitybit: 0, nvmbits: 0x0
>
50Mhz, dass ist doch schon mal gut. Aber nicht gut genug, denn das Prg. 
läuft noch immer nicht.

nik

Autor: Dominik Gaeta (niknik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super,

das PRG läuft. Es lag am zu hohen Takt. Bei zu hohem Takt ging nichts 
mehr.

Dieser wurde vermutlich durch die Datenübertragungen beim Debuggen 
herabgesetzt und so lief das Prg dann nur beim Debuggen.

Vielen Dank nochmal
nik

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.