华芯微特SWM34-编译优化

在开发过程中,经常会出现代码bug,导致各种死机问题,比较多的就是非法地址访问,导致出现硬件错误(HardFault)的中断。
出现这种问题后,使用调试器再次连接,很难连接上cpu,需要使用工具,进行ISP擦除,开发非常不方便。
官方给出来一个解决方案,在main启动函数中,添加如下代码:

void main(void{
	for (uint32_t i = 0; i < 666666 * 100; ++i) __NOP();
}

此代码的原理,就是在启动阶段,延时一会,在程序跑飞之前,使调试器能够有机会连接上去。
但是,这个代码有一个问题,如果我们使用keil()或者其他编译器)的时候,开了优化(非默认和-O0),此段代码会被编译器优化掉,不会起作用(不会运行,因为编译器发现此代码没有动作)。
要解决这个问题,需要做如下修改,增加关键字volatile ,阻止编译器的优化动作:

void main(void{
	for ( volatile  uint32_t i = 0; i < 666666 * 100; ++i) __NOP();
}

在其他驱动里面也有类似的情况,如果你遇到了问题,可以参考修改。
比如如下代码,都需要对变量i添加volatile 的约束,阻止编译器优化:

void ADC_Calibrate(ADC_TypeDef * ADCx)
{
	uint32_t i;	
	
	ADCx->CALIB |= (1 << ADC_CALIB_RESET_Pos);
	for(i = 0; i < 120 * 20; i++) __NOP();			//2个采样时钟周期
	
	ADCx->CALIB |= (1 << ADC_CALIB_START_Pos);
	for(i = 0; i < 120 * 10; i++) __NOP();
	ADCx->CALIB &=~(1 << ADC_CALIB_START_Pos);
	while(ADCx->CALIB & ADC_CALIB_BUSY_Msk) __NOP();
	
	ADCx->CALIB |= (1 << ADC_CALIB_LOAD_Pos);
}

原创文章,欢迎转载,请注明来源,未经书面允许,请勿用于商业用途。
关注微信公众号:嵌入式开发实战营,了解更多。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值