我正在寻找一种算法来乘以两个比下面更好的整数.你有一个好主意吗?(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) 我在AVR微控制器(ATMega328P)上运行的C程序中遇到了问题.我相信这是由于堆栈/堆冲突,但我希望能够证实这一点.
有没有什么办法可以通过堆栈和堆来可视化SRAM的使用?
注意:该程序使用avr-gcc编译并使用avr-libc.
更新:我遇到的实际问题是malloc实现失败(返回NULL).所有malloc这些都是在启动时发生的,所有这些都free发生在应用程序的最后(实际上从来没有,因为应用程序的主要部分处于无限循环中).所以我确定碎片不是问题.
我有一个Arduino Uno和一个Linux环境.尽管Arduino IDE非常棒,但是如果出现问题,它并没有给我太多的帮助.它也变得极其缓慢并且有时会停止与芯片通信.
另一种方法是使用AVR-GCC/g ++和AVRDude工具链对我的Arduino Uno进行编码.但是,在使用简单的文本编辑器和命令行工具进行编程时,我非常希望能够访问与Arduino相同的功能(如Serial,digitalWrite等).
所以我试图找到头文件,其中定义了所有函数,即"Arduino.h" /usr/share/arduino/hardware/arduino/cores/arduino.
我用它来编译(使用makefile来做这个)
avr-gcc -mmcu=atmega328p -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=testarduino.o -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard -std=gnu99 -MMD -MP -MF .dep/testarduino.elf.d testarduino.o --output testarduino.elf -Wl,-Map=testarduino.map,--cref -lm
Run Code Online (Sandbox Code Playgroud)
编译这段代码:
#include "Arduino.h"
int main(void)
{
init();
pinMode(13,OUTPUT);
while(1){
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译时(似乎未定义引用'xxxxxxxxx')似乎没有识别出任何函数.那么需要包含哪些确切的头文件以确保我可以使用相同的功能?还是我错过了别的什么?
如果ISR正在运行,会发生另一个中断,会发生什么?第一个中断是否被中断?第二个中断会被忽略吗?或者在第一次ISR完成后会发射吗?
编辑 我忘了将它包含在问题中(但我将其包含在标签中),我想问一下这是如何在Atmel AVR上运行的.
我正在构建一个带有自己的CPU(AVR Mega8)的小型设备,它应该连接到PC.假设已完成物理连接和字节传递,那么在这些字节之上使用的最佳协议是什么?计算机需要能够在设备上设置某些电压,并回读某些其他电压.
目前,我正在考虑一个完全由主机驱动的同步协议:计算机发送请求,嵌入式CPU应答.还有其他想法吗?
我正在使用eclipse构建一个混合汇编代码和C源文件的avr-gcc项目.我想摆脱eclipse的自动makefile生成,因为我需要将一些进程自动化到makefile中以及其他原因.
我之前使用过cmake,我很满意它,所以我想尝试使用它来编译我的源文件.一切都按预期运行C源.问题是,最后我需要编译一些汇编文件(实际上是2)并将它们添加到目标.
我google了一下,但我找不到这样做的方法.有人知道如何做到这一点?
问题是在eclipse中我有-x assembler-with-cpp
添加到gcc参数列表中.我需要找到一种方法,有选择地将此参数添加到标准gcc参数列表中仅用于asm文件.我没有找到任何方式来做这件事.
先感谢您
解决方案:在CMakeLists.txt中设置每个文件以在同一列表中编译
enable_language(C ASM)
set ( SOURCES
foo.c
bar.c
foobar.s
)
add_executable(program ${SOURCES} )
Run Code Online (Sandbox Code Playgroud)
在工具链文件中,您应该放置:
SET(ASM_OPTIONS "-x assembler-with-cpp")
SET(CMAKE_ASM_FLAGS "${CFLAGS} ${ASM_OPTIONS}" )
Run Code Online (Sandbox Code Playgroud)
第二行就是在编译asm文件时需要传递额外的选项.我想传递所有CFLAGS和一些ASM_OPTIONS
是否有一种聪明/有效的算法来确定角度的斜边(即sqrt(a² + b²)),在没有硬件乘法的嵌入式处理器上使用定点数学运算?
是否有可能使Google 协议缓冲区在Arduino中运行?
我已经尝试了大约一个星期但无法使其工作,我想知道它是否可能.
因此,在嵌入式系统部门,我明年将参加大学,我们将了解到动态数据结构在嵌入式系统程序中是一件坏事.但讲义没有说明原因.
现在我正在开发一个中等规模的嵌入式系统LURC控制器,主要是利用AVR169MEGA的"Butterfly"演示板的外围设备.产生4个PWM信号来控制伺服和ESC.并提供9 seg液晶屏.
现在我想不出任何更好的存储指令的方法,因为它们是收到的小瓶USART序列,而不是队列.尤其是我需要等待收到未知数量的数据的东西:例如,要在LCD屏幕上显示的字符串.
那你为什么不在嵌入式系统的微控制器上使用动态数据结构呢?只是你在一个严重的内存限制环境中,并且必须确保你的mallocs成功吗?
自从我听说谷歌的新语言Go之后我就想用它来进行微控制器编程.特别是像Atmega系列这样的Atmel AVR微控制器.这个架构有Go端口吗?