chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探索ARM CPU架構(gòu)的美妙以及C語(yǔ)言編譯器的奧秘

strongerHuang ? 來(lái)源:Mculover666 ? 作者:Mculover666 ? 2021-06-06 18:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

筆者接觸嵌入式領(lǐng)域軟件開發(fā)以來(lái),幾乎用的都是 ARM Cortex M 內(nèi)核系列的微控制器。感謝C語(yǔ)言編譯器的存在,讓我不用接觸匯編即可進(jìn)行開發(fā),但是彷佛也錯(cuò)過了一些風(fēng)景,沒有領(lǐng)域到編譯器之美和CPU之美,所以決定周末無(wú)聊的休息時(shí)間通過尋找資料、動(dòng)手實(shí)驗(yàn)、得出結(jié)論的方法來(lái)探索 ARM CPU 架構(gòu)的美妙,以及C語(yǔ)言編譯器的奧秘。(因?yàn)槲覀€(gè)人實(shí)在是不贊同學(xué)校中微機(jī)原理類課程的教學(xué)方法)。

ARM探索之旅 01 | 帶你認(rèn)識(shí)ARM Cortex-M陣營(yíng)

ARM探索之旅 02 | ARM Cortex-M 用什么指令集?

一、浮點(diǎn)數(shù)的存儲(chǔ)

浮點(diǎn)數(shù)按照 IEEE 754 標(biāo)準(zhǔn)存儲(chǔ)在計(jì)算機(jī)中,ARM浮點(diǎn)環(huán)境是遵循「IEEE 754-1985」標(biāo)準(zhǔn)實(shí)現(xiàn)的。

IEEE 754 標(biāo)準(zhǔn)規(guī)定浮點(diǎn)數(shù)的存儲(chǔ)格式有三個(gè)域

sign:符號(hào)位,0表示正數(shù)、1表示負(fù)數(shù);

exponent:二進(jìn)制小數(shù)的指數(shù)值編碼;

fraction:二進(jìn)制小數(shù)的有效值編碼;

具體的編碼規(guī)則過多,本文重點(diǎn)不在此,不再展開,感興趣可以閱讀我之前的文章:浮點(diǎn)數(shù)在計(jì)算機(jī)中的存儲(chǔ) —— IEEE 754標(biāo)準(zhǔn)[1](可點(diǎn)擊閱讀原文查看)。

二、浮點(diǎn)支持軟件庫(kù)fplib

1. fplib介紹

ARM Cortex-M處理器中計(jì)算浮點(diǎn)數(shù)的方式有軟件和硬件兩種。

對(duì)于不帶 FPU 的處理器,ARM提供了一個(gè)「浮點(diǎn)支持軟件庫(kù)」用于計(jì)算浮點(diǎn)數(shù):fplib。

fplib提供的 API 以__aeabi開頭,比如:

__aeabi_fadd:計(jì)算兩個(gè)float型浮點(diǎn)數(shù)(float占4個(gè)字節(jié),32位)

__aeabi_dadd:計(jì)算兩個(gè)double型浮點(diǎn)數(shù)(double占8個(gè)字節(jié),64位)

__aeabi_f2d:float型轉(zhuǎn)為double型

__aeabi_d2f:double型轉(zhuǎn)為float型

除此之外,fplib庫(kù)還提供取余、開方等非常多的浮點(diǎn)數(shù)操作函數(shù),如有興趣可以查閱文末我列出的參考文檔[2]。

2. 測(cè)試代碼與優(yōu)化等級(jí)

編寫如下測(cè)試代碼:

float a = 5.625; float b = 5.625; float res_add, res_sub, res_mul, res_div; res_add = a + b; res_sub = a - b; res_mul = a * b; res_div = a / b; printf(“res_add = %f ”, res_add); printf(“res_sub = %f ”, res_sub); printf(“res_mul = %f ”, res_mul); printf(“res_div = %f ”, res_div);

