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) 如果啟用了 cost-in-proem 功能並且字符串文字的地址顯式轉換為數據地址空間(刪除 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 編譯器軟件、編譯器軟件、軟件

參考

發表評論

您的電子郵件地址不會被公開。 必填欄位已標記 *