因为项目需要,将以前一个项目移植到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金钱,我全部奉上。如能解决问题,另有感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
现在我打算自己造轮子,实现一个简单版的try-catch模型,据目前掌握的信息调用帧的回卷和栈的恢复基本没太大问题,关键是如何做到堆的恢复,有哪位高手有这方面的经验,如何监测堆内存分配,以及恢复?
一周热门 更多>