MICROCHIP MPLAB XC8 C 编译器软件 

MICROCHIP MPLAB XC8 C 编译器软件

本文档包含针对 MICROCHIP AVR 设备时与 MPLAB XC8 C 编译器相关的重要信息。
请在运行此软件之前阅读它。 如果您使用用于 8 位 PIC 器件的编译器,请参见 PIC 文档的 MPLAB XC8 C 编译器发行说明。

超过view

介绍

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

建造日期

该编译器版本的正式构建日期是 3 年 2022 月 XNUMX 日。

以前的版本

之前的 MPLAB XC8 C 编译器版本是 2.39,一个功能安全编译器,构建于 27 年 2022 月 2.36 日。之前的标准编译器版本是 27,构建于 2022 年 XNUMX 月 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 10.15.5。 Windows 的二进制文件已经过代码签名。 适用于 mac OS 的二进制文件已经过代码签名和公证。

如果您正在运行网络许可服务器,则只能使用具有编译器支持的操作系统的计算机来托管许可服务器。 从 xclm 2.0 版开始,网络许可证服务器可以安装在 Microsoft Windows Server 平台上,但许可证服务器不需要在服务器版本的操作系统上运行。

支持的设备

该编译器支持发布时已知的所有 8 位 AVR MCU 设备。 请参阅(在编译器的文档目录中)以获取所有受支持设备的列表。 这些 files 还列出了每个设备的配置位设置。

版本和许可证升级

MPLAB XC8 编译器可以作为授权 (PRO) 或未授权 (免费) 产品激活。 您需要购买激活密钥来许可您的编译器。 与免费产品相比,许可证允许更高级别的优化。 未经许可的编译器可以在没有许可的情况下无限期运行。

必须使用从 Microchip 购买的功能安全许可证激活 MPLAB XC8 功能安全编译器。 没有此许可证,编译器将无法运行。 激活后,您可以选择任何优化级别并使用所有编译器功能。 此版本的 MPLAB XC 功能安全编译器支持网络服务器许可证。
请参见 Installing and Licensing MPLAB XC C Compilers (DS50002059)文档,了解有关许可证类型和使用许可证安装编译器的信息。

安装和激活

另请参阅迁移问题和限制部分,了解有关此编译器随附的最新许可证管理器的重要信息。
如果使用 MPLAB IDE,请确保在安装此工具之前安装最新的 MPLAB X IDE 5.0 或更高版本。 在安装编译器之前退出 IDE。 运行 .exe (Windows)、.run (Linux) 或 app (macOS) 编译器安装程序,例如 XC8-1.00.11403-windows.exe,然后按照屏幕上的说明进行操作。
推荐使用默认安装目录。 如果您使用的是 Linux,则必须使用终端和根帐户安装编译器。 使用具有管理员权限的 macOS 帐户进行安装。

现在激活与安装分开进行。 如需了解更多信息,请参阅文档 License Manager for MPLAB® XC C Compilers (DS52059)。

如果您选择在评估许可下运行编译器,您现在将在评估期结束后的 14 天内在编译期间收到警告。 如果您在 HPA 订阅结束后的 14 天内会发出相同的警告。

XC 网络许可证服务器是一个单独的安装程序,不包含在单用户编译器安装程序中。

XC 许可证管理器现在支持浮动网络许可证的漫游。 针对移动用户,此功能允许浮动许可证在短时间内脱离网络。 使用此功能,您可以断开网络连接并继续使用 MPLAB XC 编译器。 有关此功能的更多信息,请参阅 XCLM 安装的 doc 文件夹。 MPLAB X IDE 包括一个许可证窗口(工具 > 许可证)以直观地管理漫游。

解决安装问题

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

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

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

编译器文档

单击 MPLAB X IDE 仪表板中的蓝色帮助按钮时,可以从浏览器中打开的 HTML 页面打开编译器的用户指南,如屏幕截图所示。

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

客户支持

Microchip 欢迎有关此编译器版本的错误报告、建议或意见。 请通过支持系统指示任何错误报告或功能请求。

文档更新

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

