我希望能够对我的Arduino代码进行单元测试.理想情况下,我可以运行任何测试而无需将代码上传到Arduino.哪些工具或库可以帮助我解决这个问题?
正在开发的Arduino仿真器可能很有用,但它似乎还没有准备好使用.
来自Atmel的AVR Studio包含一个可能有用的芯片模拟器,但我看不出如何将它与Arduino IDE结合使用.
我正在编写一个小型解释器,用于简单的BASIC语言,使用avr-gcc工具链在C语言的AVR微控制器上练习.但是,我想知道是否有任何开源工具可以帮助我编写词法分析器和解析器.
如果我写这个在我的Linux机器上运行,我可以使用flex/bison.现在我把自己限制在一个8位平台上,我必须手动完成所有操作,不是吗?
我想为Atmel AVR微控制器编写C代码固件.我将使用GCC编译它.此外,我想启用编译器优化(-Os或-O2),因为我认为没有理由不启用它们,并且它们可能比手动编写汇编更快地生成更好的汇编方式.
但我想要一小段没有优化的代码.我想延迟函数的执行一段时间,因此我想写一个do-nothing循环只是为了浪费一些时间.不需要精确,只需等待一段时间.
/* How to NOT optimize this, while optimizing other code? */
unsigned char i, j;
j = 0;
while(--j) {
i = 0;
while(--i);
}
Run Code Online (Sandbox Code Playgroud)
由于AVR中的内存访问速度要慢得多,因此我希望i并将j其保存在CPU寄存器中.
更新:我刚刚发现UTIL/delay.h和UTIL/delay_basic.h从AVR libc库.尽管大多数情况下使用这些功能可能更好,但这个问题仍然有效且有趣.
相关问题:
在使用avr-gcc进行编译时,我遇到了链接器错误,如下所示:
undefined reference to `__cxa_pure_virtual'
Run Code Online (Sandbox Code Playgroud)
我发现这个文件说明:
该
__cxa_pure_virtual函数是在调用纯虚函数时调用的错误处理程序.如果您正在编写具有纯虚函数的C++应用程序,则必须提供自己的
__cxa_pure_virtual错误处理函数.例如:
extern "C" void __cxa_pure_virtual() { while (1); }
根据建议定义此函数可以修复错误,但我想知道:
最近我一直在尝试调试一些低级工作,我找不到crt0.S编译器(avr-gcc),但我确实找到了crt1.S(和相应的.o文件一样).
这两个文件有什么区别?是crt1完全不同的东西还是什么?它们似乎都与'bootstrapping'(设置stack frame等)有关,但为什么区别呢?
我必须存储指令,我将通过串口接收命令.命令长度为8位.
我需要保持命令名称及其值之间的透明度.这样可以避免将串行接收的8位数转换为任何类型.
我想在我的代码中使用Enumerations来处理它们.只有枚举对应于此平台上的16位整数.
该平台是AVR ATmega169V微控制器,位于Butterfly演示板上.它是一个8位系统,对16位操作提供一些有限的支持.它不是一个快速的系统,有大约1KB的RAM.它没有像文件I/O或操作系统那样的任何奢侈品.
那么关于我应该用什么类型来存储8位命令的任何建议呢?
必须有比#defines的大量标题更好的东西.
我在AVR微控制器(ATMega328P)上运行的C程序中遇到了问题.我相信这是由于堆栈/堆冲突,但我希望能够证实这一点.
有没有什么办法可以通过堆栈和堆来可视化SRAM的使用?
注意:该程序使用avr-gcc编译并使用avr-libc.
更新:我遇到的实际问题是malloc实现失败(返回NULL).所有malloc这些都是在启动时发生的,所有这些都free发生在应用程序的最后(实际上从来没有,因为应用程序的主要部分处于无限循环中).所以我确定碎片不是问题.
我是C++编程的新手,但长期以来一直在使用C和Java.我正在尝试在我正在处理的某些串行协议中执行类似接口的层次结构,并不断收到错误:
Undefined reference to 'operator delete(void*)'
Run Code Online (Sandbox Code Playgroud)
(简化)代码如下:
PacketWriter.h:
class PacketWriter {
public:
virtual ~PacketWriter() {}
virtual uint8_t nextByte() = 0;
}
Run Code Online (Sandbox Code Playgroud)
StringWriter.h:
class StringWriter : public PacketWriter {
public:
StringWriter(const char* message);
virtual uint8_t nextByte();
}
Run Code Online (Sandbox Code Playgroud)
构造函数和nextByte函数在StringWriter.cpp中实现,但没有别的.我需要能够从指向PacketWriter的指针中删除StringWriter,如果我为StringWriter定义了一个析构函数,我是否已经得到了各种其他类似的错误.我敢肯定这是一个简单的问题,我作为一个新手忽略了.
另外,我正在为AVR芯片编写这个,在Windows上使用avr-g ++.
谢谢
我有与Dave Durbin相同的先决条件如何在C中实现动态调度表 ...除了我的目标是AVR.这是我的约束:
通常,该表应包含此类型的项目:
typedef struct jump_item {
uint16_t function_id;
void (*callback)(void);
} jump_item_t;
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用答案中建议的自定义部分,但是链接器会为未知符号抛出错误__start_myownsection(无论我使用哪个部分名称).当然,因为代码的目标是Linux/GCC.但我认为我很接近,因为avr-gcc实际上可以使用部分,只是因为我还没有弄清楚如何在用户定义的部分中堆叠符号并实际指向表的开头,以及确定表的长度在运行时.
怎么能艺术的回答适应AVR?
*编辑*
我可以看到至少两种方法来实现我想要的部分,或者使用"附加"到用户定义部分的函数或者结构表(如上所定义),这些部分将在用户定义的部分中堆叠.我目前的问题是:
-gc-sections,链接时未使用的函数被优化掉,我需要清理未使用的函数.我更喜欢第二个选项,类似于:
module1.c:
const jump_item_t module1_table[] __attribute__((__progmem__, section("tbl_dispatch"))) =
{
{ 0x02, func11 },
{ 0x03, func12 },
...
};
Run Code Online (Sandbox Code Playgroud)
module2.c:
const jump_item_t module2_table[] __attribute__((__progmem__, section("tbl_dispatch"))) =
{
{ 0x12, func21 },
{ 0x13, func22 },
...
};
Run Code Online (Sandbox Code Playgroud)
注意:指数不应被视为相关.
当所有模块都定义了这些变量时,它们会被优化掉,因为没有任何参考这些变量.他们需要在部分中叠加tbl_dispatch.所以我的问题可以追溯到:
如何告诉编译器删除它"认为"未被使用但仅使用特定C/C++模块的变量? …
在AVR Studio 5中创建项目时,它会创建一个包含以下内容的.c文件:
#include <avr/io.h>
int main(void)
{
while(1)
{
//TODO:: Please write your application code
}
}
Run Code Online (Sandbox Code Playgroud)
构建这个C程序工作得很好:
------ Rebuild All started: Project: AVRGCC2, Configuration: Debug AVR ------
Build started.
Project "AVRGCC2.avrgccproj" (ReBuild target(s)):
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreRebuild" in file "C:\Programme\Atmel\AVR Studio 5.0\Vs\AvrGCC.targets" from project "C:\Dokumente und Einstellungen\tom\Eigene Dateien\AVRStudio\test\AVRGCC2\AVRGCC2\AVRGCC2.avrgccproj" (target "ReBuild" depends on it):
Task "RunAvrGCC"
C:\Programme\Atmel\AVR Studio 5.0\AVR ToolChain\bin\make.exe clean all
rm -rf AVRGCC2.o AVRGCC2.d libAVRGCC2.a AVRGCC2.hex AVRGCC2.eep …Run Code Online (Sandbox Code Playgroud) avr-gcc ×10
avr ×5
embedded ×4
c ×3
c++ ×3
gcc ×2
arduino ×1
avr-studio4 ×1
bison ×1
compile-time ×1
crt ×1
debugging ×1
destructor ×1
flex-lexer ×1
linker ×1
memory ×1
optimization ×1
parsing ×1
pure-virtual ×1
unit-testing ×1
winavr ×1