Keil4,STM32F4使用C++异常处理机制,一调用throw直接进入HardFault_Handler

2019-07-20 01:37发布

因为项目需要,将以前一个项目移植到keil中,由于代码中存在异常处理逻辑,也就是使用了 try{}catch(){}结构,发现只要代码执行到throw语句,就会导致进入异常处理中断函数:HardFault_Handler()中

硬件为STM32F429,keil4和keil5都试过了,编译选项也添加了 --exceptions

为了验证异常捕获机制,我新建了一个新工程,直接把keil官网的例子代码copy过来:

#include <stdlib.h>
#include <string.h>
#include <exception>

class runtime_error : public std::exception {
   public:
     runtime_error (const char* error)throw()
                         : m_perror(0)
                 {
                         if (error)
                         {
                                 m_perror = (char*)malloc(strlen(error) + 1);
                                 strcpy(m_perror, error);
                         }
                 }
                 
                 virtual ~runtime_error() throw()
                 {
                         if (m_perror)
                         {
                                 free(m_perror);
                                 m_perror = 0;
                         }
                 }
                 
    runtime_error(const exception&) throw()
                {
                        m_perror = (char*)malloc(16);
                        strcpy(m_perror, "NoInfo");
                }
               
    runtime_error& operator=(const runtime_error& obj) throw()
                {
                        m_perror = (char*)malloc(strlen(obj.m_perror) + 1);
                        strcpy(m_perror, obj.m_perror);
                       
                        return *this;
                }
               
    virtual const char* what() const throw()
                {
                        return m_perror;
                }
               
         protected:
                 char* m_perror;
};


static void ftest() throw()
{
       int i;

       i = 5;
       throw runtime_error("a runtime error");
}

void main()
{
        try
        {
                ftest();
        }
        catch (const runtime_error& e)
        {
                // 异常处理代码
        }

        while(1)
        {
                // 循环代码
        }
}

但是代码始终无法进入“异常处理代码”,也无法进入while循环,单步跟踪,只要到throw runtime_error("a runtime error"); ,立刻就进入了HardFault_Handler()函数中,不知有哪位朋友是否遇到过类似问题,由于只有11金钱,我全部奉上。如能解决问题,另有感谢!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
sw0zwl
1楼-- · 2019-07-21 08:02
大碗公 发表于 2018-4-12 12:54
没有F429平台,在M3测试是没问题,不过在F407是有问题的

折腾了好几天了,原来的代码有几个地方是通过throw异常,实现从多层函数调用直接返回顶层调用函数并处理,如果不用这种机制,需要改动原代码的框架,这就会涉及到巨大的工作量和开发周期。
sw0zwl
2楼-- · 2019-07-21 12:06
 精彩回答 2  元偷偷看……
sw0zwl
3楼-- · 2019-07-21 17:25
 精彩回答 2  元偷偷看……
八度空间
4楼-- · 2019-07-21 17:52
sw0zwl 发表于 2018-4-12 19:01
@正点原子 @八度空间 ,请高人指点一下,救救命呀

没用过use microLIB
sw0zwl
5楼-- · 2019-07-21 20:46
查找了两天Keil异常处理机制相关的资料,真是很少很少。

现在我打算自己造轮子,实现一个简单版的try-catch模型,据目前掌握的信息调用帧的回卷和栈的恢复基本没太大问题,关键是如何做到堆的恢复,有哪位高手有这方面的经验,如何监测堆内存分配,以及恢复?
yxwsbobo
6楼-- · 2019-07-21 23:04
 精彩回答 2  元偷偷看……

一周热门 更多>