所以现在我明白我得到一个ARM数据中止异常 - 我看到如何捕获异常本身(STL库中的错误地址),但我想在异常之前向后移回堆栈帧.我正在使用IAR工具链,它告诉我在异常后调用堆栈不可用 - 是否有一种技巧方法可以说服工具向我显示调用堆栈?感谢您的所有快速帮助!
我想在IAR Embedded Workbench中创建一个简单的库(C/ANSI),然后在另一个项目中使用该库.我在他们的网站上找到了一些文档.虽然我不完全理解它,但我设法让自己成为一个.r90文件,据我所知,这将是图书馆.请注意,我是这个领域的初学者.总之,我想逐步介绍如何创建库,然后如何在另一个项目中导入它.谢谢.
PS:我正在使用IAR Embedded Workbench for AVR,这个版本没有下面的Library选项卡Linker.
在我的例子中,我有一个使用代码源gcc定位arm cortex-m4构建的库.我试图将该库链接到使用IAR编译器编译的项目.
是否可以这样做或者是否必须使用新工具重建库?哪些因素会影响这个?
我正在使用IAR ARM 7.10并收到警告:
警告[25]:标签'Reset_Handler'在隐式声明为root的部分中被定义为pubweak ...
这有时会导致系统重置.
我该如何解决此警告?
在IAR Embedded Workbench中,我有一个指针指向内存中的缓冲区.观看指针时,我可以看到它指向的单词的内容.如何判断Watch视图是否从指针开始列出了一定范围的缓冲区,用于指定长度的元素?
例如,输入表达式:
myPtr[0..2]
Run Code Online (Sandbox Code Playgroud)
将显示相当于三个表达式的信息:
myPtr[0]
myPtr[1]
myPtr[2]
Run Code Online (Sandbox Code Playgroud) 在我的嵌入式项目中,使用IAR EWARM开发工具(v7.10.3),我有以下代码:
/* 1 */ uint32_t packet_sync = 0;
/* 2 */ uint32_t synced = 0;
/* 3 */ uint32_t gpio = 0;
/* 4 */ while (1) {
/* 5 */ if ((packet_sync != 0) && ((packet_sync = gpio) == 0)) {
/* 6 */ if (synced < 2) {
/* 7 */ synced++;
/* 8 */ }
/* 9 */ }
/* 10 */ };
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我编译代码时,编译器会在编译过程中陷入困境.我尝试使用各种构造,似乎我做了任何微小的改变,消除了问题(但也可能使代码不正确).例如,在#6a中添加NOP,代码确实成功编译:
/* 6 */ if (synced < 2) { …Run Code Online (Sandbox Code Playgroud) 我知道取消引用空指针是未定义的 - 但我想知道在特定目标上发生了什么 - 一个MSP430.
我现在没有一块板可以在我面前加载它来测试它.
如果我这样做(或者类似的话)会发生什么?
int * foo = NULL;
(*foo)++; //Crash?
Run Code Online (Sandbox Code Playgroud)
位置0x0在SFR范围内并保留.
它会产生PUC/POR吗?还是会默默地"工作"?
生成的程序集是
;int * foo = NULL;
clr.w R15
;(*foo)++;
inc.w R15
Run Code Online (Sandbox Code Playgroud)
因此,位置0x0实际上是递增1.
当我在模拟器中运行它时,我看到地址0x0的值从0变为1.我在调试日志中没有警告,程序正常退出.
我正在使用IAR EW430编译器/汇编器/模拟器.
与RS-232通讯时,断点和错误指示实际上会亮起。有时,CTS也会发光。
因此,一段时间内打印的数据会变成垃圾。稍后,在重置一些实际条款后,它会得到纠正。
这是显示错误的屏幕截图:

BREAK的真正含义是什么?休息一下会怎样?
我需要将所有代码都放在ram中(我正在编写Flash)。我正在使用IAR 7.80,并且所有__ramfunc功能都可以在每个函数中使用内在函数,但不适用于C ++构造函数。
例如,我有以下课程:
class Os_Timer {
private:
os_tmrcnt_t tmr;
public:
__ramfunc Os_Timer() { reset(); }
__ramfunc void reset() { os_TimerStart( &tmr ); }
};
Run Code Online (Sandbox Code Playgroud)
我还没有找到在ram中定义构造函数Os_Timer的方法。编译器抱怨
期望一个标识符
和
不允许对象属性
在构造函数行上。
IAR手册指出,__ramfunc必须将放在返回值之前,但构造函数没有返回值。
我尝试不成功地强迫这种__ramfunc行为:
_Pragma("location=\"section .textrw\"")
Run Code Online (Sandbox Code Playgroud)
和
_Pragma("location=\"RAM_region\"")
Run Code Online (Sandbox Code Playgroud)
有人知道该怎么做吗?
在我们的开发中,我们从IAR ARM V7.40切换到IAR ARM V8.40
我们使用 python 包pyelftools对调试信息进行后处理。不幸的是,现在这似乎被打破了,因为 V8 编译器似乎使用 DWARF4 语法,而 pyelftools 并未完全涵盖该语法。V7 编译器使用 DWARF3,这很好。
IAR V8 是否有任何编译器选项可以更改 DWARF 格式?在IAR C/C++开发指南中,我只找到了--debug, -r启用调试信息的选项,但没有进一步的微调(例如-gdwarf-3arm-clang编译器的选项)。