此版本中新的或更新的 AVR 文档:

  • MUSL 版权声明
  • 安装和许可 MPLAB XC C 编译器(修订版 M)
  • 面向嵌入式工程师的 MPLAB XC8 用户指南——AVR MCU(修订版 A)
  • 适用于 AVR MCU 的 MPLAB XC8 C 编译器用户指南(修订版 F)
  • Microchip 统一标准库参考指南(修订版 B)

Microchip 统一标准库参考指南描述了 Microchip 统一标准库定义的函数的行为和接口,以及库类型和宏的预期用途。 其中一些信息以前包含在 AVR® MCU 的 MPLAB® XC8 C 编译器用户指南中。 本编译器指南中仍包含特定于设备的库信息。

如果您刚开始使用 8 位设备和 MPLAB XC8 C 编译器,MPLAB® XC8 User!s Guide for Embedded Engineers – AVR® MCUs (DS50003108)包含有关在 MPLAB X IDE 中设置项目和编写代码的信息用于您的第一个 MPLAB XC8 C 项目。 本指南现在与编译器一起分发。

Hamate 用户指南已包含在此版本的 docs 目录中。 本指南适用于将 Hamate 作为独立应用程序运行的用户。

什么是新的

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

版本 2.40

新设备支持 现在支持以下 AVR 部件:AT90PWM3、AVR16DD14、AVR16DD20、AVR16DD28、AVR16DD32、AVR32DD14、AVR32DD20、AVR32DD28、AVR32DD32、AVR64EA28、AVR64EA32 和 AVR64EA48。
改进的过程抽象 过程抽象 (PA) 优化工具已得到改进,因此可以概述包含函数调用指令(调用调用)的代码。 只有当堆栈不用于向函数传递参数或从函数获取返回值时才会发生这种情况。 当调用带有可变参数列表的函数或调用参数多于为此目的指定的寄存器的函数时,将使用堆栈。 可以使用 monk-pa-outline-calls 选项禁用此功能,或者可以为对象完全禁用程序抽象 file 或使用 -monk-pa-on- 功能file 和 -mo.-pa-on-function 分别,或者通过对函数选择性地使用 nipa 属性( nipa 说明符)

代码覆盖宏 如果指定了有效的 mcodecov 选项,编译器现在会定义宏 __CODECOV。

内存预留选项 在为 AVR 目标构建时,xc8-cc 驱动程序现在将接受 -mreserve=space@start: end 选项。 该选项在数据或程序存储空间中保留指定的存储范围,防止链接器在该区域填充代码或对象。

更智能的智能IO 对 Smart 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 选项控制为小型中断服务例程生成的上下文 itch 代码。 启用后,此功能将使汇编器扫描 ISR 以查找寄存器使用情况,并仅在需要时保存这些使用过的寄存器。

可配置闪存映射 AVR DA 和AVR DB 系列中的某些器件具有一个SFR(例如FLMAP),用于指定程序存储器的哪个32k 部分将被映射到数据存储器中。 新的 –mconst-data-in-config-mapped-proem 选项可用于让链接器将所有 cons 合格的数据放在一个 32k 段中,并自动初始化相关的 SFR 寄存器以确保将此数据映射到数据存储空间,在那里可以更有效地访问它。

Microchip 统一标准库 所有 MPLAB XC 编译器都将共享一个 Microchip 统一标准库,此版本的 MPLAB XC8 现已提供该库。 MPLAB® XC8 C 编译器用户指南/或 AVR® MCU 不再包含这些标准函数的文档。 现在可以在 Microchip 统一标准库参考指南中找到此信息。 请注意,以前由 avr-libc 定义的某些功能不再可用。 (见图书馆员):'。 功能……)

