我想生成面向 AVR 架构的代码的汇编文件,我使用的是带有以下参数的 gcc 版本 4.7.2:
g++ -O3 -Wall -S -Wp,-mmcu=atmega8 -o "src\Compression.o" "..\src\Compression.cpp"
但我收到以下错误:
cc1plus.exe:错误:无法识别的命令行选项“-mmcu=atmega8”
但我从 gcc 网站得到了命令选项:http : //gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/AVR-Options.html#AVR-Options
应该有我遗漏的东西,你能帮我解决这个问题吗!
我正在为 AVR 平台开发一个定时循环,在其中对 ISR 内的单个字节进行倒计时。由于此任务是我的程序的主要功能,因此我想永久保留一个处理器寄存器,以便 ISR 在其通常的代码路径递减、与零比较和 时不必遇到内存障碍reti。
avr-libc 文档展示了如何将变量绑定到寄存器,我的工作没有出现问题。然而,由于这个变量是在主程序(用于启动计时器倒计时)和 ISR(用于实际计数和发出完成信号)之间共享的,因此还应该确保volatile编译器在优化它时不会做任何太聪明的事情。
在这种情况下(在整个整体构建中保留寄存器),这种组合volatile register在语义上对我来说是有意义的,因为“将此变量永久存储在 register 中rX,但不要优化检查,因为寄存器可能会在外部修改”。然而,GCC 不喜欢这样,并发出警告,表示它可能会继续优化变量访问。
GCC 中这种组合的错误历史表明编译器团队根本不愿意考虑我所描述的场景类型,并且认为提供它是没有意义的。我是否遗漏了该volatile register方法本身是一个坏主意的一些根本原因,或者这是一种具有语义意义但编译器团队对处理不感兴趣的情况?
我想交叉编译clang以用作avr的编译器(更详细的arduino)。我觉得我应该这样做:
还有什么?它是否支持 --target=avr 或者我如何编译?这是否有意义,因为它将像 IDE 自动完成工具一样使用 clang-c API 来解析源代码?
更新:使用 --host 和 --target 参数进行配置:
export CROSS_COMPILE=arm-linux-androideabi
export CC=${CROSS_COMPILE}-gcc
export CXX=${CROSS_COMPILE}-g++
export NDK=/softdev/android-ndk-r8e
export ANDROID_NDK_ROOT=/softdev/android-ndk-r8e
export SYSROOT=$NDK/platforms/android-8/arch-arm
export PATH=/softdev/arm-toolchain/bin:$PATH:/softdev/android-ndk-r8e/platforms/android-8/arch-arm
./configure --host=arm-linux-androideabi --target=arm-linux-androideabi --prefix=/softdev/arduinodroid_clang/arm
make
Run Code Online (Sandbox Code Playgroud)
...导致错误(Makefile存在):
llvm asmirnov$ sudo make
llvm[0]: Constructing LLVMBuild project information.
configure: error: Already configured in /Users/asmirnov/Documents/dev/src/llvm
make[1]: *** No targets specified and no makefile found. Stop.
make: *** [cross-compile-build-tools] Error 1
Run Code Online (Sandbox Code Playgroud) 我在 Atmel Studio 6 中使用了 ATMega32 uc。我有一些包含new操作符的代码。当我尝试使用它时,它说它没有定义,我不知道为什么。
我在谷歌上搜索了一些东西,但我还没有找到任何相关的东西。我能找到的只是定义new和delete操作符的代码片段,但我真的不想这样工作。也nullptr不见了。
还有其他解决方案吗?
我想使用 ATMEGA16 通过 UART 接收字符串(指向字符的指针)。我在套件上烧录了这段代码,然后我使用超级终端(realterm)并进行了输入字符串(“on”)的测试,如果收到它,则 portc(LEDS)将设置为 1,但它不起作用.. 。 任何人!?:D
功能实现
#include <avr/io.h>
#define F_CPU 8000000UL
unsigned char *x;
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
void uartinit()
{
UCSRB |= (1 << RXEN) | (1 << TXEN);
// Turn on the transmission and reception circuitry
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
// Use 8-bit character sizes
UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value.. …Run Code Online (Sandbox Code Playgroud) 我目前正在使用 Atmel 微控制器开发 USB HID 键盘。一切正常,但我通常在不同的机器上使用不同的键盘布局。现在我开始想知道是否有可能告诉主机使用哪种键盘布局,即 EN-US,以便键码总是映射到每台机器上的正确字符上。有任何想法吗?
如果需要具体说明:我在询问ATmega328P芯片。模拟引脚PortC在该芯片上。
我知道digitalWrite可以使用out和digitalRead使用来完成in。
但是我该怎么办analogRead?? 请解释。我是新来的。
额外:如果您也显示analogWrite(在PWM的意义上),这将很有帮助。
我使用的是带有 AVR Atmega2560 芯片的 Arduino Mega 2560。我正在使用 Windows 上的 Arduino IDE 1.8.4 对其进行编程,该 IDE 附带 avr-objdump 2.26 和 avr-g++ 4.9.2。
我的程序或多或少可以工作,但是当尝试检查生成的程序集时,objdump 似乎没有生成正确的输出。
执行中
avr-objdump -D -S -m avr:6 "arduino_build_948544\sketch\mysketch.ino.cpp.o" > mysketch.asm
Run Code Online (Sandbox Code Playgroud)
似乎成功了,但是对于像这样简单的函数
void sleep_example() {
SMCR = 1;
__asm__("sleep");
}
Run Code Online (Sandbox Code Playgroud)
拆卸看起来基本上是随机的:
Disassembly of section .gnu.lto__Z13sleep_examplev.af7e500a:
00000000 <.gnu.lto__Z13sleep_examplev.af7e500a>:
0: 78 9c mul r7, r8
2: 63 66 ori r22, 0x63 ; 99
4: c0 04 cpc r12, r0
6: 52 40 sbci r21, 0x02 ; 2
8: fc 18 sub r15, …Run Code Online (Sandbox Code Playgroud) 在我的 ATtiny84a AVR 汇编程序中,我最终在寄存器中得到了一个介于 0 和 7 之间的位数,例如 r16。现在我需要创建一个带有该位号集的掩码。为了使它更复杂,操作的时序必须相同,无论设置了什么位。
例如,如果 r16 = 5,结果掩码将为 0x20(第 5 位设置)。
到目前为止,我已经通过LSL将位移到位置并使用 r16(位号)作为循环计数器,然后为了保持准确的时序而不管位号,做一个NOP 8-r16 次的虚拟循环。
汇编指令SBR从掩码设置寄存器中的位,因此它不能被使用。汇编指令SBI根据位号在 I/O 寄存器中设置一个位,但它是一个常量,而不是寄存器(我可以使用 I/O 寄存器作为临时寄存器)。
然后使用掩码来清除内存位置中的位,因此如果有另一种解决方案可以从寄存器中的位号执行此操作,那么也可以。
我有另一种解决方案要尝试(基于移位和进位),但我希望有人有一个比循环和移位更优雅的解决方案。
我想知道为什么 Atmel RISC 没有针对状态寄存器的“全部清除”指令,而只有像 CLN 和 CLS 这样的个别标志清除指导员。强迫程序员单独明确地清除每一位并避免粗心大意是一件安全的事情吗?
[编辑] 询问是因为我正在检查各种指令对某个类的状态寄存器的影响,并且当我意识到这样的指令不存在时,我正在寻找一条完全重置 SREG 的指令