?

使用這段測(cè)試代碼,「編譯器優(yōu)化等級(jí)推薦設(shè)置為-O0」,否則聰明的編譯器會(huì)直接將結(jié)果計(jì)算出來(lái)編譯到程序中,我們就沒法研究了。

?

3. armcc測(cè)試結(jié)果

這節(jié)我們驗(yàn)證是否ARM使用 fplib 庫(kù)來(lái)計(jì)算浮點(diǎn)數(shù),在設(shè)置中關(guān)閉FPU:

使用MDK編譯之后,進(jìn)入調(diào)試模式查看反匯編結(jié)果。

在反匯編中可以看到,變量a是float類型,所以編譯器分配了一個(gè)寄存器用于存儲(chǔ)值:

查看0x080031C4處的值,小端存儲(chǔ)模式下(低位在低地址),變量a的值是0x40B40000,存儲(chǔ)方式符合IEEE 754標(biāo)準(zhǔn)。

再來(lái)看看浮點(diǎn)數(shù)運(yùn)算操作的反匯編結(jié)果,果然調(diào)用fplib庫(kù)提供的函數(shù)完成浮點(diǎn)數(shù)的操作:這里還有一個(gè)有趣的小細(xì)節(jié),在反匯編中可以看到「使用 %f 占位符打印浮點(diǎn)數(shù)時(shí),printf是按照double型傳參的」:

4. arm-none-eabi-gcc測(cè)試結(jié)果

使用STM32CubeMX生成makeifle工程,修改makeifle中的等級(jí)為-O0,設(shè)置為軟件浮點(diǎn)計(jì)算:另外還需要注意,默認(rèn)gcc編譯時(shí)不支持printf打印浮點(diǎn)數(shù),需要在 makefile 中手動(dòng)加入以下鏈接選項(xiàng):

LDFLAGS += -u _printf_float

編譯完成之后進(jìn)行反匯編(注意文件名):

arm-none-eabi-objdump -s -d build/usart1-fpu-test.elf 》 build/usart1-fpu-test.dis

同樣,在反匯編文件中即可找到浮點(diǎn)計(jì)算代碼:

三、使用 ARM FPU 加速浮點(diǎn)計(jì)算

1. ARM FPU的魅力

FPU(Floating Point Unit,浮點(diǎn)單元)是ARM內(nèi)核中的硬件外設(shè),用于硬件計(jì)算浮點(diǎn)數(shù),要想使用FPU計(jì)算浮點(diǎn)數(shù),需要程序和編譯器配合。

在程序中使能/開啟FPU硬件外設(shè),「使 FPU 硬件可以正常工作」;

在編譯器中設(shè)置使用FPU,編譯器會(huì)將所有浮點(diǎn)計(jì)算的代碼都編譯為「使用FPU操作指令完成」。

目前Cortex-M4、Cortex-M7、Cortex-M33、Cortex-M35P、Cortex-M55處理器中都具備FPU硬件。

在上一節(jié)中我們使用fplib軟件庫(kù)來(lái)計(jì)算浮點(diǎn)數(shù),但是fplib終歸還是軟件方式,每個(gè)計(jì)算函數(shù)的實(shí)現(xiàn)都是通過很多的指令去完成計(jì)算,并且最終的程序中還會(huì)把函數(shù)鏈接進(jìn)可執(zhí)行程序,導(dǎo)致程序體積變大。

「ARM FPU的魅力在于,浮點(diǎn)計(jì)算可以通過簡(jiǎn)單的FPU操作指令去完成,相比之下,不僅計(jì)算快,也不會(huì)增大程序體積?!?/p>

2. 如何使能FPU硬件

ARM Cortex - M4內(nèi)核中將 FPU 作為協(xié)處理器設(shè)計(jì)的,所以通過設(shè)置協(xié)處理器訪問控制(CPACR,Co-processor access control register)來(lái)控制是否使能FPU。