智能输入输出 作为新统一库的一部分,打印和扫描系列中的 IO 函数现在根据这些函数在程序中的使用方式在每个构建中自定义生成。 这可以大大减少程序使用的资源。
智能 IO 辅助选项 在分析对智能 IO 函数(例如 printf () 或 scanf () )的调用时,编译器不能总是从格式字符串中确定或从参数中推断出调用所需的那些转换说明符。 以前,编译器总是不做任何假设,并确保将功能齐全的 IO 函数链接到最终的程序映像中。 添加了一个新的 – msmart-io-format=fmt 选项,这样编译器就可以由用户通知编译器智能 IO 函数使用的转换说明符,这些函数的用法不明确,从而防止链接过长的 IO 例程。 (有关更多详细信息,请参阅 smart-io-format 选项。)

放置自定义部分 以前,当链接器脚本定义同名输出节时,-Wl、–section-start 选项仅将指定节放在请求的地址。 如果不是这种情况,该部分将放置在链接器选择的地址中,并且该选项基本上被忽略。 现在该选项将适用于所有自定义部分,即使链接描述文件未定义该部分。 但是请注意,对于标准部分,例如 . 文本, 。 bss 或 . 数据,最适合的分配器仍然可以完全控制它们的放置,并且该选项将无效。 使用 -Wl, -Tsection=add 选项,如用户指南中所述。

版本 2.32

堆栈指导 提供 PRO 编译器许可证,编译器的堆栈引导功能​​可用于估计程序使用的任何堆栈的最大深度。 它构建和分析程序的调用图,确定每个函数的堆栈使用情况,并生成报告,从中可以推断出程序使用的堆栈深度。 此功能通过 -mchp-stack-usage 命令行选项启用。 执行后会打印堆栈使用情况的摘要。 地图中提供了详细的堆栈报告 file,可以用通常的方式请求。

新设备支持 支持 适用于以下 AVR 部件:ATTINY 427、ATTINY 424、ATTINY 426、ATTINY827、ATTINY824、ATTINY826、AVR32DB32、AVR64DB48、AVR64DB64、AVR64DB28、AVR32DB28、AVR64DB32 和 AVR32DB48。

缩回设备支持支持 不再适用于以下 AVR 部件:AVR16DA28、AVR16DA32 和 AVR16DA48。

版本 2.31

没有任何。

版本 2.30

防止数据初始化的新选项 新的 -mno-data-init 驱动程序选项可防止数据初始化和 bss 部分的清除。 它通过抑制汇编中do_copy_data和do_clear_bss符号的输出来工作 files,这将反过来阻止链接器包含这些例程。

增强优化 已进行多项优化改进,包括删除冗余返回指令、删除 skip-if-bit-is 指令后的一些跳转,以及改进过程抽象和迭代此过程的能力。

现在可以使用其他选项来控制其中一些优化,特别是 -f section anchors,它允许相对于一个符号执行静态对象的访问; -mpai derations=n,它允许将程序抽象迭代的次数从默认值 2 更改; -mpa- call cost- shortcall,它执行更积极的过程抽象,希望链接器可以放松长调用。 如果未实现基本假设,最后一个选项可能会增加代码大小。

新设备支持 支持以下 AVR 部件:AVR16DA28、AVR16DA32、
AVR16DA48、AVR32DA28、AVR32DA32、AVR32DA48、AVR64DA28、AVR64DA32、AVR64DA48、AVR64DA64、AVR128DB28、AVR128DB32、AVR128DB48 和 AVR128DB64。

缩回设备支持 不再支持以下 AVR 部件:ATA5272、ATA5790、ATA5790N、ATA5791、ATA5795、ATA6285、ATA6286、ATA6612C、ATA6613C、ATA6614Q、ATA6616C、ATA6617C 和 ATA664251。

版本 2.29(功能安全发布)

标头 file 对于编译器内置函数,为了确保编译器能够符合 MISRA 等语言规范, 标头 file,它自动包含在, 已经升级。 此标头包含所有内置函数的原型,例如 _buil tin _avrnop () 和 _buil tin_ avr delay_ cycles () 。 一些内置插件可能不符合 MISRA 标准; 这些可以通过将 define _Xe_ STRICT_ MISRA 添加到编译器命令行来省略。 内置函数及其声明已更新为使用固定宽度类型。

版本 2.20

新设备支持 支持以下 AVR 部件:ATTINY1624、ATTINY1626 和 ATTINY1627。

