在下图中、ARM 将从 UNION "SPL_SensingMic "内加载变量"UI_SPL_SensingMic "。
执行的操作
1.从 sp 获取基址。
有道理。 它是 struct *(element)的基址。
2.将地址0x803657D2+8中的值加载到寄存器 s0中。
这里的逻辑电路没有问题。
执行后、ARM 从监控器进入中止模式。
引用自 ARM 系统开发人员指南-设计和优化系统软件:
μ「预取中止向量在处理器试图从没有正确访问权限的地址提取指令时发生。 实际中止发生在解码阶段。」
「数据中止向量类似于预取中止、但当指令在没有正确访问权限的情况下尝试访问数据存储器时、会产生该向量。」
在这种情况下、我不确定该中止预取还是数据?
为什么会发生这种情况?
这是编译器测试用例
"c:/ti/ccsv8/tools/compiler/ti-cgt-arm_5.2.5/bin/armcl /ti/ccsv8/ATEIS /ti/ccsv8/ATEIS /ti/ccsv8/ATEIS -mv7A8 --code_state=32 --float_support=VFPv3 --abi=eabi -me --include_path="C:/ti/ccsv8/tools/compiler/ti-cgt-arm_5.2.5/include /ti/ccsv8/ATEIS /ti/ccsv8/ATEIS /ti/ccsv8/ATEIS --include_path="C:/ti/ccsv8/ATEIS AM335X/include/ucos include"--include:/ti/ccsv8/ATEIS AM335X/include:/ti/ccsv8/ATEIS AM335X/include:包含"AM335X/include:/ti/ccsv8/ATEIS /ti/ccsv8/ATEIS include_path="C:/ti/ccsv8/ATEIS /ti/ccsv8/ATEIS am335X/include/Lib_DSP_function"--include_path="C:/ti/ccsv8/ATEIS /ti/ccsv8/ATEIS am335X/include/Lib_DSP_Filter"--include_path="C:/ti/ccsv8/ATEIS /Middleware/DNM_Channel.c am335X/source 代码/include_remote_display_intransc_super-ine_remote_remote_ine_ine_intrade-come-come_ines=-ine_ine_ine_intransc/cc_ine_remote_remote_remote_ines=-ines=-ines=-ine_remote_remote_ine_ine_remote_remote_remote_ines=-ines=-ine_ine_ines=-ine_ine_inese-cov-ines=-ccs_enote_remote_remote_display-ines=-ines=-ines=-ine_ines=-intr-ine_ine_ine_ines=-inese-ines=-inese-ine_inese-inese-cov-ines=-inese-in
已完成构建:"./Middleware/DNM_Channel.c
e2e.ti.com/.../DNM_5F00_Channel.pp.txt
编辑:
引用自 ARM 系统开发人员指南-再次设计和优化系统软件。
我猜中止的原因是地址 0x803657D2+8不是四个字节的倍数。
但为什么编译器不将此变量分配给4的倍数? 我没有指定 packed 到结构、因此它应该是多4的地址。