MICROCHIP-标志

AVR MCU 的 MICROCHIP XC8 C 编译器版本 2.45 发行说明

MICROCHIP-XC8-C-AVR-MCU-PRO 编译器版本 2-45-发行说明

产品信息

MPLAB XC8 C 编译器是一款用于针对 Microchip AVR 器件的软件工具。 它旨在编译C代码并生成可执行文件 files 用于这些设备。 本用户手册中提到的编译器版本为 2.45,正式构建日期为 18 年 2023 月 2.41 日。之前的版本为 8,构建于 2023 年 8 月 8 日。编译器附带功能安全手册,其中提供了附加信息以及将 MPLAB XC 编译器与功能安全应用结合使用时的指南。 当您购买功能安全许可证时,本手册包含在文档包中。 MPLAB XCXNUMX C 编译器支持发布时所有可用的 XNUMX 位 AVR MCU 器件。 可以参考avr_chipinfo.html file 在编译器的 doc 目录中获取所有支持的设备及其配置位设置的列表。 MPLAB XC8 编译器有不同版本可用。 与免费版本相比,许可(PRO)版本提供了更高级别的优化。 要将编译器激活为许可产品,您需要购买激活密钥。 然而,非授权版本无需许可证即可无限期使用。 对于功能安全应用,可以使用 MPLAB XC8 功能安全编译器。 它需要从 Microchip 购买的功能安全许可证才能激活。 一旦激活,所有优化级别和编译器功能都可以使用。 MPLAB XC 功能安全编译器还支持网络服务器许可证。 有关安装、激活、许可证类型和迁移问题的详细信息,请参见安装和许可 MPLAB XC C 编译器 (DS50002059) 文档。

产品使用说明

  1. 在运行 MPLAB XC8 C 编译器软件之前,请阅读用户手册,了解针对 Microchip AVR 器件的重要信息和说明。
  2. 如果您使用的是 8 位 PIC 器件的编译器,请参阅 PIC 文档的 MPLAB XC8 C 编译器发行说明。
  3. 确保您的操作系统满足运行编译器的系统要求。 macOS 的二进制文件已经过代码签名和公证。 MPLAB XC 网络许可服务器适用于 Microsoft Windows 10 及更高版本、Ubuntu 18.04 及更高版本以及 macOS 10.15 及更高版本。 请注意,MPLAB XC 网络许可服务器未在这些操作系统上进行测试。
  4. MPLAB XC 网络许可证服务器可以使用网络许可证虚拟机许可证 (SW006021-VM) 在支持的操作系统的虚拟机上运行。 从版本 32 开始,所有 3.00 位版本的 MPLAB XC 网络服务器均已停产。
  5. 要将 MPLAB XC8 C 编译器激活为许可 (PRO) 产品,请购买激活密钥。 与免费版本相比,这将提供更高级别的优化。 然而,非授权编译器可以在没有许可证的情况下无限期地运行。
  6. 如果您将 MPLAB XC8 功能安全编译器用于功能安全应用,则必须使用从 Microchip 购买的功能安全许可证来激活它。 如果没有此许可证,编译器将无法运行。 激活后,您可以选择任何优化级别并使用所有编译器功能。 此版本的 MPLAB XC 功能安全编译器支持网络服务器许可证。
  7. 有关 MPLAB XC8 C 编译器的安装、激活和许可的详细说明,请参见安装和许可 MPLAB XC C 编译器 (DS50002059) 文档。
  8. 如果您在评估许可证下运行编译器,则在评估期结束后 14 天内,您将在编译过程中收到警告。 如果您在 HPA 订阅结束后 14 天内,也会发出相同的警告。

超过view

介绍
此版本的 Microchip MPLAB® XC8 C 编译器包含多项新功能、错误修复以及对新器件的支持。

建造日期
该编译器版本的官方构建日期是 18 年 2023 月 XNUMX 日。

以前的版本
之前的 MPLAB XC8 C 编译器版本为 2.41,构建于 8 年 2023 月 XNUMX 日。

功能安全手册
当您购买功能安全许可证时,文档包中提供了 MPLAB XC 编译器的功能安全手册。

组件许可证和版本
用于 AVR MCU 的 MPLAB XC8 C 编译器工具是根据 GNU 通用公共许可证 (GPL) 编写和分发的,这意味着其源代码是免费分发并向公众开放的。 GNU GPL 下的工具源代码可以从 Microchip 单独下载 web地点。 您可以阅读 GNU GPL 中的 file named 位于安装目录的子目录中。 可以在此处找到对 GPL 基础原则的一般性讨论。 为标头提供的支持代码 files、链接器脚本和运行时库是专有代码,不在 GPL 范围内。 此编译器是 GCC 5.4.0 版、binutils 2.26 版的实现,并使用 avr-libc 2.0.0 版。

系统要求
MPLAB XC8 C 编译器及其使用的许可软件适用于各种操作系统,包括以下 64 位版本: Microsoft® Windows® 10 专业版、Ubuntu® 18.04、macOS® 13.2 (Ventura) 和Fedora 34。Windows 的二进制文件已经过代码签名。 macOS 的二进制文件已经过代码签名和公证。 MPLAB XC 网络许可服务器适用于多种 64 位操作系统,包括 Microsoft Windows 10 及更高版本; Ubuntu 18.04 及以上版本; 或 macOS 10.15 及更高版本。 服务器还可以在各种其他操作系统上运行,包括 Windows Server、Linux 发行版(例如 Oracle® Enterprise Linux® 和 Red Hat® Enterprise Linux)以及受支持操作系统的旧版本。 但是,MPLAB XC 网络许可服务器未在这些操作系统上进行测试。 MPLAB XC 网络许可证服务器可以使用网络许可证虚拟机许可证 (SW006021-VM) 在支持的操作系统的虚拟机上运行。 从版本 32 开始,所有 3.00 位版本的 MPLAB XC 网络服务器均已停产。

支持的设备
该编译器支持发布时所有可用的 8 位 AVR MCU 设备。 有关所有受支持设备的列表,请参阅 avr_chipinfo.html(在编译器的 doc 目录中)。 这些文件还列出了每个设备的配置位设置。

