尝试在ARM

时间:2016-05-03 10:40:17

标签: c arm cortex-m

我尝试对我用来执行计算的某些数据进行转换。我使用的是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添加到volatile uint32_t new_freqvolatile 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

0 个答案:

没有答案