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 :>