更好的最佳匹配分配 编译器中的最佳匹配分配器 (BFA) 已得到改进,因此可以按允许更好优化的顺序分配段。 BFA 现在支持命名地址空间并更好地处理数据初始化。

改进的过程抽象 现在对更多代码序列执行过程抽象优化。 以前这种优化可能会增加代码大小的情况已通过使优化代码了解链接器的垃圾收集过程得到解决。

没有 AVR 汇编程序 AVR Assembler 不再包含在这个发行版中。

版本 2.19(功能安全发布)

没有任何。

版本 2.10

代码覆盖率 此版本包括代码覆盖率功能,有助于分析项目源代码的执行程度。 使用选项 -mcodecov=ram 来启用它。 在您的硬件上执行程序后,代码覆盖率信息将在设备中整理,并且可以通过代码覆盖率插件传输到 MPLAB X IDE 并由其显示。 有关此插件的信息,请参阅 IDE 文档。 #pragma mcodecov 可用于从覆盖分析中排除后续函数。 理想情况下,pragma 应该添加在 file 排除整个 file 从覆盖率分析。 或者,属性 ( (mcodecov) ) 可用于从覆盖率分析中排除特定函数。

设备描述 files 新设备 file 称为 avr 芯片信息。 html 位于编译器分发的 docs 目录中。 这 file 列出编译器支持的所有设备。 单击设备名称,它将打开一个页面,显示该设备所有允许的配置位设置/值对,例如amp莱斯。

过程抽象 程序抽象优化已添加到编译器中,该优化使用对该块的提取副本的调用替换汇编代码的公共块。 这些由单独的应用程序执行,编译器在选择 2 级、3 级或优化时自动调用该应用程序。 这些优化减少了代码大小,但它们可能会降低执行速度和代码的可调试性。
可以使用选项 -mno-pa 在较高的优化级别禁用过程抽象,或者可以使用 -mpa 在较低的优化级别(取决于您的许可证)启用。 它可以为一个对象禁用 file 使用 -mno-pa-on-file=file名称,或通过在 function=function 上使用 -mno-pa 为函数禁用。
在您的源代码中,可以通过在函数定义中使用 _attribute_ ( (nopa)) 或使用扩展为属性 ( (nopa, noinline)) 的 _nopa 来禁用函数的过程抽象,从而防止发生函数内联并且有内联代码的抽象。
pragma 中的锁定位支持 #pragma config 现在可用于指定 AVR 锁定位以及其他配置位。 查看avr芯片信息。 网页格式 file (上面提到的)用于与此 pragma 一起使用的设置/值对。
新设备支持 支持以下器件: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 库管理器和 AVR avr-ar 库管理器之上。 此驱动程序接受 GCC 存档器样式的选项,这些选项将被翻译或传递给正在执行的图书馆员。 新驱动程序允许使用一组具有相似语义的相似选项来创建或操作任何 PIC 或 AVR 库 file 因此是调用图书馆员的推荐方式。 如果遗留项目需要,可以使用它在早期编译器版本中接受的旧式选项直接调用以前的库管理器。

迁移问题

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

版本 2.40

没有任何。

版本 2.39(功能安全发布)

没有任何。

版本 2.36

没有任何。

版本 2.35

字符串到碱基的处理 (XCS-2420) 为确保与其他 XC 编译器的一致性,如果指定的基数大于 8,XC36 字符串到函数(如 strtol () 等)将不再尝试转换输入字符串,而是将 errno 设置为 EINVAL。 当超过这个基值时,C 标准没有指定函数的行为。

不适当的速度优化 选择 3 级优化 (-03) 时启用程序抽象优化。 这些优化以牺牲代码速度为代价减少了代码大小,因此不应该执行。 使用此优化级别的项目在使用此版本构建时可能会发现代码大小和执行速度有所不同。

