Forum: Mikrocontroller und Digitale Elektronik freeRTOS auf STM32F103 mit coIDE läuft nicht!


von obamoa (Gast)


Lesenswert?

Hallo,

ich habe bisher den STM32F103ZE immer mit IAR EW 6.1 programmiert. Dort 
habe freeRTOS verwendet. Jetzt bin ich auf dem coIDE von coocox 
umgestiegen. Die Portierung meines Projektes ging super schnell und 
einfach, nur bekomme ich freeRTOS nicht zum laufen. Ich lande immer 
wieder im Default_Handler.

Der Weg dorthin ist folgender:
main() -> vTaskStartScheduler() -> xPortStartScheduler() -> 
vPortStartFirstTask()

Als portable habe ich GCC/ARM_CM3 gewählt (mit IAR hatte ich 
IAR/ARM_CM3), ist das so ok, oder müssen vielleicht noch irgendwelche 
Einstellungen angepasst werden?

Wäre SUPER wenn ihr mir weiter helfen könnt!

von holger (Gast)


Lesenswert?

>Ich lande immer
>wieder im Default_Handler.

Dann hast du die drei Interrupthandler von FreeRTOS
nicht in die Interrupttabelle eingetragen.

von obamoa (Gast)


Lesenswert?

Danke für den Tipp, nur weis ich nicht genau wie ich das anstelle. Ich 
hab auf der Page von freeRTOS nichts gefunden. Wie würde der Code 
aussehen und wo müsste ich ihn einfügen?

Sorry für die blöde Frage, aber ich hab noch nicht so die Erfahrung.

von obamoa (Gast)


Lesenswert?

Jetzt habe ich folgendes versucht:

1.
In das Startupfile habe ich flogendes eingefügt:
1
extern void xPortPendSVHandler( void ) __attribute__ (( naked ));
2
extern void xPortSysTickHandler( void );
3
extern void vPortSVCHandler( void ) __attribute__ (( naked ));
und geändert:
1
#pragma weak SVC_Handler = vPortSVCHandler
2
#pragma weak PendSV_Handler = xPortPendSVHandler
3
#pragma weak SysTick_Handler = xPortSysTickHandler

es entstehen folgende Fehlermeldungen:

error: 'SVC_Handler' aliased to undefined symbol 'vPortSVCHandler'
error: 'PendSV_Handler' aliased to undefined symbol 'xPortPendSVHandler'
error: 'SysTick_Handler' aliased to undefined symbol 
'xPortSysTickHandler'

obwohl ich die Funktionsprototpyen mit extern eingebunden habe.


2.
In das Startupfile habe ich folgendes eingefügt:
1
extern void xPortPendSVHandler( void );
2
extern void xPortSysTickHandler( void );
3
extern void vPortSVCHandler( void );
und geändert:
1
#pragma weak SVC_Handler = vPortSVCHandler
2
#pragma weak PendSV_Handler = xPortPendSVHandler
3
#pragma weak SysTick_Handler = xPortSysTickHandler

es entstehen folgende Fehlermeldungen:

error: 'SVC_Handler' aliased to undefined symbol 'vPortSVCHandler'
error: 'PendSV_Handler' aliased to undefined symbol 'xPortPendSVHandler'
error: 'SysTick_Handler' aliased to undefined symbol 
'xPortSysTickHandler'

obwohl ich die Funktionsprototpyen mit extern eingebunden habe.

3.
Ich habe die Funktionen im freeRTOS port.c einfach in umbenannt:
vPortSVCHandler -> SVC_Handler
xPortPendSVHandler -> PendSV_Handler
xPortSysTickHandler -> SysTick_Handler

Laut Kommentar im startupfile müsste das auch passen:
1
  *@brief Provide weak aliases for each Exception handler to the Default_Handler. 
2
  *       As they are weak aliases, any function with the same name will override 
3
  *       this definition.

Das compilieren läuft auch ohne Fehler durch, nur lande wieder im 
Default_Handler.


