问题标签 [avr-gcc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 是否可以指示 GNU ld 打印链接期间需要哪些 .o 文件?
一点背景知识:我正在尝试为嵌入式传感器系统构建 AVR 二进制文件,并且我正在运行接近我的大小限制。我使用了一些外部库来帮助我,但是当每个库编译成一个对象时它们相当大。我想把它们拉成更小的对象,这样只有我需要的功能才链接到我的程序中。通过拆分一个大型库,我已经设法将二进制大小减少了 2k。
知道在游戏的每个阶段使用了哪些对象会很有帮助,这样我就可以更有效地拆分它们。有没有办法ld
打印它正在链接的对象?
assembly - 在 avr tiny 中,当微控制器通电时,如何初始化存储在 sram 中的数据?
首先是一些背景。在 avr tiny 中,数据可以存储在寄存器、sram、eeprom 或程序空间中。寄存器和 sram 是易失性存储器,而 eeprom 和程序空间则不是。(即:未通电时数据保持不变。)
在 c 中编程时(使用 avr-gcc 库),典型的代码可能如下所示:
编译:
并从 .elf 中提取一个 intel .hex :
我们得到以下 test.hex :
以及以下反汇编:
那么我们想要放入 sram 的数据(0xef)是如何初始化的呢?
答案是通过 main 之前的例程。
应存储在 sram 中的数据位于程序空间中的地址 0x5a。它以下列方式放入 sram 中:
- x 寄存器的高字节和低字节设置为我们要在 sram 中放入数据的地址。(0x60)注意这个地址不在程序存储器中,而是在数据存储器中。
- z 寄存器相同,但数据在程序空间中的地址(0x5a)
- 存储在 z 寄存器中的地址处的程序存储器内容通过 lpm 操作码加载到寄存器 r0 中。请注意,z 寄存器值递增以指向(最终,这里没有)要加载到 sram 中的下一个数据。
- 然后将 r0 中的数据存储在 sram 中存储在 x 寄存器中的地址处。
- 重复直到所有应该在 sram 中的数据都被初始化。
这发生在对 main 的 rcall 之前。
有更好/更清晰的答案吗?
eclipse - Eclipse Arduino 制作:*** 错误 1
以下是我尝试构建项目时遇到的错误。我不确定它在说什么文件或目录。所有文件和目录都在项目目录中。
我按照http://arduino.cc/playground/Code/Eclipse中的说明设置了我的 IDE。
Arduino 核心文件是否应该在项目目录中并专门添加到 Arduino 核心库中?我给它的只是liArduinoCore.a
我的 Arduino IDE 生成的文件。这可能是问题吗?
错误信息
arduino - 无法链接 Arduino 项目以包含 Simulink 代码
在工作中,我最近接受了 MATLAB/Simulink 培训,包括可以为嵌入式应用程序生成 C 代码的 Simulink Coder。我想尝试一下,所以我买了一个 Arduino,并投入其中。我能够毫无问题地编写简单的草图,但在尝试集成 Simulink 生成的代码时遇到了障碍。
我最初使用的是 Arduino IDE,然后是带有 Arduino 插件的 Eclipse,最后是带有 embedXcode 模板的 Xcode。(我使用 Simulink 的工作机器是 PC,但我不允许安装“未经授权的软件”,所以我在家里的 Mac 上完成了剩下的工作。)所有三个都使用相同的 avr-gcc 编译器。
这三个都有相同的故障点:生成的函数调用上出现“未定义的引用”错误。我认为这是一个链接器问题,而不是基本语法或标头包含,因为 Eclipse 和 Xcode 代码完成工作正常,如果我以任何方式更改调用签名,错误就会改变。我可以对数据结构进行引用。
据我所知,默认的 makefile 设置为编译和链接文件夹中的任何文件。至少使用 Xcode 创建一个“mass_model2.o”文件。最后,如果我使用简单的函数调用手动编写单独的“myFunction.c”和“MyFunction.h”文件,它会按预期在设备上编译和运行。
setup()
无奈之下,我复制了生成的“.c”文件的全部内容,并将它们粘贴到我的和函数之后的主草图文件中loop()
,保持相同的“.h”引用,并从项目中删除了“.c”文件. 这实际上确实编译并运行了!但是,我不应该为了使用它而触摸生成的代码。
我需要做什么才能正确编译和链接?
Simulink 代码非常冗长,因此这里是关键部分:
mass_model2.h 摘录:
mass_model2.c 摘录:
其他引用的标头“rtwtypes.h”和“mass_model2_private.h”定义了生成代码使用的特定类型,例如int16_T
. 这些文件包含在项目中,我没有收到任何与它们相关的错误。
在我的草图文件中,setup()
函数调用mass_model2_initialize()
. loop()
读取我的输入(电位器),在 中设置值mass_model2_U.PotPos
,然后调用mass_model2_step()
. 然后它获取mass_model2_Y.ServoCmd
并将值写入伺服输出,最后有一个delay()
.
c++ - 将所有数组复制到没有向量的新数组 C++
我尝试执行上述操作,我将循环 idx,将一个新序列复制到 led_pattern 中,然后循环那个,回来,得到下一个。
我在这里找到了一种使用向量传递整个数组的方法; C++:复制数组
但是向量(我相信)不适用于我正在使用的编译器(avr-gcc/c++)
如何在 C++ 中实现这一点?我知道在python中下面会起作用,我可以将一个数组分配给另一个变量,然后它“克隆”它。
谢谢
avr - ATMega2560 上的 vsnprintf
我正在使用一个工具包在 ATMega2560 上做一些椭圆曲线密码学。尝试使用工具包中的打印功能时,我得到一个空字符串。我知道打印功能可以正常工作,因为 x86 版本可以毫无问题地打印变量。我对 ATMega 没有经验,并且希望在这件事上提供任何帮助。打印代码包含在下面。
打印大数字的代码(它本身称为 util_print)
实际打印大数字变量的代码:
编辑:我确实初始化了 UART,并且可以将 printf 语句输出到控制台。
c++ - 在 avr g++ 中禁用函数声明错误
我正在使用这个Makefile来编译我的 Arduino 草图,它具有以下 CPP 和 C 标志
当我编译一个 cpp 文件时,如果在声明函数之前使用了这些函数,我会收到一个致命错误。我浏览了avr g++ 选项,发现选项 -Wimplicit-function-declaration 启用了它。它也由 make 文件中使用的 -Wall 选项启用。
我想启用 -Wall 选项(因为它启用了许多其他警告)但仅禁用 -Wimplicit-function-declaration 选项。
我检查了文档,但无法弄清楚如何做到这一点。有人可以告诉我该怎么做吗?
c++ - 在 C++ 中跨多个文件使用多个命名空间中的类
我在使用avr-g++
(AVR 微控制器的 C++ 编译器)编译以下代码时遇到问题。
请注意,我在这个文件中定义了几个枚举和类,这些枚举和类在这个类中使用但没有被包含在内,以防止代码太长。
我收到错误
在我的项目中,我有几个代表modules
我正在处理的项目的特定文件。这些文件位于名为Modules
. 头文件LIBcpp.hpp
在上面的目录中。它包括Modules
子目录中的所有头文件。
类Pin
在命名空间内定义,命名空间IO
在命名空间内uC
。此类定义在名为 的头文件中IO.hpp
,该文件包含在LIBcpp.hpp
.
我试过的:
IO.hpp
在头文件中包含SPI.hpp
头文件——导致同样的错误
我不知道如何解决这个错误。如果需要更多代码或信息来解决这个问题,我会提供。
谢谢!
这是IO.hpp
,根据要求:
c++ - NULL 指针参数有多贵?
在用 C(++) (AVR-Gcc) 在嵌入式系统上实现菜单时,我最终得到了带有参数的 void 函数指针,并且通常会使用它们。
在某些情况下(实际上不少),该函数实际上不需要参数,所以我会这样做:
我知道我可以重载到不同的函数类型,但实际上我试图不这样做,因为我正在实例化多个对象并希望它们保持轻便。
使用 NULL 指针调用多个函数(当它们用于实际指针时)是否比实现更多函数原型更糟糕?