我尝试对我用来执行计算的某些数据进行转换。我使用的是ARM Cortex M4,代码是用C语言编写的。
我要进行的转换和计算:
//First Calculation
//This are inside a function:
volatile float new_freq_temp;
volatile int new_data_qty;
uint32_t new_freq = (int) ((500/new_freq_temp)/new_data_qty);
//Second Calculation
//This are globals:
static volatile uint32_t monitor_freq = 0;
static volatile uint32_t monitor_data_qty = 0;
float tot_freq = (float) ((500.0/ ((float) monitor_freq))/((float) monitor_data_qty));
uint8_t *array_data_p;
array_data_p = (uint8_t*)(&tot_freq);
这两个计算分别是一个单独的函数,并且没有相关性,但它们非常相似。
从我添加这两个计算开始,我开始遇到一些随机的HardFault。我已经进行了一些测试,并且最后的配置(我上面发布的)似乎一切正常,但我担心如果我以正确的方式执行此操作。此外,由于这个HardFaults并不频繁,我需要确保这项操作在很长一段时间内都是可靠的。
特别是,在测试中,我发现了这些奇怪的事情:
First Calculation
添加500
这样的点((500.0/new_freq_temp)/new_data_qty)
这会导致HF,如果我向Second Calculation
添加相同的内容,则不会发生这种情况(float) ((500.0/ ((float) monitor_freq))/((float) monitor_data_qty))
移除500
点0或删除包含所有操作的冗余(float)
,则会导致随机但不频繁的HF。volatile uint32_t new_freq
或volatile float tot_freq
等结果变量,则会导致HF 我的前提是我应该使用这种类型的变量而且我不能将所有变量都改为浮动。
这种转换是正确的还是我如何才能更好地避免使用HardFaults?
P.S。这是我注册的HardFaults:
stacked_r0 0x00409435 stacked_r0 0x20000d0c stacked_r0 0x00409435
stacked_r1 0x00000005 stacked_r1 0x00400e79 stacked_r1 0x00000005
stacked_r2 0x00401561 stacked_r2 0x0040a141 stacked_r2 0x00401561
stacked_r3 0x20000924 stacked_r3 0x00000200 stacked_r3 0x20000924
stacked_r12 0x0040146d stacked_r12 0x20000d50 stacked_r12 0x0040146d
stacked_lr 0x00000001 stacked_lr 0x20000d0c stacked_lr 0x00000001
stacked_pc 0xa000005d stacked_pc 0x20000d08 stacked_pc 0x0000005d
stacked_psr 0x00000005 stacked_psr 0x20000924 stacked_psr 0x00000005
_CFSR 0x20000924 _CFSR 0x00000000 _CFSR 0x20000924
_HFSR 0x00000000 _HFSR 0x20000dcc _HFSR 0x00000000
_DFSR 0x00000000 _DFSR 0xa8401601 _DFSR 0x00000000
_AFSR 0x3fefde7f _AFSR 0x200008d5 _AFSR 0x3fef0050
_BFAR 0x0040149b _BFAR 0x20000000 _BFAR 0x0040149b
_MMAR 0x3f7dc000 _MMAR 0x00000005 _MMAR 0x3f7a0000