1

このコードがハード フォールトを引き起こし、無限ループにジャンプするのはなぜですか?

#include <stdint.h>
#include <math.h>

void myfunc()
{  
    const double val = 1;
    double log_res = log2(val); // <----- THIS CAUSES A FAULT
    //double log_res = log2(1); // This works
}

val邪悪な行をハードコードされた 1に置き換えると、コードが機能します。そのため、 (コードに示されているように)に渡しvalたときにのみ問題が発生します。log2なぜこうなった?

STM32F429ZI MCU で STM32CubeIDE (Eclipse ベース) を使用しています。

アップデート:

逆アセンブリ ウィンドウで例外を確認すると、これが発生した例外であることがわかりました。

fffffff9: MI コマンドの実行に失敗しました: -data-disassemble -s 4294967289 -e 4294967429 -- 3 デバッガー バックエンドからのエラー メッセージ: アドレス 0xfffffffe のメモリにアクセスできません

なぜこれが起こっているのか誰にも分かりますか?

更新 2:

アセンブリ命令でのデバッグ:

54            const double val = 1;
08000e0a:   mov.w   r3, #0
08000e0e:   ldr     r4, [pc, #64]   ; (0x8000e50 <myfunc+88>)
08000e10:   strd    r3, r4, [r7, #16]
55            double log_res = log2(val);
08000e14:   vldr    d0, [r7, #16] // <------ X THIS LINE CAUSES THE PROBLEM X
08000e18:   bl      0x8002a9c <log>
08000e1c:   vmov    r0, r1, d0
08000e20:   add     r3, pc, #36     ; (adr r3, 0x8000e48 <myfunc+80>)
08000e22:   ldrd    r2, r3, [r3]
08000e26:   bl      0x800085c <__divdf3>

強調された行は d0=0, r7=0x2002ffcc です

この行を実行した後、逆アセンブラは にジャンプしWWDG_IRQHandlerます。

更新 3:

GCC アセンブラー オプション (これが何をするかは不明):

-mcpu=cortex-m4 -g3 -c -x assembler-with-cpp --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb

GCC コンパイラ オプション:

-mcpu=cortex-m4 -std=gnu11 -g3 -DSTM32F429I_DISC1 -DSTM32 -DSTM32F429ZITx -DSTM32F4 -DDEBUG -DSTM32F429xx -c -I..\Inc -I../Inc/CMSIS/Include -I../Inc/CMSIS/Device/ST/STM32F4xx/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb

GCC リンカー オプション:

-mcpu=cortex-m4 -T"C:\Users\mne\STM32CubeIDE\workspace_1.0.0\MyUSB\STM32F429ZITX_FLASH.ld" --specs=nosys.specs -Wl,-Map="${ProjName}.map" -Wl,--gc-sections -static --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -Wl,--start-group -lc -lm -Wl,--end-group

アップデート 4:

math.hこの問題は、たとえばの多くの機能で発生したようfminです。

4

4 に答える 4