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.

[参考译文] 编译器/TDA2EVM5777:用于Cortex M4的异常处理程序

Guru**** 2589280 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/615449/compiler-tda2evm5777-exception-handler-for-cortex-m4

部件号:TDA2EVM5777
主题中讨论的其它部件:TM4C1294NCPDT

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

您好,

以下几点不适用于Cortex M4

1>在Cortex M4用户指南中没有关于如何使用空指针处理异常处理程序/陷阱的信息

2>在“配置和控制寄存器”(0xE000ED14)中,写入值0x10,这样它就会遇到除以零的异常。 我尝试了以下情景,但没有得到例外

  采用具有任何正值的局部变量,将该值除以零。要编译代码,请使用5.2 5编译器。

   以汇编语言生成的代码,没有 SDIV或UDIV指令。 生成的代码如下所示。

  

159 GucNullcheck = GucNullcheck/0;
$C$L9:
83f0.4474万:495C LDR R1,[PC,#0x170]
83f0.4476万:4A5C LDR R2,[PC,#0x170]
83f0.4478万:2000 MOV r0,#0
83f0447a:8809 ldrh R1,[R1]
83f0447c:8010 strh r0,[R2]

请帮助获取上述情况的例外情况。

谢谢!

Harshalkumar Shinde。  

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

    159 GucNullcheck = GucNullcheck/0;[/QUOT]由于尝试除以整数常量零,编译器不执行除法,而是在结果中存储零(生成警告后)。

    要强制除数为零,请将除数设为volatile变量。 以下代码使编译器生成 UDIV指令:

    volatile unsigned int * const NVIC_CFG_CTRL =(volatile unsigned int *) 0xE000ED14;
    #define DIV0_mask 0x10
    
    int main (void){
    
    volatile unsigned int GucNullcheck;
    volatile unsigned int zero_divor =0;
    
    /*尝试在没有启用陷阱的情况下除以零*/
    *NVIC_CFG_CTRL &=~DIV0_mask;
    GucNullcheck = 10;
    GucNullcheck = GucNullcheck / zero_divendor;
    
    /*尝试用零除以启用陷阱*/
    *NVIC_CFG_CTRL || DIV0_MASK;
    GucNullcheck = 12;
    GucNullcheck = GucNullcheck / zero_divendor;
    
    返回0;}
    

    该代码还会通过写入NVIC 配置和控制寄存器,使第2除法为零以生成零除法使用故障。

    在TM4C1294NCPDT Cortex-M4F设备中测试。

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

     您好Chester Gillon:

    感谢您的回复。

    第一点仍有待讨论。 是在读取Null指针时生成陷阱的任何方式。

    谢谢!

    Harshalkumar Shinde  

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

    是他们在读取Null指针时生成陷阱的任何方式。

    在Cortex-M4架构中,没有内置异常机制来捕获读取" Null指针"。

    如果软件尝试在地址空间的“最低区域”中读取或写入,则实施空指针取消引用陷阱会产生异常; NULL指针为零,但如果试图为结构重新引用NULL指针,则尝试访问的地址可能大于零。

    实现 空指针解除引用陷阱的能力取决于设备的内存映射,即:

    A)地址0处的内存映射需要是应用程序不需要读取或写入的内容。

    B)地址的内存映射可以配置为在尝试由软件访问时生成异常。

    在您的Cortex-M4中,地址0处的内存映射是什么?