版本和许可证升级
MPLAB XC8 编译器可以作为许可(PRO)或非许可(免费)产品激活。 您需要购买激活密钥来许可您的编译器。 与免费产品相比,许可证允许更高级别的优化。 未经许可的编译器可以在没有许可证的情况下无限期地运行。 MPLAB XC8 功能安全编译器必须使用从 Microchip 购买的功能安全许可证来激活。 如果没有此许可证,编译器将无法运行。 激活后,您可以选择任何优化级别并使用所有编译器功能。 此版本的 MPLAB XC 功能安全编译器支持网络服务器许可证。 有关许可证类型和使用许可证安装编译器的信息,请参见《安装和许可 MPLAB XC C 编译器》(DS50002059) 文档。

安装和激活
另请参阅迁移问题和限制部分,了解有关此编译器附带的最新许可证管理器的重要信息。 如果使用 MPLAB IDE,请确保在安装此工具之前安装最新的 MPLAB X IDE 版本 5.0 或更高版本。 安装编译器之前退出 IDE。 运行 .run (Linux) 或 .app (macOS) 编译器安装程序应用程序,例如 XC8-1.00.11403-windows.exe,然后按照屏幕上的说明进行操作。 建议使用默认安装目录。 如果您使用的是 Linux,则必须使用终端并从 root 帐户安装编译器。 使用具有管理员权限的 macOS 帐户进行安装。 现在激活与安装分开进行。 有关更多信息,请参见文档 MPLAB® XC C 编译器的许可证管理器 (DS52059)。 如果您选择在评估许可证下运行编译器,那么当评估期结束后 14 天内,您将在编译过程中收到警告。 如果您在 HPA 订阅结束后 14 天内,也会发出相同的警告。 XC 网络许可证服务器是一个单独的安装程序,不包含在单用户编译器安装程序中。 XC License Manager 现在支持浮动网络许可证的漫游。 针对移动用户,此功能允许浮动许可证在短时间内脱离网络。 使用此功能,您可以断开网络连接并仍然使用 MPLAB XC 编译器。 有关此功能的更多信息,请参阅 XCLM 安装的 doc 文件夹。 MPLAB X IDE 包括一个许可证窗口(工具 > 许可证),用于直观地管理漫游。

解决安装问题
如果您在任何 Windows 操作系统下安装编译器时遇到困难,请尝试以下建议。

  • 以管理员身份运行安装。
  • 将安装程序应用程序的权限设置为“完全控制”。 (右键单击文件,选择属性,安全选项卡,选择用户,编辑。)
  • 将临时文件夹的权限设置为“完全控制”。

要确定临时文件夹的位置,请在运行命令中键入 %temp%(Windows 徽标键 + R)。 这将打开一个显示该目录的文件资源管理器对话框,并允许您确定该文件夹的路径。

编译器文档
单击 MPLAB X IDE 仪表板中的蓝色帮助按钮时,可以从浏览器中打开的 HTML 页面打开编译器的用户指南,如屏幕截图所示。MICROCHIP-XC8-C-AVR-MCU-2 编译器版本 45-1-发行说明

如果您正在为 8 位 AVR 目标构建,用于 AVR® MCU 的 MPLAB® XC8 C 编译器用户指南包含有关适用于该架构的编译器选项和功能的信息。

客户支持
您可以在XC8论坛中向该产品的其他用户提问。 Microchip 欢迎有关此编译器版本的错误报告、建议或意见。 请通过支持系统提出任何错误报告或功能请求。

文档更新

如需在线和最新版本的 MPLAB XC8 文档,请访问 Microchip 的在线技术文档 web地点。
此版本中新的或更新的 AVR 文档:

没有任何

  • AVR® GNU 工具链到 MPLAB® XC8 迁移指南介绍了如果您决定将基于 C 的项目从 AVR 8 位 GNU 工具链迁移到 Microchip MPLAB XC8 C 编译器,可能需要对源代码和构建选项进行的更改。
  • Microchip 统一标准库参考指南介绍了 Microchip 统一标准库定义的函数的行为和接口,以及库类型和宏的预期用途。 其中部分信息以前包含在 AVR® MCU 的 MPLAB® XC8 C 编译器用户指南中。 本编译器指南中仍然包含设备特定的库信息。
  • 如果您刚刚开始使用 8 位器件和 MPLAB XC8 C 编译器,MPLAB® XC8 用户指南
  • 嵌入式工程师指南 – AVR® MCU (DS50003108) 提供了有关在 MPLAB X IDE 中设置项目以及为第一个 MPLAB XC8 C 项目编写代码的信息。 本指南现已随编译器一起分发。
  • Hexmate 用户指南适用于将 Hexmate 作为独立应用程序运行的用户。

什么是新的

以下是编译器现在支持的新 AVR 目标功能。 副标题中的版本号表示支持以下功能的第一个编译器版本。

版本 2.45
通用许可证管理器(XC8-3175、XCLM-224)与编译器一起使用的 macOS 版本许可证管理器现已通用,为基于 Intel 和 M1 的计算机提供本机支持。 Linux 版本的许可证管理器现在至少需要 2.25 版的 glibc。 Mac 通用二进制文件(XC8-3168、XC8-2951)macOS 的编译器二进制文件现已通用,为基于 Intel 和 M1 的机器提供本机支持。 减小浮点库大小(XC8-3112、XC8-3071) 对浮点库函数进行了改进,包括 sinf()、pow()、sqrt()、expf()、log1fp() 和 nextafterf() ,这些例程的代码大小有所减少。 新设备支持 现在可支持以下 AVR 器件:AVR16EA28、AVR16EA32、AVR16EA48、AVR32EA28、AVR32EA32、AVR32EA48、AVR16EB14、AVR16EB20、AVR16EB28 和 AVR16EB32。

版本 2.41

  • Bootrow 支持 (XC8-3053) 编译器会将带有 .bootrow 前缀的任何节的内容放置在 HEX 文件中的地址 0x860000 处。 这些部分用于 BOOTROW 内存,该内存旨在存储只能由引导加载程序访问的密钥和其他安全信息。
  • 冗余返回消除 (XC8-3048) 当使用自定义链接器脚本时,编译器现在将消除具有尾部跳转的函数中的冗余 ret 指令。 这与之前执行的优化类似,但现在对所有孤立部分执行,即使使用自定义链接器脚本并且最佳分配方案未发挥作用也是如此。
  • 时间类型更改(XC8-2982、2932) C99 标准库类型 time_t 已从 long long 更改为 unsigned long 类型,这使得一些与时间相关的函数(例如 mktime())的代码大小得到改进。
  • 新 nop (XC8-2946, 2945) 宏 NOP() 已添加到。 该宏将 nop 无操作指令插入到输出中。
  • XCLM 更新 (XC8-2944) 与编译器一起使用的许可证管理器已更新,现在在检查编译器的许可证详细信息时响应更快。
  • Tramp线性调用 (XC8-2760) 当指令的相对形式通常超出其目标范围时,编译器现在可以用较短的相对调用来替换长形式调用指令。 在这种情况下,编译器将尝试用 rcall 指令替换为 jmp 调用指令,该指令将 'tramp在线'执行到所需的地址,例如amp乐:

版本 2.40

  • 新设备支持 现在支持以下 AVR 部件:AT90PWM3、AVR16DD14、AVR16DD20、AVR16DD28、AVR16DD32、AVR32DD14、AVR32DD20、AVR32DD28、AVR32DD32、AVR64EA28、AVR64EA32 和 AVR64EA48。
  • 改进的过程抽象 过程抽象 (PA) 优化工具已得到改进,以便可以概述包含函数调用指令 (call/rcall) 的代码。 仅当堆栈不用于向函数传递参数或从函数获取返回值时才会发生这种情况。 当调用具有可变参数列表的函数或调用参数多于为此目的指定的寄存器的函数时,将使用堆栈。 可以使用 –mno-pa-outline-calls 选项禁用此功能,或者可以使用 -mno-pa-on- 完全禁用目标文件和/或函数的过程抽象file -mno-pa-on-function,或通过选择性地使用 nopa 属性(__nopa 说明符)与函数。
  • 代码覆盖率宏 如果指定了有效的 -mcodecov 选项,编译器现在定义宏 __CODECOV。
  • 内存预留选项 xc8-cc 驱动程序现在在构建 AVR 目标时接受 -mreserve=space@start:end 选项。 该选项保留数据或程序内存空间中的指定内存范围,防止链接器在该区域填充代码或对象。
  • 更智能的智能 IO 对智能 IO 功能进行了多项改进,包括对 printf 核心代码的一般调整、将 %n 转换说明符视为独立变体、按需链接到 vararg pop 例程、在可能的情况下使用较短的数据类型进行处理IO 函数参数,以及在字段宽度和精度处理中分解通用代码。 这可以节省大量代码和数据,并提高 IO 的执行速度。

版本 2.39(功能安全发布)
网络服务器许可证 此版本的 MPLAB XC8 功能安全编译器支持网络服务器许可证。

版本 2.36
没有任何。

版本 2.35

  • 新设备支持 支持以下 AVR 部件:ATTINY3224、ATTINY3226、ATTINY3227、AVR64DD14、AVR64DD20、AVR64DD28 和 AVR64DD32。
  • 改进的上下文切换 新的 -mcall-isr-prologues 选项更改了中断函数在进入时保存寄存器的方式以及中断例程终止时恢复这些寄存器的方式。 它的工作方式与 -mcall-prologues 选项类似,但只影响中断函数 (ISR)。
  • 更多改进的上下文切换 新的 -mgas-isr-prologues 选项控制为小型中断服务例程生成的上下文切换代码。 启用后,此功能将使汇编器扫描 ISR 以查找寄存器使用情况,并仅在需要时保存这些使用过的寄存器。
  • 可配置的闪存映射 AVR DA 和 AVR DB 系列中的某些设备具有 SFR(例如 FLMAP),用于指定程序存储器的哪 32k 部分将映射到数据存储器。 新的 – mconst-data-in-config-mapped-progmem 选项可用于让链接器将所有符合条件的数据放置在一个 32k 节中,并自动初始化相关的 SFR 寄存器,以确保该数据映射到数据存储空间,在那里可以更有效地访问它。
  • Microchip 统一标准库 所有 MPLAB XC 编译器都将共享一个 Microchip 统一标准库,该库现已随本版本的 MPLAB XC8 提供。 AVR® MCU 的 MPLAB® XC8 C 编译器用户指南不再包含这些标准函数的文档。 现在可以在 Microchip 统一标准库参考指南中找到此信息。 请注意,以前由 avr-libc 定义的某些功能不再可用。 (请参阅库功能。)
  • 智能 IO 作为新统一库的一部分,printf 和 scanf 系列中的 IO 函数现在是根据这些函数在程序中的使用方式在每次构建时自定义生成的。 这可以大大减少程序使用的资源。
  • 智能 IO 辅助选项 在分析对智能 IO 函数(例如 printf() 或 scanf())的调用时,编译器无法始终从格式字符串确定或从参数推断调用所需的转换说明符。以前,编译器总是会执行以下操作:没有假设并确保功能齐全的 IO 函数链接到最终程序映像中。添加了新的 -msmart-io-format=fmt 选项,以便用户可以通知编译器智能 IO 使用的转换说明符其用法不明确的函数,防止链接过长的 IO 例程。(有关更多详细信息,请参阅 smart-io-format 选项。)
  • 放置自定义节 以前,当链接器脚本定义同名的输出节时,-Wl,–section-start 选项仅将指定节放置在请求的地址处。 如果情况并非如此,则该节被放置在链接器选择的地址处,并且该选项基本上被忽略。 现在,即使链接器脚本未定义该部分,所有自定义部分都将遵循该选项。 但请注意,对于标准节,例如 .text、.bss 或 .data ,最适合的分配器仍然可以完全控制它们的位置,并且该选项将不起作用。 使用 -Wl,-Tsection=addr 选项,如用户指南中所述。

版本 2.32

  • 堆栈指导 获得 PRO 编译器许可证后,编译器的堆栈指导功能可用于估计程序使用的任何堆栈的最大深度。 它构建并分析程序的调用图,确定每个函数的堆栈使用情况,并生成报告,从中可以推断出程序使用的堆栈深度。 此功能通过 -mchp-stack-usage 命令行选项启用。 执行后会打印堆栈使用情况的摘要。 映射文件中提供了详细的堆栈报告,可以通过通常的方式请求该报告。
  • 新设备支持 支持以下 AVR 部件:ATTINY427、ATTINY424、ATTINY426、ATTINY827、ATTINY824、ATTINY826、AVR32DB32、AVR64DB48、AVR64DB64、AVR64DB28、AVR32DB28、AVR64DB32 和 AVR32DB48。
  • 缩回设备支持 以下 AVR 部件不再提供支持:AVR16DA28、AVR16DA32 和 AVR16DA48。

