www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt Problem sam7


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo letzte Rettung,

ich will ueber die I2C bzw. das TWI Daten heraussenden. Allerdings hab 
ich Probleme beim aufrufen der portRESTORE_CONTEXT() und 
portSAVE_CONTEXT() macros bei freertos und gcc... Ich erhalte jedes mal 
die Fehlermeldung

"invalid literal constant: pool needs to be closer". Komischerweise 
koennen die Funktionen an anderen Stellen ohne weiteres aufgerufen 
werden.

Es handelt sich hierbei um einen Atmel AT91 Sam7x256 und die Yagarto 
Toolchain... :/


#define portRESTORE_CONTEXT()                      \
{                                    \
extern volatile void * volatile pxCurrentTCB;              \
extern volatile unsigned portLONG ulCriticalNesting;          \
                                    \
  /* Set the LR to the task stack. */                  \
  asm volatile (                            \
  "LDR    R0, =pxCurrentTCB                \n\t"  \
  "LDR    R0, [R0]                    \n\t"  \
  "LDR    LR, [R0]                    \n\t"  \
                                    \
  /* The critical nesting depth is the first item on the stack. */  \
  /* Load it into the ulCriticalNesting variable. */          \
  "LDR    R0, =ulCriticalNesting              \n\t"  \
  "LDMFD  LR!, {R1}                      \n\t"  \
  "STR    R1, [R0]                    \n\t"  \
                                    \
  /* Get the SPSR from the stack. */                  \
  "LDMFD  LR!, {R0}                      \n\t"  \
  "MSR    SPSR, R0                    \n\t"  \
                                    \
  /* Restore all system mode registers for the task. */        \
  "LDMFD  LR, {R0-R14}^                    \n\t"  \
  "NOP                            \n\t"  \
                                    \
  /* Restore the return address. */                  \
  "LDR    LR, [LR, #+60]                  \n\t"  \
                                    \
  /* And return - correcting the offset in the LR to obtain the */  \
  /* correct address. */                        \
  "SUBS  PC, LR, #4                      \n\t"  \
  );                                  \
  ( void ) ulCriticalNesting;                      \
  ( void ) pxCurrentTCB;                        \
}

#define portSAVE_CONTEXT()                        \
{                                    \
extern volatile void * volatile pxCurrentTCB;              \
extern volatile unsigned portLONG ulCriticalNesting;          \
                                    \
  /* Push R0 as we are going to use the register. */          \
  asm volatile (                            \
  "STMDB  SP!, {R0}                      \n\t"  \
                                    \
  /* Set R0 to point to the task stack pointer. */          \
  "STMDB  SP,{SP}^                      \n\t"  \
  "NOP                            \n\t"  \
  "SUB  SP, SP, #4                      \n\t"  \
  "LDMIA  SP!,{R0}                      \n\t"  \
                                    \
  /* Push the return address onto the stack. */            \
  "STMDB  R0!, {LR}                      \n\t"  \
                                    \
  /* Now we have saved LR we can use it instead of R0. */        \
  "MOV  LR, R0                        \n\t"  \
                                    \
  /* Pop R0 so we can save it onto the system mode stack. */      \
  "LDMIA  SP!, {R0}                      \n\t"  \
                                    \
  /* Push all the system mode registers onto the task stack. */    \
  "STMDB  LR,{R0-LR}^                      \n\t"  \
  "NOP                            \n\t"  \
  "SUB  LR, LR, #60                      \n\t"  \
                                    \
  /* Push the SPSR onto the task stack. */              \
  "MRS  R0, SPSR                      \n\t"  \
  "STMDB  LR!, {R0}                      \n\t"  \
                                    \
  "LDR  R0, =ulCriticalNesting                \n\t"  \
  "LDR  R0, [R0]                      \n\t"  \
  "STMDB  LR!, {R0}                      \n\t"  \
                                    \
  /* Store the new top of stack for the task. */            \
  "LDR  R0, =pxCurrentTCB                  \n\t"  \
  "LDR  R0, [R0]                      \n\t"  \
  "STR  LR, [R0]                      \n\t"  \
  );                                  \
  ( void ) ulCriticalNesting;                      \
  ( void ) pxCurrentTCB;                        \
}

Autor: Microman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gast,

hatte auch das Problem, schau doch mal hier nach:

Beitrag "ARM GCC literal pool needs to be closer"

Gruß Microman

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich gesehen und eingefuegt, allerdings kommt dann diese 
fehlermeldung:
error: no memory region specified for loadable section '.text.i2c_handler'

:(

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Hab ich gesehen und eingefuegt, allerdings kommt dann diese
> fehlermeldung:
>
>
error: no memory region specified for loadable section
> '.text.i2c_handler'
>
> :(

Das Linker-Script muss für -ffunction-section angepasst werden. Vgl. 
default linker-script ($(toolchainprefix)-ld --verbose) im Bereich um 
.text.*

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung, aber geht das vielleicht etwas genauer? bin neu in der 
programmierung von Arms und kenn mich nicht wirklich aus.

Mein LinkerScript sieht derzeit so aus:
MEMORY 
{
  flash  : ORIGIN = 0x00400000, LENGTH = 256K
  ram    : ORIGIN = 0x00200000, LENGTH = 64K
}

__stack_end__ = 0x00200000 + 64K - 4;

SECTIONS 
{
  . = 0;
  startup : { *(.startup)} >flash
  
  prog : 
  {
    *(.rodata)
    *(.rodata*)
    *(.glue_7)
    *(.glue_7t) 
  } >flash
  
  __end_of_text__ = .;

  .data : 
  {
    __data_beg__ = .;
    __data_beg_src__ = __end_of_text__;
    *(.data)
    __data_end__ = .;
  } >ram AT>flash

  .bss : 
  {
    __bss_beg__ = .;
    *(.bss)
  } >ram
  
  


  /* Align here to ensure that the .bss section occupies space up to
  _end.  Align after .bss to ensure correct alignment even if the
  .bss section disappears because there are no input sections.  */
  . = ALIGN(32 / 8);
}
  . = ALIGN(32 / 8);
  _end = .;
  _bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
  PROVIDE (end = .);




Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ha...problem geloest, im prinzip ganz einfach:

die quellcode datei mit dem interrupt sollte so klein/kurz wie moeglich 
gehalten werden. wenn sie zu groß ist, kommt es zu diesem problem...

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.