FreeRTOS xPortSysTickHandler verursacht HardFauld

Gast #4966703
Lesenswert?

Hallo,

Als Controller nutzt ich einen STM32L4

Nun versuche ich nach langer Zeit FreeRTOS zum laufen zu bekommen.
Wenn ich den xPortSysTickHandler nicht zum SysTick definiere 
funktioniert der Task und macht, was er soll.

Nach dem SystemInit (Clocks, Systick etc) wird direkt der
xPortSysTickHandler aufgerufen, welcher danach
xTaskIncrementTick aufruft und
xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );
verursacht dann den Hardfault.
pxDelayedTaskList ist noch "0x00000000", da zu dem Zeitpunkt kein Task 
definiert ist.

Was mache ich falsch?
Gast #4966743
Lesenswert?

Ich nutzte den aus der Demo.

"Implementation of functions defined in portable.h for the ARM CM4F 
port."

Habe gerade gesehen, dass in der CMSIS angefragt wird, ob der Scheduler 
schön läuft
1
#if (INCLUDE_xTaskGetSchedulerState  == 1 )
2
  if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
3
  {
4
#endif  /* INCLUDE_xTaskGetSchedulerState */  
5
    xPortSysTickHandler();
6
#if (INCLUDE_xTaskGetSchedulerState  == 1 )
7
  }
8
#endif  /* INCLUDE_xTaskGetSchedulerState */
Da scheint ein Problem zu sein.
Das mit dem Systick schaue ich mir auch noch an, ob er in meinem "Port" 
definiert ist.

Danke
(Firma: HEGRO GmbH) #4967476
Lesenswert?

Also ich hab das so gelöst:



int main()
{
  stm32_core_init();
  periphery_init();

  rtos_timer_create(timer_led, "LEDTimer", true, 500, 0);
  rtos_ip_init(ip, netmask, gateway, dnsserver, mac);
  rtos_create_task(udp_comm_task, "ERB UDP Comm Task", 512, NULL, 7);
  rtos_init();

  while (true);
  return 0;
}



#ifdef USE_FREERTOS
#include "FREERTOS/FreeRTOSConfig.h"
#include "FREERTOS/FreeRTOS.h"
extern void xPortSysTickHandler(void);
#endif

#ifdef USE_FREERTOS
#define USE_SYSTICK
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#endif

void stm32_core_init()
{
...
/* SysTick initialization */
#ifdef USE_SYSTICK
#if ((SYSTICK_HZ - 1) > SysTick_LOAD_RELOAD_Msk)
#error SYSTICK_HZ not possible.
#else
  SysTick->LOAD = (uint32_t)((frequency.system_clock / SYSTICK_HZ) - 
1UL);    /* set reload register */
  SysTick->VAL = 0UL;                  /* Load the SysTick Counter Value 
*/
#ifndef USE_FREERTOS
  SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk 
| SysTick_CTRL_ENABLE_Msk;
  stm32_irq_priority prio;
  prio.preempt_priority = SYSTICK_INT_PREEMPT_PRIO;
  prio.sub_priority = SYSTICK_INT_SUB_PRIO;
  stm32_irq_enable(SysTick_IRQn, &prio);
#endif
#endif
#endif
...
}


#ifdef USE_SYSTICK
volatile uint32_t tick = 0;
void SysTick_Handler()
{
  tick++;

#ifdef USE_FREERTOS
#if (INCLUDE_xTaskGetSchedulerState  == 1 )
  if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  {
#endif
    xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState  == 1 )
  }
#endif
#endif

}



Das mag vllt nicht so ideal sein, da meine Delayfunktion erst losläuft, 
sobald freertos losgelaufen ist. Das sollte man hier noch ändern oder 
eben beachten. Normalerweise braucht man die ja eher weniger, wenn man 
das OS am laufen hat :>

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren