Buggfix Plus
Aktuellt datum och tid: 12.41 2017-11-20

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 5 inlägg ] 
Författare Meddelande
InläggPostat: 19.07 2017-07-02 
EF Sponsor
Användarvisningsbild

Blev medlem: 00.08 2003-06-18
Inlägg: 2370
Ort: Växjö
Håller just nu på att porta ett API till STM32L151. Det är ett api från decawave. För kommunikation med en radio över SPI.
SPI-kommunikationen fungerar.

Men mitt problem är i deca_device.c, somm tillhör API'et.
Där deklareras en pekare, som även initialiseras.
Men problemet är att pekaren aldrig blir initialiserad.

static dwt_local_data_t *pdw1000local = dw1000local ; // Static local data structure pointer

Men jag förstår inte varför..
Hela projektet (Cocox), finns bifogat för den som har lust att kika på det..

Tacksam för hjälp :-)


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 21.27 2017-07-02 
EF Sponsor
Användarvisningsbild

Blev medlem: 00.08 2003-06-18
Inlägg: 2370
Ort: Växjö
Hittade felet nu,

tydligen så var bss-sektionen i startup-filen bortkomenterad.. (använder Cocox)
Tog bort komenteringen, och då blev alla globala inititialiserade, men instället så går den i hardFault_Handler hela tiden..
Så det verkar vara ett problem som kommer från kompilatorn..

Ska försöka testa någon annan kompilator.. Ananrs, är det någon som har ett tips på hur man kan få ordning på startup-filen i Cocox?


Upp
 Profil  
 
InläggPostat: 22.14 2017-07-02 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 10905
Ort: Norrköping
Det kan naturligtvis vara kompilatorn men jag tvivlar.
Jag har nog bara kunnat dokumentera kompilatorfel en handfull gånger under det kvartssekel jag programmerat i C. Aldrig med GCC även om jag har upplevt en del underligheter.

Vid något tillfälle hade jag samma (?) problem som du med Cocox. Tyvärr minns jag inte vad orsaken var men det var absolut inte kompilatorn. Möjligen att det var ett "spurious interrupt". Har du en vettig interrupthanterare för hard fault? Själv har jag inspirerats av det här: http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html Har hjälpt mig att hitta fel ett par gånger.

Edit: Så här ser "min" kod ut. Helt uppenbart att assemblerbiten är "cut and paste" från webbsidan. :)
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
/**
  * @brief  assembler part of hard fault handler
  * @brief  http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html
  * @param  none
  * @retval none
  * @date   2015-06-17
  */
void HardFault_Handler(void)
{

  __asm volatile
    (
     " tst lr, #4                  \n"
     " ite eq                     \n"
     " mrseq r0, msp                  \n"
     " mrsne r0, psp                  \n"
     " ldr r1, [r0, #24]               \n"
     " ldr r2, handler2_address_const            \n"
     " bx r2                     \n"
     " handler2_address_const: .word irqHandleStackFrame   \n"
    );

} /* HardFault_Handler */


/**
  * @brief  C part of hard fault handler
  * @brief  http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html
  * @param  pointer to stack frame
  * @retval none
  * @date   2015-06-17
  */
void irqHandleStackFrame(uint32_t *stackframe)
{

  StackR0 = stackframe[0];
  StackR1 = stackframe[1];
  StackR2 = stackframe[2];
  StackR3 = stackframe[3];

  StackR12 = stackframe[4];
  StackLR = stackframe[5];
  StackPC = stackframe[6];
  StackPSR = stackframe[7];

#ifdef DISPLAYENVIRONMENT
  static USART_TypeDef *usart;
  static const char *cp;
  static uint32_t i, j, t, v;

  usart = UsartPtr[1];

  for (i = 0; i < ENVIRONMENTSZ; i++) {
    /* display string */
    cp = envlabel[i];

    while (*cp) {
      /* wait for TXE */
      while (!(usart->SR & USART_SR_TXE)) {
      }

      usart->DR = (uint16_t) *cp++;
    }

    /* display value */
    if (envvalue[i]) {
      v = *envvalue[i];

      for (j = 0; j < 8; j++) {
   t = v >> 28;
   v <<= 4;

   if (t <= 9) {
     t += '0';
   } else {
     t += ('a' - 0x0a);
   }

   /* wait for TXE */
   while (!(usart->SR & USART_SR_TXE)) {
   }

   usart->DR = (uint16_t) t;
      }
    }
  }
#endif

  for(;;) {
  }

} /* irqHandleStackFrame */


Upp
 Profil  
 
InläggPostat: 10.12 2017-07-11 
EF Sponsor
Användarvisningsbild

Blev medlem: 00.08 2003-06-18
Inlägg: 2370
Ort: Växjö
Hej,

Tack för hjälpen. Fick det att snurra.. Men sedan har jag inte jobbat mer med det då det var dags för semester..
Hur som helst var det bss-sektionen som var bortkomenterad i startupfilen från cocox, det är de som skrivit den.
Sedan kommer jag inte ihåg om det var något mer.. får kika närmare efter jag vilat upp mig.

I min hard fault handler har jag än så länge ingen kod alls, mer än en evighetsloop och en stopflagga för debuggern.
Vad gör din kod i din hard-fault handler? Känns som det kan vara bra att göra något vettigt där, för för eller senare kommer
det att inträffa något fel.


Upp
 Profil  
 
InläggPostat: 11.42 2017-07-11 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 10905
Ort: Norrköping
Ja du det undrade jag också när jag började titta på koden, det är ju två år sedan jag skrev den...

Det som händer är att ett antal register från stacken och några systemregister som kan vara användbara skrivs ut till debuguarten. Detta som ett komplement till debuggern.

Jag vet inte riktigt varför jag krånglade till det så men det verkade väl vettigt då. Idag skulle jag nog förenkla lite, tex ta bort de globala variablerna StackR0..StackPSR. Se nedan för saknad information.


I headerfilen för projektet:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
extern volatile uint32_t StackR0, StackR1, StackR2, StackR3, StackR12, StackLR, StackPC, StackPSR;

I filen med globala variabler:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
volatile uint32_t StackR0, StackR1, StackR2, StackR3, StackR12, StackLR, StackPC, StackPSR;

I filen med interrupthanterarna:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#define ENVIRONMENTSZ 16
static const char *envlabel[ENVIRONMENTSZ] = {
  "\r\nHard fault handler",
  "\r\nR0  0x",
  "\r\nR1  0x",
  "\r\nR2  0x",
  "\r\nR3  0x",
  "\r\nR12 0x",
  "\r\nLR  0x",
  "\r\nPC  0x",
  "\r\nPSR 0x",
  "\r\nMMAR 0x",
  "\r\nBFAR 0x",
  "\r\nCFSR 0x",
  "\r\nHFSR 0x",
  "\r\nDFSR 0x",
  "\r\nAFSR 0x",
  "\r\n******************\r\n"};
volatile uint32_t *envvalue[ENVIRONMENTSZ] = {
  NULL,
  &StackR0,
  &StackR1,
  &StackR2,
  &StackR3,
  &StackR12,
  &StackLR,
  &StackPC,
  &StackPSR,
  ((volatile uint32_t *) 0xe000ed34),
  ((volatile uint32_t *) 0xe000ed38),
  ((volatile uint32_t *) 0xe000ed28),
  ((volatile uint32_t *) 0xe000ed2c),
  ((volatile uint32_t *) 0xe000ed30),
  ((volatile uint32_t *) 0xe000ed3c),
  NULL};


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 5 inlägg ] 

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 6 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010