因为项目需要,将以前一个项目移植到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金钱,我全部奉上。如能解决问题,另有感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
折腾了好几天了,原来的代码有几个地方是通过throw异常,实现从多层函数调用直接返回顶层调用函数并处理,如果不用这种机制,需要改动原代码的框架,这就会涉及到巨大的工作量和开发周期。
一周热门 更多>