Hi,
I've run into a strange problem using cmsis_os (keil rtx), retargetting of semi-hosting to uart, and interrupts.
I have a simple project set up to use cmsis-rtos (importing rtx_cm4.lib) and uart rx interrupts (using the stm32f4xx hal libraries). Using microlib everything works fine, but as soon as I move to retargetting semihosting (using basically just the retarget.c file from keil) I end up in the hardfault handler.
My code for main is just:
int main() { // initialise the real time kernel osKernelInitialize(); // we need to initialise the hal library and set up the SystemCoreClock // properly HAL_Init(); configure_168MHz(); // set up the uart (with rx interrupts enabled) init_uart(9600); enable_rx_interrupt(); // print a status message printf("we are alive!\r\n"); // start everything running osKernelStart(); }
and I get the "we are alive!" message displayed on the uart, but as soon as I type anything into the uart window, the uart rx interrupt triggers and then dumps me into the hardfault handler. However, there isn't much information in the registers. This is what I get:
in hard fault handler SCB->HFSR = 0x40000000 SCB->CFSR = 0x00000000 SCB->MMFAR = 0xe000ed34 SCB->BFAR = 0xe000ed38 stack dump: SP = 0x20001d40 R0 = 0x20001730 R1 = 0x0000ffff R2 = 0x080005ed R3 = 0x0000000a R12 = 0x0800425d LR = 0x080038ef PC = 0x08000ac0 PSR = 0x21000057
So I can tell I have ended up with a forced hard fault, but the CFSR register is empty so I can't tell what caused it.
Could anybody give me any pointers here? The same code works with no rtos, and the same code works with no retargetting - just not with both rtos and retargetting!
Thanks for your time!
Alex