Forum: Mikrocontroller und Digitale Elektronik STM32 FreeRTOS 7.6 TimerIRQ Semaphore Thread starten


von Moritz (Gast)


Lesenswert?

Hallo,

ich komme nicht weiter und hoffe, das mir hier jemand helfen kann.

Zum Thema ich probiere mich gerade mit dem Evalboard STM32F3Discovery 
mit FreeRTOS 7.6 aus. Zu den Schnittstellen des CMSIS RTOS gibt es ja 
eine menge Anleitungen, wie man mit einem Semaphore aus einem ISR einen 
Thread "aktiveren" kann.

Der Thread an sich läuft und der Timer auch. Ausgaben via printf und SWV 
funktionieren.

Nur hier ist mein Problem.

Sobald ich versuche ein osSemaphoreRelease im TimerISR auszuführen 
bleibt der Controler komplett stehen.
Wenn ich osSemaphoreRelease zB in Threads oder im SysTick_Handler 
aufrufe, funktioniert alles wie gewollt.

Auschnitt aus stm32f3xx_it.c

/**
* @brief This function handles TIM7 global interrupt.
*/
void TIM7_IRQHandler(void)
{
  /* USER CODE BEGIN TIM7_IRQn 0 */

  /* USER CODE END TIM7_IRQn 0 */
  HAL_TIM_IRQHandler(&htim7);
  /* USER CODE BEGIN TIM7_IRQn 1 */
  osSemaphoreRelease(myBinarySem01Handle);
  /* USER CODE END TIM7_IRQn 1 */
}

Zu den Timer Initialiserungen:
Ausschnitt aus main.c
/* TIM7 init function */
void MX_TIM7_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;

  htim7.Instance = TIM7;
  htim7.Init.Prescaler = 16000;
  htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim7.Init.Period = 1000;
  HAL_TIM_Base_Init(&htim7);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig);

}

Ausschnitt aus stm32f3xx_hal_msp.c
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{

  if(htim_base->Instance==TIM7)
  {
  /* USER CODE BEGIN TIM7_MspInit 0 */

  /* USER CODE END TIM7_MspInit 0 */
    /* Peripheral clock enable */
    __TIM7_CLK_ENABLE();
  /* Peripheral interrupt init*/
    HAL_NVIC_SetPriority(TIM7_IRQn, 10, 0);
    HAL_NVIC_EnableIRQ(TIM7_IRQn);
  /* USER CODE BEGIN TIM7_MspInit 1 */

  /* USER CODE END TIM7_MspInit 1 */
  }

}

Stehen bleibt er bei Ausschnitt aus port.c

__asm unsigned long ulPortSetInterruptMask( void )
{
  PRESERVE8

  mrs r0, basepri
  mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
  msr basepri, r1
  bx r14  <---
}

Den meisten Code habe ich von STM32CubeMX erstellen lassen und editiert.

Habe ich evtl. etwas vergessen? Ich versuche gerade die Funktionsweise 
STM32 mit CMSIS zu verstehen.

Vielen Dank für eure Hilfe!

von holger (Gast)


Lesenswert?

>Sobald ich versuche ein osSemaphoreRelease im TimerISR auszuführen
>bleibt der Controler komplett stehen.

Das passiert wenn der Interrupt eine höhere Priorität
als das RTOS selbst hat. Dann darf man dort die RTOS API
Funktionen nicht aufrufen. Das steht auch irgendwo auf der
Seite von FreeRTOS.

Ah, hier war es:

http://www.freertos.org/FAQHelp.html

Punkt 4 lesen.

von Moritz (Gast)


Lesenswert?

Danke für die Antwort.

Die ISR Prioritytät müsste sich ja über

HAL_NVIC_SetPriority(TIM2_IRQn, -->5<--, 0);

Und die RTOS Priorität sich über

#define configMAX_SYSCALL_INTERRUPT_PRIORITY

einstellen lassen?

Hier habe ich bereits mehrere Variationen ausprobiert gerade beim Timer 
zwischen 5 und 15.

Auch bei selber Priorität wie TIM2 funktioniert der Aufruf im SysTick 
immernoch.
Oder hab ich hier etwas falsch verstanden?

von Moritz (Gast)


Lesenswert?

Noch als kleine Anmerkung, wenn ich den selben Code vom Timer_ISR auf 
einen PIN_ISR ändere funktioniert es ...

von Moritz (Gast)


Lesenswert?

OK, ich habs.
Ich musste den Timer aus einem Task heraus starten ...

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.