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!
>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.
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?
Noch als kleine Anmerkung, wenn ich den selben Code vom Timer_ISR auf einen PIN_ISR ändere funktioniert es ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.