本人实地测试,将Keil MDK 5.41与STM32CubeMX 6.13.0搭配使用,曾遭遇AC6编译器-O2优化等级所引发的程序随机跑飞状况,遭遇过外设初始化顺序出现错乱的情况,还遭遇过堆……
本人实地测试,将Keil MDK 5.41与STM32CubeMX 6.13.0搭配使用,曾遭遇AC6编译器-O2优化等级所引发的程序随机跑飞状况,遭遇过外设初始化顺序出现错乱的情况,还遭遇过堆栈溢出却无报错的陷阱,新手只要依照步骤逐一进行操作,便能够轻易避开这类常见问题。
优化等级导致程序跑飞怎么解决
进入打开的 Keil 工程,点击魔术棒图标,进入该环境下的“Options for Target”,切换到“C/C++ (AC6)”选项卡,找到“Optimization”下拉框,把默认的“Level 2 (-O2)”改成“Level 0 (-O0)”,点击 OK 进行保存,此等操作会使得所有代码优化被关闭,虽然固件体积会变大,然而调试时每条 C 语句都能与汇编严格对应。
【新手躲开陷阱】,常见的报错情形是,程序运行短短几秒之后,就进入到HardFault_Handler。核心的缘由在于,“-O2”这个等级会重新排列指令,并且删除那些“无用”的变量,要是代码当中存在对于易失性寄存器的不规范操作,像是没有添加volatile关键字,那么优化之后就会直接失效。快速的解决办法是,先在全局设置为-O0来定位问题,接着对单个文件右键点击属性,设置为-O1,然后逐个进行排除。
外设初始化顺序怎么调整才稳
回到STM32CubeMX的界面那儿,点击位于左侧的“Project Manager”项,而后再去点击“Advanced Settings”。寻找到你出现问题的那个外设,像I2C1这种,在“Generate Initialize Code”这一列当中,借助鼠标进行拖拽以此改变行的顺序。按照固定的操作要求:把I2C1拖动到GPIO以及DMA的前面,并且与此同时点击下方的“Apply”按钮。接着,再次去生成代码,当把Keil工程打开之后,就能够看到,在main.c里面,MX_I2C1_Init()这个部分被挪动到了最前面的位置。
按照新手避坑的说法,实际出现错误的情况是,在进行I2C通信的时候,SCL以及SDA线一直处于卡在高电平的状况,而逻辑分析仪根本捕捉不到起始信号。之所以会出现这样的出错原因是,默认的顺序先将GPIO初始化为开漏模式,在此时引脚出现悬空从而产生未知状态,之后再去配置I2C外设就会引发冲突。能够快速解决的办法是,除了要调整顺序之外,还必须在I2C_Init()之前手动添加HAL_Delay(10)等待电源稳定!
中断嵌套死机完整排查流程
系统随机死锁出现之际,开启工程“RTE_Device.h”,寻觅NVIC优先级分组设定。关键参数推荐数值:把优先级分组设成4(也就是4位抢占优先级,0位子优先级),相应的数值为0x04。缘故是:STM32F4系列默认运用4位抢占,多数RTOS需要这般分组,设置错误会致使中断响应紊乱。在名为“stm32f4xx_hal_conf.h”的文件里头,对宏定义HAL_NVIC_PRIORITYGROUP_4作出修改。
针对新手需要避开的坑的情况,有着高频出现的完整报错内容,其处于这样一种状况,即Error:….Sourcekernel.c所在位置为267那里,出现了RTOS断言失败的问题;而存在一站式的解决流程,其包含这些步骤,首先是检查所有中断优先级数值范围,这里面抢占优先级必须处在0到15这个范围;接着是在启动文件里去确认栈大小Stack_Size要大于或等于0x1000;最后是把SysTick和PendSV优先级设置为最低也就是15。不适用的场景是,要是你所运用的是STM32H7系列,也就是具有Cortex – M7内核的那种,它的优先级机制当中存在着子优先级位,那么这一套分组方法就会失去效用。简易的替代方案为,直接去采用HAL库默认的优先级分组0,也就是4位子优先级的那种,随后将所有外设中断抢占优先级全都设定为0。
在看完这三点实际操作之后,你认为于自身的项目当中,最为令人头疼的究竟是优化等级之间产生的冲突,还是初始化顺序的时候出现的错乱情况呢?欢迎在评论区域分享你遭遇踩坑的经历,点赞并且收藏,从而让更多的电子工程师能够减少走弯路的情况。
微信扫一扫
还没有评论呢,快来抢沙发~