Was könnte ich noch versuchen?

von JojoS (Gast)


Lesenswert?

beim LPCExpresso habe ich im Startupfile eine Vectortabelle in der die 
Handler eingetragen sind:
1
//*****************************************************************************
2
//
3
// The vector table.
4
// This relies on the linker script to place at correct location in memory.
5
//
6
//*****************************************************************************
7
extern void (* const g_pfnVectors[])(void);
8
__attribute__ ((section(".isr_vector")))
9
void (* const g_pfnVectors[])(void) =
10
{
11
  // Core Level - CM3
12
  (void *)&_vStackTop,          // The initial stack pointer
13
  ResetISR,                // The reset handler
14
  NMI_Handler,              // The NMI handler
15
  HardFault_Handler,            // The hard fault handler
16
  MemManage_Handler,            // The MPU fault handler
17
  BusFault_Handler,            // The bus fault handler
18
  UsageFault_Handler,            // The usage fault handler
19
  0,                    // Reserved
20
  0,                    // Reserved
21
  0,                    // Reserved
22
  0,                    // Reserved
23
  vPortSVCHandler,                        // SVCall handler
24
  DebugMon_Handler,            // Debug monitor handler
25
  0,                    // Reserved
26
  xPortPendSVHandler,                     // The PendSV handler
27
  xPortSysTickHandler,                    // The SysTick handler
28
29
  // Chip Level - LPC17
30
  WDT_IRQHandler,              // 16, 0x40 - WDT
31
  TIMER0_IRQHandler,            // 17, 0x44 - TIMER0
32
  TIMER1_IRQHandler,            // 18, 0x48 - TIMER1
33
  TIMER2_IRQHandler,            // 19, 0x4c - TIMER2
34
  TIMER3_IRQHandler,            // 20, 0x50 - TIMER3
35
  UART0_IRQHandler,            // 21, 0x54 - UART0
36
  UART1_IRQHandler,            // 22, 0x58 - UART1
37
  UART2_IRQHandler,            // 23, 0x5c - UART2
38
  UART3_IRQHandler,            // 24, 0x60 - UART3
39
  PWM1_IRQHandler,            // 25, 0x64 - PWM1
40
  I2C0_IRQHandler,            // 26, 0x68 - I2C0
41
  I2C1_IRQHandler,            // 27, 0x6c - I2C1
42
  I2C2_IRQHandler,            // 28, 0x70 - I2C2
43
  SPI_IRQHandler,              // 29, 0x74 - SPI
44
  SSP0_IRQHandler,            // 30, 0x78 - SSP0
45
  SSP1_IRQHandler,            // 31, 0x7c - SSP1
46
  PLL0_IRQHandler,            // 32, 0x80 - PLL0 (Main PLL)
47
  RTC_IRQHandler,              // 33, 0x84 - RTC
48
  EINT0_IRQHandler,            // 34, 0x88 - EINT0
49
  EINT1_IRQHandler,            // 35, 0x8c - EINT1
50
  EINT2_IRQHandler,            // 36, 0x90 - EINT2
51
  EINT3_IRQHandler,            // 37, 0x94 - EINT3
52
  ADC_IRQHandler,              // 38, 0x98 - ADC
53
  BOD_IRQHandler,              // 39, 0x9c - BOD
54
  USB_IRQHandler,              // 40, 0xA0 - USB
55
  CAN_IRQHandler,              // 41, 0xa4 - CAN
56
  DMA_IRQHandler,              // 42, 0xa8 - GP DMA
57
  I2S_IRQHandler,              // 43, 0xac - I2S
58
      vEMAC_ISR,                          // Ethernet.
59
  RIT_IRQHandler,              // 45, 0xb4 - RITINT
60
  MCPWM_IRQHandler,            // 46, 0xb8 - Motor Control PWM
61
  QEI_IRQHandler,              // 47, 0xbc - Quadrature Encoder
62
  PLL1_IRQHandler,            // 48, 0xc0 - PLL1 (USB PLL)
63
  USBActivity_IRQHandler,          // 49, 0xc4 - USB Activity interrupt to wakeup
64
  CANActivity_IRQHandler,         // 50, 0xc8 - CAN Activity interrupt to wakeup
65
};