库功能 许多标准 C 库函数的代码现在来自 Microchip 的统一标准库,与以前的 avr-libc 库提供的代码相比,它在某些情况下可能表现出不同的行为。 对于前ample,不再需要链接 lprintf_flt 库(-print _flt 选项)来打开对浮点格式说明符的格式化 IO 支持。 Microchip 统一标准库的智能 IO 功能使该选项变得多余。 此外,不再需要对闪存中的常量字符串进行操作的字符串和内存函数(例如 strcpy_P () 等)使用带 _p 后缀的例程。 当启用程序内存中的常量数据功能时,标准 C 例程(例如 strcpy ())将正确处理此类数据。

版本 2.32

没有任何。

版本 2.31

没有任何。

版本 2.30

没有任何。

版本 2.29(功能安全发布)

没有任何。

版本 2.20

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

版本 2.19(功能安全发布)

没有任何。

版本 2.10

没有任何

版本 2.05

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

版本 2.00

配置保险丝 现在可以使用 config pragma 后跟设置值对来对器件配置熔丝进行编程,以指定熔丝状态,例如
#pragma 配置 WDT0N = SET
#pragma config B0DLEVEL = B0DLEVEL_4V3
绝对对象和函数 现在可以使用 CCI _at(地址)说明符将对象和函数放置在内存中的特定地址,例如amp乐:#include int foobar 在(Ox800100); char at(Ox250) get ID(int offset) { … } 此说明符的参数必须是一个常量,表示将放置第一个字节或指令的地址。 RAM 地址使用偏移量 0x800000 表示。 启用 CCI 以使用此功能。
新的中断函数语法 编译器现在接受 CCI 中断 (num) 说明符以指示 C 函数是中断处理程序。 说明符采用中断号,例如amp乐:#include void interrupt(SPI STC_ vect _num) spi Isr(void) { … }

修正问题

以下是对编译器所做的更正。 这些可能会修复生成的代码中的错误或将编译器的操作更改为用户指南预期或指定的操作。 副标题中的版本号表示包含以下问题修复程序的第一个编译器版本。 标题中括号内的标签是该问题在跟踪数据库中的标识。 如果您需要联系支持人员,这些可能会有用。

请注意,某些特定于设备的问题已在与设备关联的设备系列包 (DFP) 中得到纠正。 有关对 DFP 所做更改的信息以及下载最新包的信息,请参见 MPLAB 包管理器。

版本 2.40

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

版本 2.39(功能安全发布)

没有任何。

版本 2.36

延迟时出错 (XCS-2774) 默认自由模式优化中的微小变化阻止了操作数表达式不断折叠到延迟内置函数,导致它们被视为非接触并触发错误:_buil tin avr delay_ cycles expects ac ompile时间整型常量。

版本 2.35

使用 _at 的连续分配 (XCS-2653) 在具有相同名称的部分中连续分配多个对象位置并使用 at () 无法正常工作。 对于前ample: constchararrl [ ] at tri butte ((sect on(“.misses”))) at (Ox50 0 ) = {Oxo , Ox CD} ; cost char arr2[ ] at tri butte ((section(“.my s eke”))) = {Oxen, Ox FE }; 应该在假种皮之后立即放置 arr2。
指定段起始地址 (XCS-2650) -Wal, –section-start 选项默默地未能将节放置在指定的起始地址。 对于任何自定义命名的部分,此问题已得到修复; 但是,它不适用于任何标准部分,例如 . 文本或 . bss,必须使用 -Wl、-T 选项放置。
放松时链接器崩溃 (XCS-2647) 当启用 -relax 优化并且存在不适合可用内存的代码或数据部分时,链接器崩溃。 现在,在这种情况下,会发出错误消息。
EEPROM 访问错误 (XCS-2629) 当启用 -monist-data-in-proem 选项(这是默认状态)时,leproma _read_ 块例程无法在 Mega 设备上正常工作,导致无法正确读取 EEPROM 内存。
内存分配无效(XCS-2593、XCS-2651) 当 -Text 或 -Tata 链接器选项(例如ample passed through using a -Wl driver option) 被指定,相应的文本/数据区域原点被更新; 但是,结束地址没有相应调整,这可能导致该区域超出目标设备的内存范围。
无效的 ATtiny 中断代码 (XCS-2465) 当为 Tatin 设备构建并禁用优化 (-00) 时,中断函数可能会触发操作数超出范围的汇编程序消息。
选项未通过 (XCS-2452) 将 -Wl 选项与多个以逗号分隔的链接器选项一起使用时,并非所有链接器选项都被传递给链接器。
间接读取程序内存错误 (XCS-2450) 在某些情况下,编译器在从指向程序存储器的指针读取两字节值时产生内部错误(无法识别的 insn)