版本 2.31
没有任何。

版本 2.30

  • 防止数据初始化的新选项 新的 -mno-data-init 驱动程序选项可防止数据初始化和 bss 部分的清除。 它的工作原理是抑制汇编文件中 do_clear_bss 符号的输出,这反过来又会阻止链接器包含这些例程。
  • 增强优化 已进行多项优化改进,包括删除冗余返回指令、删除 skip-if-bit-is 指令后的一些跳转,以及改进过程抽象和迭代此过程的能力。
    现在可以使用其他选项来控制其中一些优化,特别是 -fsection-anchors,它允许相对于一个符号执行静态对象的访问; -mpa- iterations=n ,允许将程序抽象迭代的数量从默认值 2 更改; -mpa-callcost-shortcall,执行更积极的过程抽象,希望链接器可以放松长调用。 如果未实现基本假设,最后一个选项可能会增加代码大小。
  • 新设备支持 支持以下 AVR 部件:AVR16DA28、AVR16DA32、AVR16DA48、AVR32DA28、AVR32DA32、AVR32DA48、AVR64DA28、AVR64DA32、AVR64DA48、AVR64DA64、AVR128DB28、AVR128DB32、AVR128DB48 和 AVR128DB
  • 缩回设备支持 以下 AVR 部件不再提供支持:ATA5272、ATA5790、ATA5790N、ATA5791、ATA5795、ATA6285、ATA6286、ATA6612C、ATA6613C、ATA6614Q、ATA6616C、ATA6617C 和 ATA664251。

版本 2.29(功能安全发布)

  • 内置编译器的头文件 为了确保编译器能够符合 MISRA 等语言规范, , 已经升级。 此标头包含所有内置函数的原型,例如 __builtin_avr_nop() 和 __builtin_avr_delay_cycles() 。 某些内置程序可能不符合 MISRA 标准; 通过将定义 __XC_STRICT_MISRA 添加到编译器命令行可以省略这些。 内置函数及其声明已更新为使用固定宽度类型。

版本 2.20

  • 新设备支持 支持以下 AVR 部件:ATTINY1624、ATTINY1626 和 ATTINY1627。
  • 更好的最佳匹配分配 编译器中的最佳匹配分配器 (BFA) 已得到改进,因此段的分配顺序允许更好的优化。 BFA 现在支持命名地址空间并更好地处理数据初始化。
  • 改进的过程抽象现在对更多代码序列执行过程抽象优化。 以前这种优化可能会增加代码大小的情况已通过使优化代码了解链接器的垃圾收集过程得到解决。
  • 缺少 AVR 汇编器 AVR 汇编器不再包含在该发行版中。

版本 2.19(功能安全发布)
没有任何。