復(fù)位之后CP11=0、CP10=0,默認(rèn)禁止訪問FPU,因?yàn)檫@是Cortex-M內(nèi)核的外設(shè),寄存器定義CMSIS-Core中,所以可以直接通過下面這行代碼設(shè)置CP11=1、CP10=1來(lái)允許訪問FPU:

SCB-》CPACR = 0x00F00000; // Enable the floating point unit for full access

無(wú)論是STM32 HAL庫(kù)還是標(biāo)準(zhǔn)庫(kù),在SystemInit()函數(shù)中已經(jīng)存在使能代碼,通過__FPU_PRESENT和__FPU_USED來(lái)控制:

/* FPU settings ------------------------------------------------------------*/ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB-》CPACR |= ((3UL 《《 10*2)|(3UL 《《 11*2)); /* set CP10 and CP11 Full Access */ #endif

并且,在頭文件 stm32l431xx.h 中已經(jīng)使能__FPU_PRESENT宏定義:__FPU_PRESENT宏定義是一直使能的,那么如何來(lái)控制FPU的使能呢?

別忘了還有一個(gè)宏定義__FPU_USED,這是留給編譯器來(lái)控制的!

3. ARMCC編譯器如何開啟FPU

MDK編譯器開啟FPU的方法非常簡(jiǎn)單,如圖:在MDK中使能FPU,一方面編譯器會(huì)設(shè)置宏定義__FPU_USED == 1,不放心的話可以在任意位置添加下面的預(yù)處理代碼,分別在使用/不使用的情況編譯一下,查看編譯器輸出結(jié)果:

#if __FPU_USED == 1 #error “ok!” #endif

另一方面,編譯器在編譯的時(shí)候,會(huì)將所有的浮點(diǎn)運(yùn)算都編譯為使用FPU操作指令去完成

4. gcc編譯器如何開啟FPU

在Makefile中加入以下gcc編譯設(shè)置項(xiàng):

# fpu FPU = -mfpu=fpv4-sp-d16 # float-abi FLOAT-ABI = -mfloat-abi=hard

ABI是應(yīng)用程序二進(jìn)制接口(Application Binary Interface),-mfloat-abi用來(lái)指定使用哪種方式:

soft:使用CPU寄存器組+軟件庫(kù)(fplib)完成浮點(diǎn)操作;

softfp:使用CPU寄存組+FPU硬件+軟件庫(kù)完成浮點(diǎn)操作;

hard:使用FPU寄存器組+FPU硬件+軟件庫(kù)完成浮點(diǎn)操作;

mfpu選項(xiàng)用來(lái)指定FPU架構(gòu),具體值可以閱讀我在文末給出的參考文檔,本文所使用的值fpv4-sp-d16,意味著僅僅使能Armv7 FPv4-SP-D16 單精度浮點(diǎn)單元擴(kuò)展。

同樣,對(duì)之前的測(cè)試代碼編譯,查看反匯編結(jié)果,可以看到使用了浮點(diǎn)操作全部使用了FPU相關(guān)指令。

四、使用Julia測(cè)試FPU加速性能

1. 測(cè)試準(zhǔn)備

需要準(zhǔn)備一份裸機(jī)工程,具有屏幕打點(diǎn)顯示功能和串口打印功能。

參考:STM32CubeMX_17 | 使用硬件SPI驅(qū)動(dòng)TFT-LCD(ST7789)。

2. 移植Julia分形測(cè)試代碼

Julia測(cè)試是通過計(jì)算幾幀Julia分形的數(shù)據(jù)來(lái)測(cè)試單精度浮點(diǎn)運(yùn)算的性能,測(cè)試代碼參考正點(diǎn)原子,如下:

/* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ #define ITERATION 128 //迭代次數(shù) #define REAL_CONSTANT 0.285f //實(shí)部常量 #define IMG_CONSTANT 0.01f //虛部常量 //顏色表 uint16_t color_map[ITERATION]; //縮放因子列表 const uint16_t zoom_ratio[] = { 120, 110, 100, 150, 200, 275, 350, 450, 600, 800, 1000, 1200, 1500, 2000, 1500, 1200, 1000, 800, 600, 450, 350, 275, 200, 150, 100, 110, }; //初始化顏色表 //clut:顏色表指針 void InitCLUT(uint16_t * clut) { uint32_t i = 0x00; uint16_t red = 0, green = 0, blue = 0; for (i = 0;i 《 ITERATION; i++) { //產(chǎn)生 RGB 顏色值 red = (i*8*256/ITERATION) % 256;

green = (i*6*256/ITERATION) % 256; blue = (i*4*256 /ITERATION) % 256;

//將 RGB888,轉(zhuǎn)換為 RGB565 red = red 》》 3; red = red 《《 11; green = green 》》 2; green = green 《《 5; blue = blue 》》 3; clut[i] = red + green + blue; } } //產(chǎn)生 Julia 分形圖形 //size_x,size_y:屏幕 x,y 方向的尺寸 //offset_x,offset_y:屏幕 x,y 方向的偏移 //zoom:縮放因子 void GenerateJulia_fpu(uint16_t size_x,uint16_t size_y,uint16_t offset_x,uint16_t offset_y,uint16_t zoom) { uint8_t i; uint16_t x,y; float tmp1,tmp2; float num_real,num_img; float radius; for (y = 0; y 《 size_y; y++) { for (x = 0; x 《 size_x; x++) { num_real = y - offset_y; num_real = num_real / zoom; num_img = x-offset_x;

num_img = num_img / zoom; i = 0; radius = 0; while ((i 《 ITERATION-1) && (radius 《 4)) { tmp1 = num_real * num_real;

tmp2 = num_img * num_img; num_img = 2*num_real*num_img + IMG_CONSTANT; num_real = tmp1 - tmp2 + REAL_CONSTANT;

radius = tmp1 + tmp2; i++; } //繪制到屏幕 lcd_draw_color_point(x, y, color_map[i]); } } } /* USER CODE END 0 */

在main函數(shù)中創(chuàng)建一些需要的變量:

/* USER CODE BEGIN 1 */ uint8_t zoom_index = 0; uint32_t start_time = 0, end_time = 0; /* USER CODE END 1 */

調(diào)用初始化函數(shù):

/* USER CODE BEGIN 2 */ printf(“Julia test by Mculover666 ”); lcd_init(); //初始化顏色表 InitCLUT(color_map); /* USER CODE END 2 */

調(diào)用測(cè)試函數(shù):

/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ start_time = HAL_GetTick(); GenerateJulia_fpu(240, 240, 120, 120, zoom_ratio[zoom_index]); end_time = HAL_GetTick(); printf(“diff time is %d ms ”, end_time - start_time); zoom_index++; if (zoom_index 》 sizeof(zoom_ratio)) { zoom_index = 0; } } /* USER CODE END 3 */

3. 測(cè)試結(jié)果

使用-O2優(yōu)化等級(jí),在不開 FPU 的情況下,「顯示一幀平均需要11s左右」:程序大小情況:

d4847f56-c55a-11eb-9e57-12bb97331649.png

使用-O2優(yōu)化等級(jí),在開啟 FPU 的情況下,「顯示一幀平均需要4s左右」:程序大小情況:

d4ebf7da-c55a-11eb-9e57-12bb97331649.png

最后放上好看的Julia分形圖:

原文標(biāo)題:揭秘ARM FPU 加速浮點(diǎn)計(jì)算

文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    135

    文章

    9536

    瀏覽量

    390325
  • 嵌入式
    +關(guān)注

    關(guān)注

    5193

    文章

    20276

    瀏覽量

    331730
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7642

    瀏覽量

    145126

