本帖最后由 黑皮男 于 2017-6-2 18:41 编辑 原因已找到: 由于调度器启动前进入了SysTick中断导致系统运行异常。上电后就调用__set_PRIMASK(1);关闭中断,后续考虑参考ST官方的方法,判断系统是否启动再决定是否调用OS的时基。 原问题: 以下是开始时提出问题,现在更新问题,发现不是串口的问题,如果初始化后配置时钟后在OS启动前加个while(1);,同样会进入hardfault.不知为何 原问题如下: 遇到一个问题,freeRTOS启动调度器前使用printf会进入HardFault,单步调试就可以正常打印,而且printf语句放到任务中是可以正常打印的,不知是何原因。 #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE { print_log_putchar(ch);//封装串口发送 return ch; } //会死在下面这个函数中, void print_log_register_io(struct print_log_interface fio) { fprint_log = fio; print_log("print log inited!\r\n");//printf_log就是printf进行宏定义,完整文件见附件。 |
调用了,不调用也没事,不掉用的话就不会打印信息,这里用了指针,调用后才会打印
串口相关的代码如下
int uart_putc(unsigned char c)
{
LL_USART_TransmitData8(UART_INSTANCE, c);
while(LL_USART_IsActiveFlag_TC(UART_INSTANCE)==RESET);
return c;
}
fprint_log.put_char = uart_putc;
print_log_register_io(fprint_log);
UART_INSTANCE是USART2,宏定义。单步调试可以正常通过,全速就挂了