von obamoa (Gast)


Lesenswert?

Danke für den Hinweis! Werd es am Montag gleich versuchen die Namen der 
rtos ISRs direkt in die Vektortabelle einzutragen. Hoffentlich klappts. 
Schönes Wochenende noch!

von obamoa (Gast)


Lesenswert?

Es geht!!!
Nach dem ich heute Nachmittag einige Zeit am startupfile herumgedoktort 
habe, leider ohne Erfolg, habe ich nochmal unter freeRTOS.org gelesen. 
Dort habe ich dann folgendes entdeckt:



Note that the following lines are included in FreeRTOSConfig.h:

  #define vPortSVCHandler      SVC_Handler
  #define xPortPendSVHandler   PendSV_Handler
  #define xPortSysTickHandler  SysTick_Handler

These definitions map the FreeRTOS kernel interrupt handler function 
names onto the CMSIS interrupt handler functions names - and in so 
doing, allow the Atollic provided linker script and start up files to be 
used without modification.<



Ich hab zwar nicht das Atollic Studio, aber der CoIDE verwendet den 
geleichen Compiler. Ich habs dann mal probiert und es ging auf anhieb. 
Warum das mit dem startupfile nicht geklappt hat ist mir nicht klar, 
aber egal es geht!

Danke für eure Hilfe!!!

von Jürgen R. (mikrox)


Lesenswert?

Hallo obamoa,

ich 'doktore' ebenso schon geraume Zeit an der Integration eines bisher 
unter Eclipse verwalteten FreeRTOS-Projektes für einen TI LM3S6965 
herum.
Die CoIDE scheint mir schlanker als Eclipse-Native.
Kannst du mir dein Projekt-File zukommen lassen damit ich die 
FreeRTOS-Ordnerstruktur, speziell die Includes, nachvollziehen kann?

Es wäre schön, wenn du mir helfen könntest.

von daniel44 (Gast)


Lesenswert?

Hallo Jürgen Richards,

haben Sie FreeRTOS in der CoIDE zum laufen bekommen?

Ich kann mein Projekt fehlerfrei "Bulid"-en aber es blinkt keine LED.
Beim Versuch zu Debugen "hängt" der STM32F100RB vom VL-Discovery-Board.

Gruß Daniel

von Jürgen R. (mikrox)


Lesenswert?

Hi Daniel,

Es ist zwar schon eine Weile her, aber dennoch:

Ja, CoIDE und FreeRTOS laufen.

Zwei Varianten sind bei uns im Einsatz:

1: STM32F103 (ET-STM32) hängt zum Debuggen an einem ST-link (SWD) des 
STM32F4DISCOVERY-Board,

2: TI LM3S6965 (LM3S6965 Evaluation Kits) mit OpenJTAG zum Debuggen.

Falls Sie diese Varianten interessieren, melden Sie sich einfach.

Gruß Jürgen

von Peter S. (psavr)


Lesenswert?

Ja, ich wäre an einem minimalen CoIDE Beispielprojekt für den STM32F104 
interessiert (bzw. für den STM32F407)

von Buschatzky D. (Firma: STE) (daniel44)


Lesenswert?

Guten Morgen,

mein Problem ist gelöst. FreeRTOS wolle nicht laufen weil, ich Tasks 
hatte, dessen Priorität höher als die maximal zulässige Priorität war. 
Die maximal zulässige Prorität kann in der FreeRTOSconfig.h -> 
configMAX_PRIORITIES angepasst werden.  Des weiteren muss 
configTOTAL_HEAP_SIZE auch immer "nach gepflegt" werden.

@ Jürgen trozdem Danke

@ Peter Coocox hat genug Bsp. anboard.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.