avr-gcc是Atmel AVR RISC处理器的一套可执行软件开发工具
avr-gcc 中 Y 寄存器与调用/堆栈帧的偏移量来自哪里?
在 avr-gcc 网站(https://gcc.gnu.org/wiki/avr-gcc#Frame_Layout)上,它说帧指针(Y 寄存器)偏移了一个字节,因此 Y+1 指向框架的底部。但是当我编译时...
单片机:Atmega2560 IDE:Microchip Studio v7.0.2594 工具链:WinAVR(也尝试过 Native) 我正在尝试通过 UART 与我的 MCU 通信。我已经通过 UART 编写了两个非常基本的函数来传输
avr-gcc ATmega4809 `.rodata` 部分出现问题
(这是这个问题的后续) 以下程序不起作用(在ATmega4809中) #包括 无效 f(const char str[]) { if (str[0] == 'a') // <-- here is the problem...
avr-ld 错误;找不到 crtatmega328p,找不到 -lm 等
我试图从 Makefile 链接两个目标文件,但链接器不断向我抛出错误。我在网上搜索时似乎找不到这个错误,所以我希望这里的任何人都可以提供帮助。 在我的 Makefile 中,我
我正在使用Atmel studio 7对Atmega芯片进行编程。我尝试在main.c文件的第一行定义F_CPU。此 F_CPU 定义在其他文件中使用。然而,当我编译程序时...
带有参数包的模板使用avr-gcc编译,但不使用Arduino IDE
我正在尝试为 Arduino 项目编写一个通用的打印模板。这样做时,我遇到了一个我不理解的编译器错误,所以我做了一个最小的可重现示例。 模板 我正在尝试为 Arduino 项目的 Print 编写通用模板。这样做时,我遇到了一个我不理解的编译器错误,所以我做了一个最小的可重现示例。 template <typename T, typename... T2> void print_all(Print* const (&ps)[2], T v1, T2... v2) { ps[0]->print(v1); ps[0]->flush(); ps[1]->print(v1); ps[1]->flush(); print_all(ps, v2...); } void print_all(Print* const (&ps)[2]) { return; } void setup() { print_all({&Serial1, &Serial2}, 1.0, "abc", 5ul); } void loop() { } 我得到的错误是error: expected ')' before ';' token,没有行号信息。如果我在文件开头插入空行,编译器错误将更改为 error: expected ')' before ';' token 1 | | ^ | ) 我用 avr-gcc 版本 7.3.0(官方 arduino avr 板)和 14.1.0(使用 arch linux arduino avr 板)尝试过此操作,但无论哪种方式都得到相同的错误。 我试验了一段时间,最终将代码放在Compiler Explorer上,使用avr-gcc而不是Arduino IDE进行编译。我必须提供一些存根才能编译所有内容,但它似乎按我的预期工作。那么为什么我的代码可以在编译器资源管理器上运行,但不能在 Arduino IDE 中运行? 带有支持方法存根的代码 class Print{ public: virtual void print(unsigned long i) { } virtual void print(double i) { } virtual void print(const char* i) { } virtual void flush() { } }; class Serial: public Print {}; Serial serial1 = Serial{}; Serial serial2 = Serial{}; template <typename T, typename... T2> void print_all(Print* const (&ps)[2], T v1, T2... v2) { ps[0]->print(v1); ps[0]->flush(); ps[1]->print(v1); ps[1]->flush(); print_all(ps, v2...); } void print_all(Print* const (&ps)[2]) { return; } int main() { Print* const ps[] = {&serial1, &serial2}; print_all(ps, 1.0, "abc", 5ul); } 来自文档: 首先,Arduino 开发软件会执行一些小的预处理,将您的草图转换为 C++ 程序 所以你的 Arduino 代码不是真正的 C++ 程序。它是 Arduino 预处理器的输入,输出 C++ 程序。 预处理器做什么?除此之外: 为 .ino/.pde 文件中尚未具有原型的所有函数定义生成原型。在极少数情况下,某些功能的原型生成可能会失败。要解决这个问题,您可以为这些函数提供您自己的原型 好吧,我想恭喜你了?您偶然发现了这些“罕见”案例之一。不幸的是,提供单独的模板没有帮助。但是,还有另一种解决方法:将模板标题放在一行上。是的,你没有看错。 // this works template <typename T, typename... T2> void print_all(Print* const (&ps)[2], T v1, T2... v2) { // this doesn't template <typename T, typename... T2> void print_all(Print* const (&ps)[2], T v1, T2... v2) {
可以在Android中使用包含Arduino1.0.5的AVR-GCC编译器吗? 我正在尝试在 Android 上运行 Arduino 1.0.5 中包含的 AVR-GCC,但这不起作用!我使用适用于 Linux 的 Arduino 1.0.5,
使用 atmega328 的 avr-gcc 上的链接时间优化 (LTO) 问题
我正在开发一个使用 ATmega328 并使用 avr-gcc/g++ 的项目。我正在尝试启用链接时间优化 (LTO),但在链接过程中遇到问题。 这是一个简化的示例: • 斯塔...
编译器在 Eclipse AVR 插件中截断 ATMEGA328PB 的中断向量
我通常会使用 Eclipse avr-gcc 插件和(zaks 的 avr-gcc 编译器 https://blog.zakkemble.net/avr-gcc-builds)来开发 AVR MCU 的固件。 MCU ATMEGA328PB 有额外的定时器 (3,4)、S...
我正在为ATtiny13编程,我必须做很多饱和的添加。 试图优化它们,似乎 avr-gcc 根本不知道如何优化任何东西。所有这些都试过了...
如何使用 Ada 的 Alire 包管理器安装 AVR 的 ZFP(零占用空间)RTS(运行时系统)?
如何使用 Ada 的 Alire 包管理器安装 AVR 的 ZFP(零占用空间)RTS(运行时系统)? 我认为正确的是,我的项目文件包含: 项目 Avr 是 对于运行时(“阿达&
在使用 avr-gcc 编译时,我遇到了如下链接器错误: 对“__cxa_pure_virtual”的未定义引用 我发现这份文件指出: __cxa_pure_virtual 的乐趣...
__attribute__((io)), __attribute__((address)) 似乎没有任何效果
我正在尝试使用AVR风格的gcc专门提供的变量属性(https://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html#AVR-Variable-Attributes)。 说明书上说...
我正在尝试为 ATmega328P 编写一些内联汇编代码 我发现我的输出变量的变化与我预期的不同。所以我将原始代码简化为: uint8_t a = 0; __asm__ ( “……
`asm("" : "+r" (myVar));` 在 AVR-GCC 中是什么意思?
我在别人的代码中发现了以下几行: uint16_t someConstantFactorVariable = ...; asm("" : "+r" (someConstantFactorVariable)); someConstantFactorVariable 经常出现在...
Atmega8 - 使用一个 Makefile 编译和链接 C 和汇编文件
我正在摆弄 Atmega8 和 Assembly。 所以我想到了如果有一个 Makefile 就好了,它可以查看文件夹,抓取每个 *.S、*.c 和 *.cpp 文件、链接和 com...
如何访问“最官方”的存储库以获取特定于架构的 GCC 运行时源文件和测试?
在这里和那里我找到了 mulqi3.S 和 divmodhi4.S 之类的东西。 gnu.org 上是否有关于如何浏览此类架构特定源代码的当前官方修订版的参考?我什么...
我正在为 Atmel 微控制器编写代码并使用 ATMEL Studio。 您可以从此处检查工具链和工作室版本。 *\Atmel\Studio .0 oolchain vr8 vr8-gnu-toolchain\lib\gcc vr ...
为什么具有虚拟成员的类的“新放置”仅在缓冲区位于本地堆栈上时才起作用?
我有一些 C++ 代码,它使用 Placement New 运算符在现有缓冲区中创建具有虚拟成员的类的实例。当缓冲区位于...的本地堆栈上时,它会按预期工作
在程序中,我有很多不同长度字符串的数组,每个数组都被声明为指向这些字符串的指针数组,例如: static const char * num_tab[] = {"第一个", "