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.

[参考译文] 编译器/TDA2EXEVM:关于 MPU A15中的异常处理程序

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/658132/compiler-tda2exevm-regarding-exception-handler-in-mpu-a15

器件型号:TDA2EXEVM

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

您好!

 我们正在尝试在 被零除时生成未定义指令异常。  

以下是为此执行的步骤。

volatile uint16 GucNullcheck = 10;

 Volatile uint16 LucZeroDivisor = 0;

1>设置 SCTLR 19位 DZ

   var (uint32、OS_VAR_cleared) LddCurrentTick=0;
   asm volatile ("MRC P15、0、%Q0、C1、C0、 0":"=r"(LddCurrentTick);/* cntct */
   LddCurrentTick = LddCurrentTick| 0x80000;
   asm volatile ("mcr p15、0、%0、c1、c0、 0":"r"(LddCurrentTick);

2>GucNullcheck = GucNullcheck/LucZerDivisor;

根据 doc、它说它在 SDIV 和 UDIV 指令上生成异常、但它不应在第二条指令执行后生成

以下是供参考的汇编代码

161 GucNullcheck = GucNullcheck/LucZerDivisor;
403057d0:F645432C movw R3、#0x5c2c
403057d4:F2C40330 movt R3、#0x4030
403057d8:881B ldrh R3、[R3]
403057da:B29A uxth R2、R3
403057dc:887B ldrh R3、[r7、#2]
403057de:B29B uxth R3、R3
403057e0:FBB2F3F3 Udiv R3、R2、R3
403057e4:B29A uxth R2、R3
403057e6:F645432C movw R3、#0x5c2c
403057ea:F2C40330 movt R3、#0x4030
403057ee:801A strh R2、[R3]

请建议生成未定义异常的错过场景。

谢谢、

Harshalkumar Shinde

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

    我已将您的问题转交给一位专家征求意见。

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

    您好 Harshal、

    您能帮我更好地理解问题吗?

    您当前是否没有收到异常(代码根本不会跳转到 异常处理程序)?

    您正在接收异常、但正在执行不同的指令?

    谢谢、此致、

    Piyali

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

    如果发生 SVC 异常、它可以正常工作。 但是、如果我尝试在零分频指令上生成异常、它在执行零分频指令后不能生成任何异常。 根据文档、它应该进入未定义的异常。 代码根本不会跳转到异常处理程序。

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

    我将在我的结尾处尝试重现此问题、并随时向您更新我发现的内容。

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

    您好 Harshal、

    我将介绍有关这方面的一些文档。 我找到了: https://community.arm.com/processors/b/blog/posts/divide-and-conquer

    此处明确提到、ARMv7-A 不支持零分频误差的异常。 返回的结果为0。

    谢谢、此致、

    Piyali

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需添加:
    Cortex A15支持 ARMv7-A 架构。

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

    您好、Priyali、

    感谢您的回复。

    请建议生成任何异常的任何情形或指令、例如中止或数据中止或未定义以检查异常处理。

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

    您可以使用 UDF 指令生成未定义指令异常:

    infocenter.arm.com/.../index.jsp

    在代码中添加以下行会导致"UDF" 代码中包含#0"指令。
    asm volatile (".word 0xe7f000f0\n");

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

    您好、Piyali、

    感谢您的回复。 该指令解决了我们的异常生成问题。  

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

    该指令中有一些问题、如果控制器在执行指令之前处于 Thumb 模式、则控制进入 FIQ 异常、如果我在该指令之前手动将其更改为 ARM 模式、则控制进入未定义异常。

    如果我尝试通过在应用程序中写入 CPSR 来将 Thumb 更改为 ARM 模式、控制权将再次转到上一条指令、并且无法生成任何异常。

    while (GIsr0Count!= 1)


    asm ("MRS R0、CPSR");
    asm ("和 R0、#0xFFFFFFDF");
    asm ("MSR CPSR、r0");
    asm volatile (".word 0xe7f000f0\n");
    GIsr0Count = 2;

    162. while (GIsr0Count!= 1)
    403055fc:BF00 NOP
    403055fe:F645233D 模 R3、#0x5a3d
    40305602:F2C40330 移动 R3、#0x4030
    40305606:781B ldrb R3、[R3]
    40305608:B2DB uxtb R3、R3
    4030560a:2B01 CMP R3、#1
    4030560c:D1F7 BNE 0x403055fe
    169. asm ("MRS R0、CPSR");
    4030560e:F3EF8000 夫人 R0、Apsr
    170asm ("和 R0、#0xFFFFFFDF");
    40305612:F0200020 BIC R0、r0、#0x20
    172.asm ("MSR CPSR、r0");
    40305616:F3808900 MSR CPSR_fc、r0
    4030561a:00F0 lsls R0、R6、#3
    4030561c:E7F0 B 0x40305600
    175. GIsr0Count = 2;


    当控制器处于 Thumb 模式时、会生成代码、但无法生成建议的 UDF #0指令

    while (GIsr0Count!= 1)


    asm volatile (".word 0xe7f000f0\n");
    GIsr0Count = 2;

    162. while (GIsr0Count!= 1)
    403055fc:BF00 NOP
    403055fe:F6452331 模 R3、#0x5a31
    40305602:F2C40330 移动 R3、#0x4030
    40305606:781B ldrb R3、[R3]
    40305608:B2DB uxtb R3、R3
    4030560a:2B01 CMP R3、#1
    4030560c:D1F7 BNE 0x403055fe
    4030560e:00F0 lsls R0、R6、#3
    40305610:E7F0 B 0x403055f4
    175. GIsr0Count = 2;

    请说明控制器在不同模式下的行为不同的原因、并提供一些详细信息、说明我们可以在不手动更改的情况下生成未定义的异常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Harshal、

    您可以在 Thumb 模式下尝试以下操作吗?

    短整型0xdeff

    UDF 的拇指和手臂模式型号为:

    拇指:0xde00 | imm8 (我们为 imm8选择了0xff)
    arm:0xe7f000f0 |(imm12 << 8)| imm4 (我们为两个 IMMS 选择了0) 

    谢谢、此致、
    Piyali