版本 2.32

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

版本 2.31

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

版本 2.30

概述后全局标签错位 (XCS-2299) 将全局标签放置在通过过程抽象分解出的汇编序列中的手写汇编代码可能没有被正确地重新定位。
轻松的崩溃 (XCS-2287) 使用 -merlad 选项可能会导致链接器在尾部跳转松弛优化尝试删除不在节末尾的 ret 指令时崩溃。
将标签优化为值时崩溃 (XCS-2282) 使用“Labels as values”GNU C 语言扩展的代码可能导致程序抽象优化崩溃,并出现 Outlined VMA range spans 修复错误。
不是那么常量 (XCS-2271) starts() 和其他函数的原型来自当禁用 -monist-data inprogmem 功能时,不再在返回的字符串指针上指定非标准成本限定符。 请注意,对于 avrxmega3 和 avertin 设备,此功能将永久启用。
丢失的初始值设定项 (XCS-2269) 当一个翻译单元中的多个变量被放置在一个部分中(使用部分或属性((部分))),并且第一个这样的变量被零初始化或没有初始化器,同一翻译单元中其他变量的初始化器被放置在同一部分的丢失了。

版本 2.29(功能安全发布)

没有任何。

版本 2.20

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

版本 2.19(功能安全发布)

没有任何。

版本 2.10

搬迁失败 (XCS-1891) 最合适的分配器是在链接器松弛后在部分之间留下内存“漏洞”。 除了内存碎片之外,这还增加了与 pc 相关的跳转或调用超出范围相关的链接器重定位失败的可能性。
指令未因松弛而改变 (XCS-1889) 跳转或调用指令不会发生链接器松弛,如果松弛,其目标将变得可达。
丢失的功能 (XCSE-388) 几个定义来自,例如clock_div_t和clock_prescale_set(),没有为设备定义,包括ATmega324PB、ATmega328PB、ATtiny441和ATtiny841。
缺少宏 预处理器宏_xcs_MODE_、_xcs VERSION、_xc 和 xcs 不是由编译器自动定义的。 这些现在可用。

版本 2.05

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

版本 2.00

没有任何。

已知问题

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

MPLAB X IDE 集成

MPLAB IDE 集成 如果要从 MPLAB IDE 使用编译器,则必须在安装编译器之前安装 MPLAB IDE。

代码生成

