首页 > 解决方案 > 如何将新版本的 gcc 中可用的架构添加到旧版本的 gcc?

问题描述

我想将 Atmega1281 架构添加到我正在使用的当前版本的 gcc 中,即 v3.3。Atmega1281 在 v3.3 中不受支持,它的支持在 v4.2.1 中添加。

我无法将 gcc 升级到 4.2.1,所以我需要将支持添加到我现有的编译器中。

有没有办法做到这一点?

标签: gcccross-compilingavratmegaavr-gcc

解决方案


您不需要更新 GCC(我假设您实际上是在使用 AVR-GCC 来生成 AVR 特定的机器代码......)。所有 AVR 芯片都使用相同的 AVR 内核和指令集。从一个芯片到另一个芯片的唯一变化是内存大小、寄存器地址和外围设备的可用性。

如果您使用这些核心库,您可能需要更新AVRlibc,并且您需要为像avrdude这样的编程实用程序添加设备配置。

您必须更新定义寄存器位置的核心标头,除非您定义自己的指向原始内存地址的指针(如老板)。这可以在Atmel Packs中找到,特别是对 Atmega 设备的支持。


当您在项目中包含 io.h 时,它会引入特定于设备的定义,其中包含指向内存的良好定义的指针,以访问外设配置和数据寄存器。这仅在您将使用中的设备作为编译命令中的特殊定义传递时才有效。如果您使用的是标准 Makefile 模板,则设备是您编辑的内容之一,它会处理这些命令。同样,像 Atmel Studio 这样的 IDE 会询问您正在使用什么设备并为您生成 Makefile。


但不要从我这里拿走它,这是来自AVR-GCC wiki标题为Supporting "unsupported" Devices部分的相关信息。

当您将代码输入编译器并针对特定设备进行编译时,编译器将只关心相应的内核;它不会关心确切的设备。对于编译器来说,设备有多少个 I/O 引脚、它在什么电压下工作、存在多少 RAM、芯片上有多少个定时器或 UART 或它采用什么封装都无关紧要。编译器对 -mmcu=device 所做的唯一事情是内置定义一个特定的宏并以特定的方式调用链接器,即编译器驱动程序的行为有点不同,但是像编译器和汇编器这样的子工具会生成完全相同的代码。

因此,您可以通过手动设置这些选项来支持您的设备。

因此,如果您由于某种原因无法更新 AVR-GCC,您仍然可以通过手动告诉链接器在哪里查找内容并从 io.h 树中指定正确的包含来为您的设备进行编译。

wiki 还提供了有关如何执行此操作的更多说明。


推荐阅读