版本 2.10

  • 代码覆盖率 此版本包含代码覆盖率功能,可帮助分析项目源代码的执行程度。 使用选项 -mcodecov=ram 启用它。 在硬件上执行程序后,代码覆盖率信息将在设备中进行整理,并且可以通过代码覆盖率插件将其传输到 MPLAB X IDE 并由 MPLAB X IDE 显示。 有关此插件的信息请参阅 IDE 文档可以获得。
    #pragma nocodecov 可用于从覆盖率分析中排除后续函数。 理想情况下,应在文件开头添加编译指示,以从覆盖率分析中排除整个文件。 或者,可以使用 __attribute__((nocodecov)) 从覆盖率分析中排除特定函数。
  • 设备描述文件 名为 avr_chipinfo.html 的新设备文件位于编译器发行版的 docs 目录中。 该文件列出了编译器支持的所有设备。 单击设备名称,将打开一个页面,显示该设备所有允许的配置位设置/值对,其中包括amp莱斯。
  • 程序抽象 程序抽象优化已添加到编译器中,它通过调用该块的提取副本来替换公共汇编代码块。 这些由单独的应用程序执行,编译器在选择 2、3 或 s 级优化时会自动调用该应用程序。 这些优化减少了代码大小,但可能会降低执行速度和代码可调试性。 可以使用选项 -mno-pa 在较高的优化级别禁用程序抽象,也可以使用 -mpa 在较低的优化级别启用(取决于您的许可证)。 可以使用 -mno-pa-on- 对目标文件禁用它file=filename ,或通过使用 -mno-pa-on- function=function 禁用函数。 在源代码中,可以通过将 __attribute__((nopa)) 与函数的定义一起使用,或者使用 __nopa(它扩展为 __attribute__((nopa,noinline)) 来禁用函数的过程抽象,从而防止发生函数内联并且存在内联代码的抽象。
  • pragma 中的锁定位支持 #pragma config 现在可用于指定 AVR 锁定位以及其他配置位。 检查 avr_chipinfo.html 文件(如上所述)以获取与该编译指示一起使用的设置/值对。
  • 新器件支持 支持以下器件:AVR28DA128、AVR64DA128、AVR32DA128 和 AVR48DA128。

版本 2.05

  • 物超所值 此编译器和许可证管理器的 macOS 版本现在是 64 位应用程序。 这将确保编译器在最新版本的 macOS 上安装和运行时不会出现警告。
  • 程序存储器中的 const 对象 编译器现在可以将 const 限定的对象放置在程序闪存中,而不是将它们放置在 RAM 中。 编译器已被修改,以便 const 限定的全局数据存储在程序闪存中,并且可以使用适当的程序存储器指令直接或间接访问该数据。 默认情况下启用此新功能,但可以使用 -mno-const-data-in-progmem 选项禁用。 对于 avrxmega3 和 avrtiny 架构,此功能不是必需的,并且始终处于禁用状态,因为程序存储器已映射到这些设备的数据地址空间。
  • 免费的标准 该编译器的未许可(免费)版本现在允许优化到并包括第 2 级。这将允许类似但不完全相同的输出与以前使用标准许可证可能的输出。
  • 欢迎使用 AVRASM2 适用于 2 位设备的 AVRASM8 汇编器现在包含在 XC8 编译器安装程序中。 XC8 编译器不使用此汇编程序,但可用于基于手写汇编源代码的项目。
  • 新器件支持 支持以下器件:ATMEGA1608、ATMEGA1609、ATMEGA808 和 ATMEGA809。

版本 2.00

  • 顶层驱动 一个名为 xc8-cc 的新驱动现在位于之前的 avr-gcc 驱动和 xc8 驱动之上,它可以根据目标设备的选择调用适当的编译器。 该驱动程序接受 GCC 风格的选项,这些选项要么被翻译,要么传递给正在执行的编译器。 该驱动程序允许一组具有相似语义的相似选项用于任何 AVR 或 PIC 目标,因此是调用编译器的推荐方式。 如果需要,可以使用它在早期编译器版本中接受的旧式选项直接调用旧的 avr-gcc 驱动程序。
  • 通用 C 接口 该编译器现在可以符合 MPLAB 通用 C 接口,允许源代码更轻松地跨所有 MPLAB XC 编译器移植。 -mext=cci 选项请求此功能,为许多语言扩展启用替代语法。
  • 新的库管理器驱动程序 新的库管理器驱动程序位于之前的 PIC libr 库管理器和 AVR avr-ar 库管理器之上。 该驱动程序接受 GCC 归档器样式的选项,这些选项要么被翻译,要么传递给正在执行的库管理器。 新的驱动程序允许使用一组具有相似语义的相似选项来创建或操作任何 PIC 或 AVR 库文件,因此是调用库管理器的推荐方法。 如果遗留项目需要,可以使用早期编译器版本中接受的旧式选项直接调用以前的库管理器。

迁移问题

以下是编译器现在以不同方式处理的功能。 如果将代码移植到此编译器版本,这些更改可能需要修改您的源代码。 副标题中的版本号表示支持后续更改的第一个编译器版本。

版本 2.45
没有任何。

版本 2.41
删除了不准确的 fma 函数 (XC8-2913) C99 标准库 ( )并没有以无限精度计算乘加到单次舍入,而是累积每次运算的舍入误差。 这些函数已从提供的库中删除。

版本 2.40
没有任何。

版本 2.39(功能安全发布)
没有任何。

版本 2.36
没有任何。

版本 2.35

  • 字符串转基数的处理 (XC8-2420) 为了确保与其他 XC 编译器的一致性,如果指定的基数大于 8,XC36 字符串转函数(如 strtol() 等)将不再尝试转换输入字符串并将设置 . C 标准没有指定超过此基值时函数的行为。
  • 不适当的速度优化 选择 3 级优化 (-O3) 时启用了过程抽象优化。 这些优化以牺牲代码速度为代价减少了代码大小,因此不应该执行。 使用此优化级别的项目在使用此版本构建时可能会发现代码大小和执行速度有所不同。
  • 库功能 许多标准 C 库函数的代码现在都来自 Microchip 的统一标准库,在某些情况下,与以前的 avr-libc 库提供的行为相比,该库可能会表现出不同的行为。 对于前amp文件中,不再需要链接 lprintf_flt 库(-lprintf_flt 选项)来打开浮点格式说明符的格式化 IO 支持。 Microchip 统一标准库的智能 IO 功能使该选项变得多余。 此外,不再需要使用 _P 后缀例程来操作闪存中的 const 字符串的字符串和内存函数(例如 strcpy_P() 等)。 当启用程序内存中的常量数据功能时,标准 C 例程(例如 strcpy())将正确处理此类数据。

版本 2.32
没有任何。

版本 2.31
没有任何。

版本 2.30
没有任何。

版本 2.29(功能安全发布)
没有任何。

版本 2.2
更改的 DFP 布局 编译器现在采用 DFP(设备系列包)使用的不同布局。 这意味着较旧的 DFP 可能不适用于此版本,并且较旧的编译器将无法使用最新的 DFP。

版本 2.19(功能安全发布)
没有任何。

版本 2.10
没有任何

版本 2.05
程序内存中的 const 对象 请注意,默认情况下,const 限定的对象将在程序内存中放置和访问(如此处所述)。 这会影响项目的大小和执行速度,但会减少 RAM 使用量。 如果需要,可以使用 -mno-const-data-in-progmem 选项禁用此功能。

版本 2.00

  • 配置熔丝 器件配置熔丝现在可以使用 config pragma 进行编程,后跟设置值对来指定熔丝状态,例如 #pragma config WDTON = SET #pragma config BODLEVEL = BODLEVEL_4V3
  • 绝对对象和函数现在可以使用 CCI __at(address) 说明符将对象和函数放置在内存中的特定地址,例如amp乐:
    • #包括
      int foobar __at(0x800100);
      char __at(0x250) getID(int 偏移量) { … }
      此说明符的参数必须是一个常量,表示第一个字节或指令将放置的地址。 RAM 地址使用偏移量 0x800000 来表示。 启用 CCI 以使用此功能。
  • 新的中断函数语法 编译器现在接受 CCI __interrupt(num) 说明符来指示 C 函数是中断处理程序。 说明符采用中断号,例如amp乐:#include void __interrupt(SPI_STC_vect_num) spi_Isr(void) { ... }

修正问题

以下是对编译器所做的更正。 这些可能会修复生成代码中的错误或将编译器的操作更改为用户指南预期或指定的操作。 子标题中的版本号表示包含后续问题修复的第一个编译器版本。 标题中的括号标签是该问题在跟踪数据库中的标识。 如果您需要联系支持人员,这些可能会很有用。
请注意,某些特定于设备的问题已在与设备关联的设备系列包 (DFP) 中得到纠正。 有关对 DFP 所做更改的信息以及下载最新包的信息,请参见 MPLAB 包管理器。

版本 2.45

  • 漫游许可证失败 (XCLM-235) 漫游许可证无法在使用 glibc 版本高于 2.28 的 Linux 平台上正常工作。
  • 结构数组的内部错误 (XC8-3069) 处理结构的多维数组成员时,地址空间限定符未正确传播到数组。 这导致地址空间限定信息不匹配和内部编译器错误。 这种情况已得到纠正。
  • 对未初始化流的错误写入(ML-353、XC8-3100) 如果未使用 FDEV_SETUP_STREAM 或 _init_stdout/_init_stderr 显式设置标准输出/错误流,则尝试写入它们会导致未定义的行为。 这也影响了 stdlib 函数的写入,例如 perror()。 现在,在初始化这些流之前对这些流的任何写入都将被忽略。
  • 不支持的修饰符 (XC8-2505) avr-libc 库不支持 printf 样式转换说明符中的 * 修饰符,例如ample“%.*f”。 现在,通过 Microchip 统一标准库的引入,这一点得到了支持。
  • 多个未初始化的警告 (XC8-2409) 当遇到未初始化的 const 数组时,编译器发出多个相同的警告消息。 该消息本来应该只发出一次,而现在出现这种情况时就是这样。

版本 2.41

  • Ventura 上的加密狗问题 (XC8-3088) 用于许可编译器的加密狗可能无法在 macOS Ventura 主机上正确读取,从而导致许可失败。 对 XCLM 许可证管理器的更改可以解决此问题。
  • 内存分配指示不正确 (XC8-2925) 尝试使用使用简单动态内存分配实现时请求的标准库内存管理函数(malloc() 等)来分配 SIZE_MAX 字节(或接近于此的值)内存。 在这种情况下,现在将返回 NULL 指针并将 errno 设置为 ENOMEM。
  • 删除了不准确的 fma 函数 (XC8-2913) C99 标准库 fma() 系列函数 ( )并没有以无限精度计算乘加到单次舍入,而是累积每次运算的舍入误差。 这些函数已从提供的库中删除。
  • 字符串转换处理不当(XC8-2921、XC8-2652)当 strtod() 转换的“主题序列”包含指数格式的浮点数,并且 e/E 后有意外字符时字符,然后在提供了 endptr 的地方,它被分配了一个地址,使其指向 后面的字符,而它应该指向 e//E 字符本身,因为它还没有被转换。 对于前ample, strtod(“100exx”, &ep) 应返回 100.00 并将 ep 设置为指向字符串的“exx”部分,而该函数返回正确的值,但设置字符串的“xx”部分。

版本 2.40

  • 太宽松 (XC8-2876) 使用 -mrelax 选项时,编译器没有将一些部分分配在一起,导致代码大小不太理想。 这可能发生在使用新 MUSL 库或弱符号的代码中。
  • 如警告 (XC8-2875) 中所述,未禁用映射功能 const-data-in-config-mapped-progmem 功能依赖于启用的 const-data-in-progmem 功能。 如果使用该选项显式启用 const-data-in-config-mapped-progmem 功能,并且禁用 const-data-in-progmem 功能,则链接步骤会失败,尽管有一条警告消息指出 const-data-in -config-mapped-progmem 功能已被自动禁用,这并不完全正确。 在这种情况下,const-data-in-config-mapped-progmem 功能现已完全禁用。
  • DFP 进行更改以正确访问 NVMCTRL (XC8-2848) AVR64EA 设备使用的运行时启动代码未考虑 NVMCTRL 寄存器处于配置更改保护 (CCP) 下,并且无法将 IO SFR 设置为所使用的页面通过 const-data-in-config-mapped-progmem 编译器功能。 AVR-Ex_DFP 版本 2.2.55 中所做的更改将允许运行时启动代码正确写入该寄存器。
  • DFP 进行更改以避免闪存映射 (XC8-2847) AVR128DA28/32/48/64 芯片勘误表 (DS80000882) 中报告的闪存映射器件功能问题的解决方法已实施。 默认情况下,受影响的设备不会应用 const-data-in-config-mapped-progmem 编译器功能,此更改将出现在 AVR-Dx_DFP 版本 2.2.160 中。
  • sinhf 或 coshf 的构建错误 (XC8-2834) 尝试使用 sinhf() 或 coshf() 库函数会导致链接错误,描述未定义的引用。 所引用的缺失函数现已包含在编译器发行版中。
  • 使用 nopa 构建错误 (XC8-2833) 将 nopa 属性与使用 __asm__() 指定汇编程序名称的函数一起使用会触发来自汇编程序的错误消息。 这种组合是不可能的。
  • 带指针参数的可变参数函数失败(XC8-2755、XC8-2731) 当 const-data-in-progmem 功能启用时,具有可变数量参数的函数期望在变量参数列表中传递 24 位(__memx 类型)指针已启用。 指向数据内存的指针参数作为 16 位对象传递,导致最终读取时出现代码故障。 当启用 const-data-in-progmem 功能时,所有 16 位指针参数现在都会转换为 24 位指针。
  • strtoxxx 库函数失败 (XC8-2620) 当启用 const-data-in-progmem 功能时,对于不在程序内存中的源字符串参数,strtoxxx 库函数中的 endptr 参数未正确更新。
  • 无效转换警报 (XC8-2612) 如果启用了 const-in-progmem 功能并且字符串文字的地址显式转换为数据地址空间(删除 const 限定符),编译器现在将发出错误,例如ample, (uint8_t *)“你好世界!” 。 如果将常量数据指针显式转换为数据地址空间时地址可能无效,则会发出警告。
  • 未初始化 const 对象的放置 (XC8-2408) 未初始化和 const 易失性对象 const
    没有被放置在将全部或部分程序存储器映射到数据地址空间的设备上的程序存储器中。 对于这些设备,此类对象现在被放置在程序存储器中,使其操作与其他设备一致。

版本 2.39(功能安全发布)
没有任何。

版本 2.36
延迟时出错 (XC8-2774) 默认自由模式优化中的微小更改阻止了操作数表达式常量折叠到延迟内置函数,导致它们被视为非常量并触发错误:__builtin_avr_delay_cycles 需要一个编译时整数持续的。

版本 2.35

  • 使用 __at (XC8-2653) 连续分配多个对象放置在具有相同名称的部分中并且使用 __at() 无法正常工作。 对于前amp乐:
    const char arr1[] __attribute__((section(“.mysec”))) __at (0x500) = {0xAB, 0xCD}; const char arr2[] __attribute__((section(“.mysec”))) = {0xEF, 0xFE}; 应该将 arr2 紧接在 arr1 之后
  • 指定节起始地址 (XC8-2650) -Wl,–section-start 选项无法将节放置在指定的起始地址。 对于任何自定义命名的部分,此问题已得到修复; 但是,它不适用于任何标准节,例如 .text 或 .bss,必须使用 -Wl、-T 选项放置这些节。 链接器在放松时崩溃 (XC8-2647) 当启用 -mrelax 优化并且存在不适合可用内存的代码或数据部分时,链接器崩溃。 现在,在这种情况下,会发出错误消息。
  • 没有 no-fallback (XC8-2646) –nofallback 选项没有正确实现,也没有记录。 现在可以选择此选项以确保编译器在未经许可的情况下不会回退到较低的优化设置,而是会发出错误。
  • 不适当的速度优化 (XC8-2637) 选择 3 级优化 (-O3) 时启用程序抽象优化。 这些优化以牺牲代码速度为代价减少了代码大小,因此不应该执行。
  • 错误的 EEPROM 访问 (XC8-2629) 当启用 – mconst-data-in-progmem 选项(这是默认状态)时,eeprom_read_block 例程在 Xmega 设备上无法正常工作,导致 EEPROM 内存无法正确读取。
  • 无效内存分配(XC8-2593、XC8-2651)当 -Ttext 或 -Tdata 链接器选项(例如amp指定使用 -Wl 驱动程序选项传递的文件),相应的文本/数据区域原点已更新; 然而,结束地址没有相应调整,这可能导致该区域超出目标设备的内存范围。
  • 过度属性函数导致崩溃 (XC8-2580) 如果使用多个中断、信号或 nmi 属性声明函数,例如 __attribute__((__signal__, __interrupt__)),编译器将崩溃。
  • 无效的 ATtiny 中断代码 (XC8-2465) 为 ATtiny 设备构建且禁用优化 (-O0) 时,中断函数可能触发操作数超出范围
  • 选项未通过 (XC8-2452) 当使用带有多个逗号分隔的链接器选项的 -Wl 选项时,并非所有链接器选项都被传递给链接器。
  • 间接读取程序存储器时出错 (XC8-2450) 在某些情况下,从指向程序存储器的指针读取两字节值时,编译器会产生内部错误(无法识别的 insn )

版本 2.32
库的第二次访问失败 (XC8-2381) 第二次调用 Windows 版本的 xc8-ar.exe 库归档程序以访问现有的库归档可能失败,并显示无法重命名错误消息。

版本 2.31
无法解释的编译器故障 (XC8-2367) 在将系统临时目录设置为包含点“.”的路径的 Windows 平台上运行时字符,编译器可能无法执行。

版本 2.30

  • 大纲后全局标签错位 (XC8-2299) 将全局标签放置在程序抽象分解出的汇编序列中的手写汇编代码可能未正确重新定位。
  • 松弛崩溃 (XC8-2287) 使用 -mrelax 选项可能导致链接器在尾部跳转松弛优化尝试删除不在节末尾的 ret 指令时崩溃。
  • 将标签优化为值时崩溃 (XC8-2282) 使用“标签作为值”GNU C 语言扩展的代码可能会导致过程抽象优化崩溃,并出现范围跨度修复错误。
  • 不那么 const (XC8-2271) strstr() 和其他函数的原型来自当禁用 const -mconst-data-in-progmem 功能时,不再在返回的字符串指针上指定非标准限定符。 请注意,对于 avrxmega3 和 avrtiny 设备,此功能将永久启用。
  • 丢失初始化程序 (XC8-2269) 当翻译单元中的多个变量被放置在一个节中(​​使用 __section 或 __attribute__((section)) ),并且第一个此类变量被零初始化或没有初始化程序时,初始化程序同一翻译单元中放置在同一部分的其他变量丢失。

版本 2.29(功能安全发布)
没有任何。

版本 2.20

  • 长命令错误 (XC8-1983) 当使用 AVR 目标时,如果命令行非常大并且包含特殊字符(例如引号、反斜杠等),编译器可能会因找不到文件错误而停止。
  • 未分配的 rodata 部分 (XC8-1920) AVR 链接器在为 avrxmega3 和 avrtiny 架构构建时无法为自定义 rodata 部分分配内存,可能会产生内存重叠错误

版本 2.19(功能安全发布)
没有任何。

版本 2.10

  • 重定位失败 (XC8-1891) 最适合的分配器是在链接器松弛后在各部分之间留下内存“孔”。 除了内存碎片之外,这还增加了与 PC 相对跳转或调用超出范围相关的链接器重定位失败的可能性。
  • Instructions not transformed by relaxation (XC8-1889) 链接器松弛不会发生在跳转或调用指令中,如果松弛,其目标将变得可达。
  • 丢失的功能 (XC8E-388) 的几个定义,例如clock_div_t和clock_prescale_set(),没有为设备定义,包括ATmega324PB、ATmega328PB、ATtiny441和ATtiny841。
  • 缺少宏 编译器自动定义的预处理器宏 _XC8_MODE_、__XC8_VERSION、__XC 和 __XC8。 这些现已可用。

版本 2.05

  • 内部编译器错误 (XC8-1822) 在 Windows 下构建时,优化代码时可能会产生内部编译器错误。
  • 未检测到 RAM 溢出(XC8-1800、XC8-1796) 在某些情况下,编译器未检测到超出可用 RAM 的程序,从而导致运行时代码失败。
  • 省略的闪存 (XC8-1792) 对于 avrxmega3 和 avrtiny 器件,MPLAB X IDE 可能未对部分闪存进行编程。
  • 无法执行 main (XC8-1788) 在程序未定义全局变量的某些情况下,运行时启动代码不会退出,并且永远不会到达 main() 函数。
  • 内存信息不正确 (XC8-1787) 对于 avrxmega3 和 avrtiny 设备,avr-size 程序报告只读数据正在消耗 RAM 而不是程序内存。
  • 程序存储器读取不正确 (XC8-1783) 为将程序存储器映射到数据地址空间并使用 PROGMEM 宏/属性定义对象的设备编译的项目可能从错误的地址读取这些对象。
  • 属性内部错误 (XC8-1773) 如果您在指针名称和取消引用类型之间使用 __at() 或 attribute() 标记定义指针对象,则会发生内部错误,例如ample, char * __at(0x800150) cp; 如果遇到此类代码,现在会发出警告。
  • 无法执行 main(XC8-1780、XC8-1767、XC8-1754) 在到达 main( )。
  • 小型设备的熔丝错误(XC8-1778、XC8-1742) attiny4/5/9/10/20/40 设备在其头文件中指定了不正确的熔丝长度,这会在尝试构建定义熔丝的代码时导致链接器错误。
  • 分段错误 (XC8-1777) 间歇性分段错误已得到纠正。
  • 汇编器崩溃 (XC8-1761) 当编译器在 Ubuntu 18 下运行时,avr-as 汇编器可能会崩溃。
  • 对象未清除 (XC8-1752) 未初始化的静态存储持续时间对象可能未被运行时启动代码清除。
  • 忽略冲突的设备规范 (XC8-1749) 当使用多个设备规范选项并指示不同的设备时,编译器不会生成错误。
  • 堆内存损坏 (XC8-1748) __heap_start 符号设置不正确,导致普通变量可能被堆损坏。
  • 链接器重定位错误 (XC8-1739) 当代码包含 rjmp 或 rcall 且目标正好 4k 字节时,可能会发出链接器重定位错误。

版本 2.00
没有任何。

已知问题

以下是编译器操作的限制。 这些可能是一般编码限制,或者与用户手册中包含的信息的偏差。 标题中的括号标签是该问题在跟踪数据库中的标识。 如果您需要联系支持人员,这可能会有帮助。 那些没有标签的项目是描述操作方式的限制,并且可能永久有效。

MPLAB X IDE 集成

  • MPLAB IDE 集成 如果要从 MPLAB IDE 使用编译器,则必须在安装编译器之前安装 MPLAB IDE。
  • 数组调试信息 (XC8-3157) 编译器生成的调试信息不​​能准确传达 __memx 地址空间中数组的对象类型。 这将阻止在 IDE 中观察对象。

代码生成

  • 带有分段锚点选项的段错误 (XC8-3045) 使用变量参数列表定义函数并使用 -fsection-anchors 选项的程序可能会触发内部编译器错误:分段错误
  • 调试信息不​​同步 (XC8-2948) 当链接器松弛优化缩小指令时(例如amp(例如,调用 rcall 指令),当某一节中发生多个收缩操作时,源行到地址映射可能不会保持同步。 在下面的例子中ample,有两个对 foo 的调用最终放宽到相对调用。
  • PA 内存分配失败 (XC8-2881) 当使用过程抽象优化器时,当代码大小接近设备上的可用程序内存量时,链接器可能会报告内存分配错误,即使程序应该能够适应可用的内存空间。空间。
  • 不太智能 Smart-IO (XC8-2872) 如果 const-data-in-progmem 功能已被禁用,或者设备具有其所有功能,则编译器的 smart-io 功能将为 snprintf 函数生成有效但次优的代码。闪存映射到数据存储器。
  • 甚至不太智能的 Smart-IO (XC8-2869) 当同时使用 -flto 和 -fno-builtin 选项时,编译器的 smart-io 功能将生成有效但次优的代码。
  • 次优只读数据放置 (XC8-2849) 链接器当前不知道 APPCODE 和 APPDATA 内存部分,也不知道内存映射中的 [No-]Read-While-Write 分区。 因此,链接器有可能在不合适的内存区域中分配只读数据。 如果启用了 const-data-in-progmem 功能,尤其是同时启用了 const-data-in-config-mapped-progmem 功能,则数据放错位置的可能性会增加。 如果需要,可以禁用这些功能。
  • 目标文件处理顺序 (XC8-2863) 链接器处理目标文件的顺序可能因过程抽象优化(-mpa 选项)的使用而异。 这只会影响跨多个模块定义弱函数的代码。
  • 绝对链接器错误 (XC8-2777) 当在 RAM 起始地址处将对象设置为绝对对象并且还定义了未初始化的对象时,可能会触发链接器错误。
  • 短唤醒 ID (XC8-2775) 对于 ATA5700/2 器件,PHID0/1 寄存器仅定义为 16 位宽,而不是 32 位宽。
  • 调用符号时链接器崩溃 (XC8-2758) 如果在源代码调用使用 –Wl,–defsym 链接器选项定义的符号时使用 -mrelax 驱动程序选项,则链接器可能会崩溃。
  • 初始化不正确 (XC8-2679) 某些全局/静态字节大小对象的初始值在数据存储器中的位置与运行时访问变量的位置之间存在差异。
  • 错误的间接函数调用 (XC8-2628) 在某些情况下,通过作为结构的一部分存储的函数指针进行的函数调用可能会失败。
  • strtof 对于十六进制浮点数返回零 (XC8-2626) 库函数 strtof() 等和 scanf() 等将始终将未指定指数的十六进制浮点数转换为零。 对于前ample: strtof(“0x1”, &endptr); 将返回值 0,而不是 1。
  • 堆栈顾问消息传递不准确(XC8-2542、XC8-2541) 在某些情况下,不会发出有关递归或使用的不确定堆栈(可能通过使用 alloca())的堆栈顾问警告。
  • 重复中断代码失败 (XC8-2421) 如果多个中断函数具有相同的函数体,编译器可能会输出一个中断函数调用另一个的中断函数。 这将导致所有被调用破坏的寄存器被不必要地保存,甚至在当前中断处理程序的尾声运行之前中断将被启用,这可能导致代码失败。
  • 无效 DFP 路径的错误输出 (XC8-2376) 如果使用无效的 DFP 路径调用编译器,并且所选设备存在“spec”文件,则编译器不会报告丢失的设备系列包,而是选择“spec”文件,这可能会导致无效的输出。 “spec”文件可能不是分布式 DFP 的最新文件,并且仅用于内部编译器测试。
  • 未检测到内存重叠 (XC8-1966) 编译器未检测到在某个地址(通过 __at())实现绝对化的对象以及使用 __section() 说明符且链接到同一地址的其他对象的内存重叠。
  • 库函数和 __memx 失败 (XC8-1763) 使用 __memx 地址空间中的参数调用的 libgcc float 函数可能会失败。 请注意,库例程是从某些 C 运算符调用的,因此,例如ample,以下代码受到影响:return regFloatVar > memxFloatVar;
  • 有限的 libgcc 实现 (AVRTC-731) 对于 ATTiny4/5/9/10/20/40 产品,libgcc 中的标准 C/数学库实现非常有限或不存在。
  • 程序内存限制 (AVRTC-732) 工具链支持超过 128 kb 的程序内存映像; 但是,在使用 -mrelax 选项时,有一些已知的链接器中止实例,没有松弛且没有有用的错误消息,而不是生成所需的函数存根。
  • 命名空间限制 (AVRTC-733) 工具链支持命名地址空间,但须遵守用户指南特殊类型限定符部分中提到的限制。
  • 时区库函数假定 GMT 并且不支持本地时区,因此 localtime() 将返回与 gmtime() 相同的时间,例如amp勒。

文件/资源

AVR MCU 的 MICROCHIP XC8 C 编译器版本 2.45 发行说明 [pdf] 指示
AVR MCU、XC8 C、XC8 C 编译器版本 2.45 AVR MCU 发行说明、AVR MCU 编译器版本 2.45 发行说明、AVR MCU 版本 2.45 发行说明、AVR MCU 发行说明、AVR MCU 说明、AVR MCU

参考

发表评论

您的电子邮件地址不会被公开。 必填字段已标记 *