系统调用在 Atmel AVR Studio(使用 ASF)中不起作用

Posted

技术标签:

【中文标题】系统调用在 Atmel AVR Studio(使用 ASF)中不起作用【英文标题】:System calls not working in Atmel AVR Studio (with ASF) 【发布时间】:2013-02-16 07:02:04 【问题描述】:

我在 AVR Freaks 论坛上没有得到答案,想知道这里是否有人可以帮助我。

答案可能在this SO question,但我不确定为什么有必要。

基本上,我有我的第一个 Atmel 项目(AVR studio 6,UC3 处理器)。代码编译和链接,我可以将它加载到 Atmel 板并在调试器中逐步执行。

但是,当我尝试跳过(或运行到后行的断点)时,对 sprintf()、malloc() 或 memcpy() 的(有效)调用(可能还有更多,我还没有发现),IDE 永远不会返回到我的代码的下一行,只是似乎挂起,或者永远运行。

[注意]编译器优化关闭

我是否需要设置一些链接器选项(例如链接静态(我尝试过但没有帮助)?或者使用一些库构建?

让我困惑的是代码编译器和链接——当我调用这些标准函数时,链接的是什么?如果我需要其他东西,我会期待编译器或链接器错误,但没有得到 - 那为什么我的代码不会运行?

很抱歉提出这么愚蠢的 n00nb 问题,但这是我的第一个微控制器项目。

【问题讨论】:

您是否尝试过进入电话?您可能最终会进入 AVR-assembly-land,但至少您可能能够找出崩溃的原因。 【参考方案1】:

我发现我板上的 CPU 是工程示例,如果没有新的 io.h 文件,Atmel Studio 不支持。

我从这个问题中猜到了这一点:http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=106652

很抱歉给您添麻烦了。

【讨论】:

【参考方案2】:

当我调用这些标准函数时,链接了什么?

AVR-libc,移植到 AVR 平台的 C 标准库的实现。

那为什么我的代码不能运行?

编译器错误和运行时错误甚至不相关。这两行都是有效的 C 语言并且它们可以编译,但是,在大多数系统上,我希望它们能够转储内核:

int x = 1 / 0;
*(int *)0 = 41;

所以它可能是:

标准库中的错误(极不可能),或 在线调试器中的错误(极不可能),或 也许您只是期待一些不应该发生的事情?

【讨论】:

+1 @H2CO3 +1 关于无效的点,但是:我在 main() 的开头尝试了一些非常简单的示例。 char s[32]; sprintf(s, "forty two =%d \n", 42); 等。对于 memcpy() 我确保源是非空的,目标有足够的空间,源和目标不重叠。等等 总而言之,我确信代码没问题,尤其是当它在 AVR Studio 的模拟器模式下运行时,以及带有 Cygwin 的 udner Netbeans。我坚信这只是对项目设置的无知,也许是我的链接器设置。你能帮忙吗? @Mawg 它是否在 AVR 本身上运行而无需调试? IE。只需以“发布模式”或其他方式启动它,无需附加调试器。 +1 好点;我将不得不检查 tml.但是,很明显,我无法调试的东西对我没有多大用处。这是一个大型项目【参考方案3】:

如果您在要跳过的行之后的下一行设置断点,而不是尝试跳过,会发生什么?

另外,如果关闭编译器优化,操作是否会改变?

【讨论】:

+1 如果我在之后的行上设置断点并运行到该行,也会发生同样的事情。而且,由于我仍在开发中,因此我关闭了优化。

以上是关于系统调用在 Atmel AVR Studio(使用 ASF)中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

初学者:AVR C++ Atmel Studio 6

在 Atmel AVR studio 中使用 ATMega2560 读取 RC PWM 信号

ATMEL AVR STUDIO 程序

使用 Atmel Studio 作为通用 C 编译器

如何在不创建新项目的情况下更改 Atmel Studio 6 中 C++ 的 avr32-gcc C 编译器?

我正在用 atmel 编写 AVR 程序集,但“调用”指令不起作用