PA 内存分配失败 (XCS-2881) 使用过程抽象优化器时,当代码大小接近设备上的可用程序内存量时,链接器可能会报告内存分配错误,即使程序应该能够容纳可用空间也是如此。
不太聪明的 Smart-IO (XCS-2872) 如果 coast-data-in-proem 功能已被禁用,或者如果设备已将其所有闪存映射到数据存储器,则编译器的 smart-io 功能将为 sprint 功能生成有效但次优的代码。
更不智能的 Smart-IO (XCS-2869) 当同时使用 -floe 和 -fno-buil tin 选项时,编译器的 smart-io 功能将生成有效但次优的代码。
次优的只读数据放置 (XCS-2849) 链接器目前不知道 APPCODE 和 APPDATA 内存部分,也不知道内存映射中的 [No-]Read-While-Write 分区。 因此,链接器可能会在不合适的内存区域中分配只读数据的可能性很小。 如果启用了 coast-data-in-pragma 功能,特别是如果还启用了 coast-data-in-config-mapped-proem 功能,则数据错放的可能性会增加。 如果需要,可以禁用这些功能。
目的 file 加工订单 (XCS-2863) 对象的顺序 file链接器处理的 s 可能会因过程抽象优化(-mpa 选项)的使用而有所不同。 这只会影响跨多个模块定义弱函数的代码。
绝对链接器错误 (XCS-2777) 当某个对象在 RAM 开头的地址处成为绝对对象并且还定义了未初始化的对象时,可能会触发链接器错误。
短唤醒 ID (XCS-2775) 对于 ATA5700/2 设备,PHID0/1 寄存器仅定义为 16 位宽,而不是 32 位宽。
调用符号时链接器崩溃 (XCS-2758) 如果在源代码调用已使用 -Wl、–defsym 链接器选项定义的符号时使用 -merlad 驱动程序选项,链接器可能会崩溃。
初始化不正确 (XCS-2679) 某些全局/静态字节大小对象的初始值在数据存储器中的位置与运行时访问变量的位置之间存在差异。
启动错误设置为空 (XCS-2652) 如果通过 stated () 转换的主题字符串包含看似指数格式的浮点数,并且在 e 字符后有意外字符,则空地址(如果提供)将指向后面的字符e 而不是 e 本身。 对于前ample: stated(“hooey”, empty); 将导致空指向 x 字符。
错误的间接函数调用 (XCS-2628) 在某些情况下,通过作为结构的一部分存储的函数指针进行的函数调用可能会失败。
strtof 为十六进制浮点数返回零 (XCS-2626) 库函数 strtof() 等和 scanf() 等,总是将未指定指数的十六进制浮点数转换为
零。 对于前ample: 定子(“猫头鹰”, &empty); 将返回值 0,而不是 1。
堆栈顾问消息传递不准确(XCS-2542、XCS-2541) 在某些情况下,不会发出有关使用递归或不确定堆栈(可能通过使用 alloca())的堆栈顾问警告。
重复中断代码失败 (XCS-2421) 如果多个中断函数具有相同的函数体,编译器可能会将一个中断函数的输出调用另一个。 这将导致所有被调用破坏的寄存器被不必要地保存,甚至在当前中断处理程序的尾声运行之前中断将被启用,这可能导致代码失败。
Const 对象不在程序内存中 (XCS-2408) 对于 avrxmega3 和 avertins 项目,未理想化的 const 对象被放入数据存储器,即使警告表明它们已被放入程序存储器。 这不会影响没有程序内存映射到数据内存空间的设备,也不会影响任何初始化的对象。
DFP 路径无效的错误输出 (XCS-2376) 如果使用无效的 DFP 路径和“规范”调用编译器 file 所选设备存在,编译器不会报告缺少的设备系列包,而是选择“spec” file,这可能会导致无效输出。 “规格” files 可能不是最新的分布式 DFP,并且仅用于内部编译器测试。
未检测到内存重叠 (XCS-1966) 编译器未检测在某个地址(通过 at ())设为绝对地址的对象与使用 section () 说明符并链接到同一地址的其他对象的内存重叠。
库函数和 _meme 失败 (XCS-1763) 使用 _memo 地址空间中的参数调用边缘浮点函数可能会失败。 请注意,库例程是从某些 C 运算符调用的,因此,对于 example,以下代码受到影响:return regFloatVar > memxFloatVar;
有限的边缘实现 (AVRTC-731) 对于 ATTiny4/5/9/10/20/40 产品,边缘系统中的标准 C / 数学库实现非常有限或不存在。
程序内存限制 (AVRTC-732) 工具链支持超过 128 kb 的程序内存映像; 但是,在使用 -relax 选项时,有一些已知的链接器中止实例,没有松弛且没有有用的错误消息,而不是生成所需的函数存根。
名称空间限制 (AVRTC-733) 工具链支持命名地址空间,但要遵守用户指南特殊类型限定符部分中提到的限制。
时区 这库函数假定 GMT 并且不支持本地时区,因此本地时间 () 将返回与 gummite () 相同的时间,例如amp勒。

客户支持

file///应用程序/microehip/xc8/v 2 .40/docs/Read me_X C 8_ for A VR。 htm

文件/资源

MICROCHIP MPLAB XC8 C 编译器软件 [pdf] 用户手册
MPLAB XC8 C、MPLAB XC8 C 编译器软件、编译器软件、软件

参考

发表评论

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