原文標(biāo)題:揭秘ARM FPU 加速浮點(diǎn)計(jì)算

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C編譯器錯(cuò)誤與解決方法

    C語(yǔ)言keil編譯器提示錯(cuò)誤的解決方法,可以幫你解決程序編譯中的煩惱!! C編譯器錯(cuò)誤與解決方
    發(fā)表于 01-22 08:03

    C語(yǔ)言C++之間的區(qū)別是什么

    C++的標(biāo)準(zhǔn)庫(kù)那樣集成度高和功能齊全。 6、編譯器語(yǔ)言特性: C++編譯器通常比C
    發(fā)表于 12-11 06:23

    開源鴻蒙技術(shù)大會(huì)2025丨編譯器與編程語(yǔ)言分論壇:語(yǔ)言驅(qū)動(dòng)系統(tǒng)創(chuàng)新,編譯賦能生態(tài)繁榮

    在萬(wàn)物智聯(lián)的時(shí)代背景下,操作系統(tǒng)底層能力的構(gòu)建離不開編程語(yǔ)言編譯器的關(guān)鍵支撐。作為開源鴻蒙生態(tài)的核心技術(shù),語(yǔ)言設(shè)計(jì)與編譯器、虛擬機(jī)實(shí)現(xiàn)的進(jìn)步直接關(guān)系到開發(fā)效率、運(yùn)行性能與系統(tǒng)安全。本
    的頭像 發(fā)表于 11-20 17:24 ?748次閱讀
    開源鴻蒙技術(shù)大會(huì)2025丨<b class='flag-5'>編譯器</b>與編程<b class='flag-5'>語(yǔ)言</b>分論壇:<b class='flag-5'>語(yǔ)言</b>驅(qū)動(dòng)系統(tǒng)創(chuàng)新,<b class='flag-5'>編譯</b>賦能生態(tài)繁榮

    C語(yǔ)言和單片機(jī)C語(yǔ)言有什么差異

    成匯編語(yǔ)言機(jī)器才能讀懂,所以每個(gè)平臺(tái)的編譯器編譯成對(duì)應(yīng)平臺(tái)匯編的程序,每個(gè)平臺(tái)的匯編不一樣,當(dāng)然編譯器也不一樣。 DOS上的TC2 TC3 WINDOWS上的VC 8051的
    發(fā)表于 11-14 07:55

    Arm Neoverse CPU上大代碼量Java應(yīng)用的性能測(cè)試

    Java 是互聯(lián)網(wǎng)領(lǐng)域廣泛使用的編程語(yǔ)言。Java 應(yīng)用的一些特性使其性能表現(xiàn)與提前編譯的原生應(yīng)用(例如 C 程序)大相徑庭。由于 Java 字節(jié)碼無(wú)法直接在 CPU 上執(zhí)行,因此通常
    的頭像 發(fā)表于 11-05 11:25 ?623次閱讀
    <b class='flag-5'>Arm</b> Neoverse <b class='flag-5'>CPU</b>上大代碼量Java應(yīng)用的性能測(cè)試

    請(qǐng)問如何在keil μVision 5上進(jìn)行ARM編譯器的代碼優(yōu)化?

    如何在keil μVision 5上進(jìn)行ARM編譯器的代碼優(yōu)化?
    發(fā)表于 08-20 07:37

    如何在Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6?

    在Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6!
    發(fā)表于 08-20 06:29

    探索CPU架構(gòu)奧秘,揭秘高性能計(jì)算的隱形引擎

    本文轉(zhuǎn)自:綠算技術(shù)CPU的內(nèi)部工作原理:指令周期的精密舞蹈CPU,這顆無(wú)形的“心臟”,默默地驅(qū)動(dòng)著每一臺(tái)智能設(shè)備的脈動(dòng)。它不僅是數(shù)據(jù)的處理中心,更是智慧與效率的源泉。今天與大家一同潛入CPU
    的頭像 發(fā)表于 08-13 11:58 ?692次閱讀
    <b class='flag-5'>探索</b><b class='flag-5'>CPU</b><b class='flag-5'>架構(gòu)</b>的<b class='flag-5'>奧秘</b>,揭秘高性能計(jì)算的隱形引擎

    進(jìn)迭時(shí)空同構(gòu)融合RISC-V AI CPU的Triton算子編譯器實(shí)踐

    Triton是由OpenAI開發(fā)的一個(gè)開源編程語(yǔ)言編譯器,旨在簡(jiǎn)化高性能GPU內(nèi)核的編寫。它提供了類似Python的語(yǔ)法,并通過高級(jí)抽象降低了GPU編程的復(fù)雜性,同時(shí)保持了高性能。目前
    的頭像 發(fā)表于 07-15 09:04 ?1659次閱讀
    進(jìn)迭時(shí)空同構(gòu)融合RISC-V AI <b class='flag-5'>CPU</b>的Triton算子<b class='flag-5'>編譯器</b>實(shí)踐

    邊緣設(shè)備AI部署:編譯器如何實(shí)現(xiàn)輕量化與高性能?

    電子發(fā)燒友網(wǎng)綜合報(bào)道 AI編譯器是專門為人工智能(AI)和機(jī)器學(xué)習(xí)(ML)模型設(shè)計(jì)的編譯器,其核心目標(biāo)是將高級(jí)的AI模型描述(如計(jì)算圖、神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu))轉(zhuǎn)換為特定硬件平臺(tái)(如CPU、GPU、FPGA
    的頭像 發(fā)表于 07-06 05:49 ?6394次閱讀

    RISC-V架構(gòu)下的編譯器自動(dòng)向量化

    進(jìn)迭時(shí)空專注于研發(fā)基于RISC-V的高性能新AICPU,對(duì)于充分發(fā)揮CPU核的性能而言,編譯器是不可或缺的一環(huán),而在AI時(shí)代,毫無(wú)疑問向量算力將發(fā)揮越來(lái)越重要的作用。進(jìn)迭時(shí)空非常重視RISC-V
    的頭像 發(fā)表于 06-06 16:59 ?1093次閱讀
    RISC-V<b class='flag-5'>架構(gòu)</b>下的<b class='flag-5'>編譯器</b>自動(dòng)向量化

    TASKING編譯器全面支持紫光同芯THA6 Gen2系列產(chǎn)品

    近日,TASKING 針對(duì)Arm架構(gòu)編譯器平臺(tái)VX-toolset for Arm迎來(lái)了全新升級(jí),最新版本VX-toolset for Arm
    的頭像 發(fā)表于 04-03 17:12 ?1223次閱讀

    HighTec編譯器全面適配紫光同芯THA6 Gen2系列產(chǎn)品

    近日,紫光同芯與全球領(lǐng)先的汽車級(jí)C/C++編譯器供應(yīng)商HighTec共同宣布,HighTec編譯器完成對(duì)紫光同芯THA6 Gen2系列產(chǎn)品的全面適配。此次合作實(shí)現(xiàn)了從指令集優(yōu)化到功能安
    的頭像 發(fā)表于 04-02 09:42 ?1005次閱讀

    探索交流單相線材連接濾波奧秘

    探索交流單相線材連接濾波奧秘
    的頭像 發(fā)表于 03-04 15:58 ?783次閱讀

    適用于PIC MCU的MPLAB XC8 C編譯器用戶指南

    電子發(fā)燒友網(wǎng)站提供《適用于PIC MCU的MPLAB XC8 C編譯器用戶指南.pdf》資料免費(fèi)下載
    發(fā)表于 01-22 16:45 ?0次下載
    適用于PIC MCU的MPLAB XC8 <b class='flag-5'>C</b><b class='flag-5'>編譯器</b>用戶指南