我希望能够对我的Arduino代码进行单元测试.理想情况下,我可以运行任何测试而无需将代码上传到Arduino.哪些工具或库可以帮助我解决这个问题?
正在开发的Arduino仿真器可能很有用,但它似乎还没有准备好使用.
来自Atmel的AVR Studio包含一个可能有用的芯片模拟器,但我看不出如何将它与Arduino IDE结合使用.
C99标准引入了以下数据类型.可以在此处找到AVR stdint库的文档.
uint8_t 意味着它是一个8位无符号类型.uint_fast8_t 意味着它是最快的无符号整数,至少有8位.uint_least8_t 意味着它是一个至少8位的无符号整数.我理解uint8_t和是什么uint_fast8_t(我不知道它是如何在寄存器级别实现的).
你可以解释一下"它unsigned int至少有8位" 是什么意思吗?
2.How uint_fast8_t和uint_least8_t相比有助于提高效率/代码空间uint8_t?
是否可以将#defined 整数符号的值逐字插入到作为GCC(AVR Studio)中汇编部分一部分的字符串文字中?
我希望在下面的asm()块内的字符串文字中将"LEDS"替换为48.
#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS; //I'm using the value directly too
void DrawFrame()
{
asm(
"ldi R27, 0x00 \n\t"
"ldi R26, 0x00 \n\t"
"ldi R18, LEDS \n\t" //<-- substitution needed here
...
}
Run Code Online (Sandbox Code Playgroud)
但我希望编译器/汇编程序(在预处理器完成它的工作之后)看到这个......
#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS; //I'm using the value directly too
void DrawFrame()
{
asm( …Run Code Online (Sandbox Code Playgroud) 有人可以解释一下Arduino引导加载程序的工作原理吗?我不是在寻找一个高级答案,我已经阅读了代码,我得到了它的要点.
在Arduino IDE和引导加载程序代码之间发生了许多协议交互,最终产生了许多内联汇编指令,这些指令通过串行接口传输程序来自动编程闪存.
我不清楚的是第270行:
void (*app_start)(void) = 0x0000;
Run Code Online (Sandbox Code Playgroud)
...我认为函数指针的声明和初始化为NULL.随后在引导加载程序要委托执行用户加载代码的位置调用app_start.
当然,某种程度上app_start需要在某些时候获得非NULL值,以便将所有这些组合在一起.我在引导加载程序代码中没有看到它......它是否被引导加载程序加载的程序神奇地链接了?我认为引导加载程序的主要部分是芯片复位后进入软件的入口点.
包含70个左右的程序集必须是秘密的解码器环,告诉主程序app_start到底在哪里?或者也许是Arduino IDE利用了一些隐含的知识?我所知道的是,如果某人没有将app_start更改为指向0以外的其他位置,那么引导加载程序代码将永远自行旋转......那么诀窍是什么?
编辑
我有兴趣尝试将引导加载程序移植到没有用于引导加载程序代码的单独内存空间的Tiny AVR.由于我很明显引导加载程序代码依赖于某些保险丝设置和芯片支持,我想我真正感兴趣的是将引导加载程序移植到没有这些保险丝和硬件的芯片需要做些什么.支持(但仍具有自编程能力)?
我必须存储指令,我将通过串口接收命令.命令长度为8位.
我需要保持命令名称及其值之间的透明度.这样可以避免将串行接收的8位数转换为任何类型.
我想在我的代码中使用Enumerations来处理它们.只有枚举对应于此平台上的16位整数.
该平台是AVR ATmega169V微控制器,位于Butterfly演示板上.它是一个8位系统,对16位操作提供一些有限的支持.它不是一个快速的系统,有大约1KB的RAM.它没有像文件I/O或操作系统那样的任何奢侈品.
那么关于我应该用什么类型来存储8位命令的任何建议呢?
必须有比#defines的大量标题更好的东西.
当我插拔电源时系统看到插入的东西:
bluehat@Matapan:/dev$ tail -f /var/log/syslog
Mar 23 15:36:35 Matapan kernel: [156082.112874] usb 7-1: new full speed USB device using uhci_hcd and address 6
Mar 23 15:47:19 Matapan kernel: [156726.248081] usb 7-1: USB disconnect, address 6
Mar 23 15:47:29 Matapan kernel: [156736.200148] usb 6-1: new full speed USB device using uhci_hcd and address 3
Run Code Online (Sandbox Code Playgroud)
AVRISP MKII应该依赖于cdc-acm:
bluehat@Matapan:/dev$ modinfo cdc-acm -V
module-init-tools version 3.12
Run Code Online (Sandbox Code Playgroud)
所以它应该能够看到它很好,但我无法写它.
avrdude -p m1280 -c avrispmkII -P usb -U test.hex
Run Code Online (Sandbox Code Playgroud)
返回
avrdude: usb_open(): cannot read serial number "error …Run Code Online (Sandbox Code Playgroud) 我正在使用8位AVR芯片.64位double没有数据类型(double只映射到32位float).但是,我将通过Serial接收64位双精度数,并且需要在Serial上输出64位双精度数.
如何在不进行转换的情况下将64位双精度转换为32位浮点数并再次返回?32位和64位的格式都遵循IEEE 754.当然,我假设转换为32位浮点时精度会下降.
为了从64位转换为32位浮点数,我正在尝试这样做:
// Script originally from http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1281990303
float convert(uint8_t *in) {
union {
float real;
uint8_t base[4];
} u;
uint16_t expd = ((in[7] & 127) << 4) + ((in[6] & 240) >> 4);
uint16_t expf = expd ? (expd - 1024) + 128 : 0;
u.base[3] = (in[7] & 128) + (expf >> 1);
u.base[2] = ((expf & 1) << 7) + ((in[6] & 15) << 3) + ((in[5] & 0xe0) >> 5);
u.base[1] = ((in[5] & …Run Code Online (Sandbox Code Playgroud) 我正在寻找有关嵌入式编程的知识(主要是在C语言中,但我希望也能在我的ASM上学习)并且我想知道最好的平台是什么.我有一些使用Atmel AVR和使用stk500编程的经验,发现相对容易.我特别喜欢AVR Studio和调试器,它可以让你查看寄存器的状态.
但是,如果我要花时间学习,我宁愿学习一些在工业中普遍存在的东西.我在想ARM,除非有人有更好的建议.
我也会寻找一些参考资料,我在ARM网站上找到了书籍部分,如果一本书技术上比另一本书更好,我会很感激.
我要寻找的最后一件事是原型/编程板,如STK500,它有一些按钮等等.
谢谢=]
我想编写一个微控制器(AVR)来通过USB控制一些LED.这只是对如何构建和编程USB设备感兴趣.有些AVR微控制器支持USB协议,或者我自己可以在另一个微控制器中实现USB协议,但我想知道在计算机上使用什么来编写自己的驱动程序.
我的系统编程水平:总菜鸟(因此问题)
那么,为了更好地了解USB技术以及如何编写自己的驱动程序以及其他内容,您的人们会建议哪些文献?
PS:我知道:
C(可能需要它)
Java(这里可能不需要它)
Python(希望可以在这里使用)
汇编程序(希望在这里XD不需要它).
...
PPS:不同操作系统的驱动程序开发有所不同.我使用Linux和Windows,因此欢迎任何与这些系统中的一个或两个相关的材料.
我正在寻找一种算法来乘以两个比下面更好的整数.你有一个好主意吗?(MCU - AT Tiny 84/85或类似 - 此代码运行的地方没有mul/div运算符)
uint16_t umul16_(uint16_t a, uint16_t b)
{
uint16_t res=0;
while (b) {
if ( (b & 1) )
res+=a;
b>>=1;
a+=a;
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
当使用avr-gcc编译器为AT Tiny 85/84编译时,该算法几乎与avr-gcc生成的算法__mulhi3相同.
avr-gcc算法:
00000106 <__mulhi3>:
106: 00 24 eor r0, r0
108: 55 27 eor r21, r21
10a: 04 c0 rjmp .+8 ; 0x114 <__mulhi3+0xe>
10c: 08 0e add r0, r24
10e: 59 1f adc r21, r25
110: 88 0f add r24, r24
112: 99 1f adc r25, …Run Code Online (Sandbox Code Playgroud)