This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/AM3352:SVC指令崩溃

Guru**** 2595780 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/620791/compiler-am3352-crash-on-svc-instruction

部件号:AM3352
“Thread:SysBIOS”中讨论的其它部件

工具/软件:TI C/C++编译器

我的 裸机应用程序在调试时始终运行良好,但当相同的代码加载到ram并 从我的辅助引导加载程序执行时,会始终崩溃。

已 验证应用程序代码的加载,分支到其起始地址也可以正常工作。  原因始终是应用程序中(标准)启动文件使用的"Svc"指令,问题是没有加载特定的Svc异常向量,它只是进入了标准的分支对我的死循环。

奇怪的是,在调试过程中,您可以逐步执行svc命令,然后它进入异常引导程序,但随后神奇地返回到svc之后的指令。  但是,当引导加载程序加载并执行时,Svc异常将被正确接受,并最终进入死亡循环。

我尝试了很多不同的方法来解决这个问题,花了太多的时间来解决这个问题,但都没有结果。  有人能帮你吗?

这是从重置向量(0x8600万)到 _start中的Svc指令的转储。 。

8600万:  E59FF018           LDR       PC,[PC,#0x18]
8600.0004万:  E51FF008           LDR       PC,[PC,#-8]
8600.0008万:  E59FF018           LDR       PC,[PC,#0x18]<< Svc异常(从地址0x8600.0028万加载PC)
860万c:  E51FF008           LDR       PC,[PC,#-8]
8600.001万:  E51FF008           LDR       PC,[PC,#-8]
8600.0014万:  E51FF008           LDR       PC,[PC,#-8]
8600.0018万:  E51FF008           LDR       PC,[PC,#-8]
860万c:  E51FF008           LDR       PC,[PC,#-8]
8600.002万:  8600.005万          .word      0x8600.005万
8600.0024万:  0万           andeq     r0,r0,r0
8600.0028万:  8600.0049万           strhi     r0,[r0],-r9,ASR #32 <<拇指模式向量0x8600.0048万
860.0002万c:  0万           andeq     r0,r0,r0
8600.003万:  0万           andeq     r0,r0,r0
8600.0034万:  0万           andeq     r0,r0,r0
8600.0038万:  0万           andeq     r0,r0,r0
860.0003万c:  0万           andeq     r0,r0,r0
8600.004万:  860.0004万F           strhi     r0,[r0],-PC,ASR #32
8600.0044万:  E7FEE7FE           UDF       #0xee7e      }
8600.0048万:  E7FEE7FE           UDF       #0xee7e      } Thumb instr对,从所有分支到自身
860.0004万c:  E7FEE7FE           UDF       #0xee7e      }

         entry():
8600.005万:  E59F002C           LDR       r0,[PC,#0x2C]
8600.0054万:  EE0C0F10           MCR       P15,#0,r0,C12,c0, #0
8600.0058万:  EE113F50           MRC       P15,#0,R3,C1,c0, 2号
860.0005万c:  E38.336万F           Orr       R3,R3,#0xf0万
8600.006万:  EE013F50           MCR       P15,#0,R3,C1,c0, 2号
8600.0064万:  E3A0.3万           移动       R3,#0
8600.0068万:  E3A0.0101万           MOV       r0,#0x4000万
860.0006万c:  EEE80A10           vmsr      fpexc,r0
8600.007万:  EE073F95           MCR       P15,#0,R3,C7,C5, 4号
8600.0074万:  E59FA00C           LDR       R10,[PC,#0xc]  <<< 从0x8600.0088万加载_start地址
8600.0078万:  E1A0E00F           移动       LR,PC
860.0007万c:  E12FFF1A           BX        R10

8600.008万:  E24FF008           sub       PC,PC,#8
8600.0084万:  8600万           strhi     r0,[r0],-r0
8600.0088万:  8600.0128万           strhi     r0,[r0],-R8,LSR #2 <<<<<<<<<<<<< _开始
860.0008万c:  0万           andeq     r0,r0,r0

.....

         _开始
8600.0128万:  E3B0.0016万           MOV      r0,#0x16
860.0012万c:  E28F1F4A           添加       R1,PC,#0x128
8600.013万:  EF12.3456万           服务       #0x12.3456万      <<< 崩溃-没有 为Svc异常加载实际引导程序
8600.0134万:  E59F0120           LDR       r0,[PC,#0x120]
8600.0138万:  E590.1004万           LDR       R1,[r0,#4]
860.0013万c:  E59F2138           LDR       R2,[PC,#0x138]
8600.014万:  E582.1万           str       R1,[R2]


[我的设置是:
定制PCB
AM3352BZCZ30
CCS版本:6.1 .2.0.0015万
BIOS_6_45_01_29
PDK _AM335x_1_0_3
GNU v 4.9 3 (Linaro)
Win 7 64位]

谢谢!
GerryL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Gerry,

    我们收到一则通知,您可以确定semihosting或"rdimon"库导致您的代码出现此问题。  

    SVC进入ARM上的主管模式,要求核心呼叫引导监视器。  请参阅以下内容当GCC与TI RTOS一起使用时,半托管支持似乎需要安装SVC处理程序。

    http://processors.wiki.ti.com/index.php/SYS/BIOS_with_GCC_(CortexA)#How_do_I_enable_Semi-Hosting_for_Cortex-A_GNU_targets_.3F

    您也可以检查源文件:

    BIOS_6_46_05_55\packages\ti\SysBIOS\RTS\GNU\SemiHostSupport.c.

    您还可以查看GCC或ARM论坛,查看以前是否报告过此问题。  希望这有所帮助。

    此致,

    拉胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Rahul,

    我删除了关于半托管的帖子,因为它是虚假线索。 我不需要半托管(现在我知道它是什么了)。

    因此,根据POST的提示,无法进入新主板(am3352),我已将库“rdimon”更改为“nosys”,并在调试设置中禁用了半宿主。

    但是Svc指令仍然存在,并且仍然没有有效的Svc媒介,并且崩溃仍然存在。

    我唯一能做到这一点的方法是在将代码加载到ram后,在跳转到起始地址之前,安装我自己的Svc引导程序。 新的矢量从Svc (MOV PC,r14)跳转到简单的返回,我能够将它编译到必须用于SBL的自定义启动文件中(参见SPI引导失败)。

    为什么必须进行这些自定义修改,而不是在这些修改之前的所有调试时间? 我所要做的只是“将可执行文件加载到ram,跳转到start address”。

    谢谢!
    GerryL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    GerryL 说:
             _START
    8600.0128万:  E3B0.0016万           MOV      r0,#0x16
    860.0012万c:  E28F1F4A           添加       R1,PC,#0x128
    8600.013万:  EF12.3456万           服务       #0x12.3456万      <<< 崩溃-没有 为Svc异常载入实际引导程序

    ,该_START函数中的半宿主呼叫是 SYS_HEAPINFO (0x16)(如 http://processors.wiki.ti.com/index.php/Semihosting#Supported_Calls中所列)。  

    要在没有附加调试器的情况下运行程序,我的理解是该程序不能进行任何半宿主调用。

    START函数来自何处?

    我认为解决方案是改用_start函数,该函数不进行半托管调用,但(尚未)查看 PDK_AM335x_1_0_3中提供的启动代码。