日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 基礎(chǔ)知識(shí)科普站
[導(dǎo)讀]目前,各半導(dǎo)體廠(chǎng)商紛紛以之替代原有的8/16位MCU內(nèi)核,32位ARM MCU全面替代8/16位MCU已是大勢(shì)所趨。

引言

CortexM0/M0+是RISC類(lèi)型的低端ARM內(nèi)核,其指令集與高端ARM兼容,在性能、功耗和價(jià)格方面遠(yuǎn)優(yōu)于傳統(tǒng)的以8051、68S08/12等為代表的8/16位CISC(復(fù)雜指令流)CPU。目前,各半導(dǎo)體廠(chǎng)商紛紛以之替代原有的8/16位MCU內(nèi)核,32位ARM MCU全面替代8/16位MCU已是大勢(shì)所趨。

CortexM0+將CortexM0的3級(jí)流水線(xiàn)簡(jiǎn)化為2級(jí),并進(jìn)一步降低功耗、提高性能,這些優(yōu)點(diǎn)使得CortexM0+成為目前8/16位處理器較好的替代者。不過(guò)

替代8/16位MCU的低端ARM往往內(nèi)存資源非常有限,目前典型的CortexM0/M0+ MCU往往僅有2 KB、4 KB或8 KB,最多16 KB片內(nèi)RAM。Flash一般也不大于64KB。對(duì)這類(lèi)MCU編程,使用短指針變量就夠了。而目前ARM處理器的集成開(kāi)發(fā)環(huán)境(IDE)中的C編譯器,延續(xù)CortexM3/M4的使用傳統(tǒng),仍使用32位長(zhǎng)指針變量。這無(wú)形中多占用了1倍的RAM資源。這里以飛思卡爾ARM CortexM0+處理器中的Kinetis 系列MCU為例,說(shuō)明如何使用16位短指針替代32位長(zhǎng)指針,以便在將原有的以8/16位MCU為核心的產(chǎn)品升級(jí)到采用32位ARM內(nèi)核時(shí),不增加系統(tǒng)開(kāi)銷(xiāo)。特別是若使用了實(shí)時(shí)操作系統(tǒng),系統(tǒng)的內(nèi)存會(huì)更加緊張。在專(zhuān)門(mén)面向CortexM0/M0+的集成開(kāi)發(fā)環(huán)境(IDE)推出前,可使用本文提供的替換方法,以降低系統(tǒng)的RAM開(kāi)銷(xiāo),提升系統(tǒng)的性能。

ARM-CortexM0/M0+單片機(jī)的指針變量替換方法

1 指針替換原理

32位ARM內(nèi)核的內(nèi)部寄存器都是32位的,其尋址空間可以達(dá)到4 GB,通常也應(yīng)使用32位的地址指針。但在數(shù)據(jù)空間、程序空間和I/O空間都不大于64 KB的情況下,可以采用1個(gè)32位基地址加1個(gè)16位偏移量的方法,合成ARM需要的長(zhǎng)指針。

以CortexM0+為內(nèi)核的MCU,其SRAM、FLASH很少超過(guò)64 KB,一般使用16位的偏移量指針就能滿(mǎn)足需要。

以Freescale公司的KL25Z128 MCU為例,有16 KB SRAM和128 KB FLASH存儲(chǔ)空間。其SRAM的地址范圍是0x1FFF_F000~0x2000_2FFF[1],使用16位的偏移量指針便可以滿(mǎn)足尋址范圍的要求。

圖1說(shuō)明了長(zhǎng)指針替換方法的基本原理,通過(guò)使用一個(gè)32位的RAM基地址,完成原始32位絕對(duì)地址與相對(duì)基地址的16位相對(duì)偏移地址的相互轉(zhuǎn)化。

其轉(zhuǎn)化關(guān)系如下所示:

Address_32bits=Address_16bits+Address_base(1)

Address_16bits=Address_32bits-Address_base(2)

對(duì)于KL25Z128 ,Address_base基地址值可選擇為0x1FFF_F000。通過(guò)以上方法的轉(zhuǎn)化,32位的地址空間0x1FFF_F000~0x2000_2FFF(16 KB)可以轉(zhuǎn)化為16位的地址空間0x0000~0x3FFF(16 KB)。

2 指針替換方案

2.1 常量形式實(shí)現(xiàn)方案

以下使用Freescale公司推薦的IDE CodeWarrior v10.5予以說(shuō)明。

typedef unsigned short pointer_16;

#define address_base 0x1ffff000Lu

/*定義基地址*/

#define addr_16(pt_addr_32)((unsigned short)((unsignedint)pt_addr_32 - address_base))

/*32位地址指針轉(zhuǎn)換為16位地址“指針”*/

#define addr_32(pt_addr_16)((unsigned int)((unsigned int)pt_addr_16 + address_base))

/*16位地址“指針”轉(zhuǎn)換為32位地址“指針”*/

程序中利用宏定義了一個(gè)32位常數(shù)的基地址,顯然也可以使用一個(gè)全局變量或寄存器變量來(lái)存儲(chǔ)基地址。在將長(zhǎng)指針變量pt_addr_32轉(zhuǎn)化為16位地址“指針”時(shí),需先將指針變量pt_addr_32做強(qiáng)制類(lèi)型轉(zhuǎn)化,變?yōu)?2位無(wú)符號(hào)數(shù)后再進(jìn)行基地址扣除的計(jì)算。該段代碼還聲明了一個(gè)16位無(wú)符號(hào)數(shù)的數(shù)據(jù)類(lèi)型pointer_16,用來(lái)定義或存儲(chǔ)16位地址偏移量,例如使用如下語(yǔ)句來(lái)定義一個(gè)16位的指針變量:

pointer_16 pt16_data = addr_16(&data);

pt16_data的值便是指向data的16位“指針”(轉(zhuǎn)化而成的16位地址偏移量值),編譯器編譯出的匯編代碼如下所示:

69pt16_data = addr_16(&data);

00000a06:ldr r3,[pc,#72]//R3指向data

00000a08:uxth r2,r3//16位 R3送32位 R2

00000a0a:adds r3,r7,#4//R3指向pt16_data

00000a0c:movs r1,#128//R1 = 0x80

00000a0e:lsls r1,r1,#5//生成基地址補(bǔ)碼

00000a10:adds r2,r2,r1//R2=32位指針-基地址

00000a12:strh r2,[r3,#0]//存儲(chǔ)R2低16位

00000a50:1FFF_F020//存儲(chǔ)data地址

需要將16位地址轉(zhuǎn)化為長(zhǎng)指針時(shí),以下面的整型數(shù)據(jù)賦值操作為例:

int temp = *(int*) (addr_32(pt16_data));

數(shù)據(jù)data的值賦值給了變量temp,其中int數(shù)據(jù)類(lèi)型可以替換成任意其他的數(shù)據(jù)類(lèi)型(例如unsigned int、unsigned short、short、unsigned char、char等)。

2.2 高組寄存器優(yōu)化方案

CortexM系列內(nèi)核是專(zhuān)門(mén)為ARM MCU設(shè)計(jì)的,僅支持無(wú)條件執(zhí)行的Thumb指令。CortexM0/M0+使用ARMv6指令集,而CortexM3/M4使用ARMv7指令集。ARMv6 對(duì)ARMv7做了高度簡(jiǎn)化,僅保留了其中56條指令。指令中除個(gè)別32位指令外,都是16位指令。CortexM0/M0+的內(nèi)部寄存器結(jié)構(gòu)與高端ARM兼容,但低端MCU應(yīng)用往往不需要那么多寄存器,CortexM0/M0+僅提供了R0~R12共13個(gè)通用寄存器。這些通用寄存器分為兩部分:低組寄存器(Low registers,R0~R7),高組寄存器(High registers,R8~R12)[2]。CortexM0/M0+犧牲了大量面向高組寄存器的指令,盡量減少32位指令的使用。實(shí)際上CortexM0/M0+的指令集中僅有以下3條指令支持高組寄存器R8~R12:

MOV ,;寄存器間數(shù)據(jù)傳送

ADD, ;基地址+偏移量

CMP, ;地址的比較

這里Rd和Rm之一可以是高組寄存器??梢钥闯觯瑢?duì)于高組寄存器,ARMv6僅保留了高低組寄存器間數(shù)據(jù)傳遞、不影響標(biāo)志位的加法運(yùn)算和單獨(dú)的地址比較這3種操作,其用處顯然是為了支持將高組寄存器用于地址運(yùn)算。

ARM-CortexM0/M0+單片機(jī)的指針變量替換方法

目前基于gcc的主流ARMC編譯器對(duì)CortexM0/M0+的高組寄存器采取盡量不予使用的策略,在定義指針變量時(shí),僅使用長(zhǎng)指針。而分析ARMv6指令集的設(shè)計(jì)初衷,顯然應(yīng)該用高組寄存器和相關(guān)指令。這對(duì)于旨在替代8/16位MCU的低成本ARM器件非常必要。

實(shí)際上,應(yīng)用程序中可通過(guò)MOV指令將R8~R11初始化成“寄存器常數(shù)”,而以后不再改變它們的值。例如可以令:

R8,= 0用于低寄存器的快速清零

R9,=RAM基地址用于拼接長(zhǎng)指針

R10,= I/O模塊基地址

R11,=庫(kù)函數(shù)基地址

當(dāng)FLASH存儲(chǔ)器空間不大于64 KB時(shí),函數(shù)指針無(wú)需設(shè)定基地址,可以直接使用低16位作為16位指針。對(duì)于超過(guò)64 KB的FLASH,可以使用庫(kù)函數(shù)基地址,采用類(lèi)似分頁(yè)的方法實(shí)現(xiàn)16位指針替換。

最后一個(gè)高組寄存器R12可在響應(yīng)中斷時(shí)和R0~R3,PC、SP一同自動(dòng)入棧,是用戶(hù)可以使用的寄存器變量。

2.1節(jié)中提出的宏定義方案形式上簡(jiǎn)單清楚,但展開(kāi)后需要多條指令才能完成。將Address_base作為寄存器變量,存放在R8~R12中的某個(gè)高組寄存器中,而不是使用宏定義常量或全局變量。由于C語(yǔ)言不能直接對(duì)通用寄存器進(jìn)行操作,需通過(guò)將匯編嵌入到C語(yǔ)言中實(shí)現(xiàn)長(zhǎng)指針的替換。在程序初始化時(shí),將R8~R12中的一個(gè)寄存器初始化為Address_base的值,例如下面給出的語(yǔ)句:

asm("LDR r1, =0x1ffff000"); //R1=基地址

asm("MOV R9, R1"); //R9=R1,即基地址

R9寄存器初始化后無(wú)需再修改,是一個(gè)“寄存器常數(shù)”。對(duì)于已經(jīng)存儲(chǔ)在R0中的長(zhǎng)指針,則使用如下匯編代碼,很容易將其轉(zhuǎn)化為16位地址:

asm("MOV R1, R9");//R1=基地址

asm("SUB R0, R0, R1"); //R0=R0-R1,R0低16位即16位

//短指針值

代碼首先將R9寄存器存儲(chǔ)的基地址轉(zhuǎn)移到R1寄存器,隨后利用單條指令完成從R0寄存器所存長(zhǎng)指針值減去R1中存儲(chǔ)的基地址,并將所得結(jié)果保存在R0中。執(zhí)行完成后,R0低16位便是轉(zhuǎn)化后的16位地址。16位地址轉(zhuǎn)化為長(zhǎng)指針是類(lèi)似的轉(zhuǎn)化形式(SUB指令換為ADD指令),在此不再贅述。這種方法充分利用了內(nèi)核提供的高組寄存器,并且簡(jiǎn)化了指針轉(zhuǎn)化的算法,減少了所需指令的數(shù)目,提高了運(yùn)行效率,縮短了轉(zhuǎn)換時(shí)間,降低MCU因指針替換而產(chǎn)生的時(shí)間損失。轉(zhuǎn)換所需指令數(shù)目也壓縮到兩條,減少轉(zhuǎn)換過(guò)程所帶來(lái)的額外指令代碼的存儲(chǔ)空間開(kāi)銷(xiāo)。

3 指針替換結(jié)果

μC/OS(含μC/OSII、μC/OSIII)是適用于低成本MCU的多任務(wù)實(shí)時(shí)內(nèi)核。以μC/OS為例,當(dāng)最大任務(wù)數(shù)為10時(shí),整個(gè)內(nèi)核需使用12個(gè)全局指針型變量,而非指針型變量?jī)H需占用8字節(jié)RAM空間。若使用默認(rèn)的長(zhǎng)指針模式,共需12×4+8=56字節(jié);若改用短指針,則需使用12×2+8=32字節(jié)。任務(wù)數(shù)目、任務(wù)間通信機(jī)制增多時(shí),指針變量的使用將更頻繁,本文介紹的方法所節(jié)約的RAM空間也更加顯著。在CortexM0/M0+處理器替代8/16位MCU的應(yīng)用中,非常有必要使用短指針。

最新版本的μC/OSIII針對(duì)帶有計(jì)算前導(dǎo)零硬件指令(CLZ)的CortexM3/M4處理器進(jìn)行了重大改進(jìn),提高了其優(yōu)先級(jí)任務(wù)搜索的效率。但CortexM0/M0+的ARMv6指令集簡(jiǎn)化掉了CLZ指令,故不適宜使用μC/OSIII。這里以運(yùn)行μC/OSII v2.92(最多256個(gè)任務(wù))為例,說(shuō)明指針替換效果。實(shí)際上對(duì)于內(nèi)存緊張的MCU,μC/OSII v2.82及以下的版本(最多64個(gè)任務(wù))就足夠用了。

μC/OSII每個(gè)任務(wù)都需要使用任務(wù)控制塊TCB(Task Control Block)的數(shù)據(jù)結(jié)構(gòu),來(lái)維護(hù)任務(wù)相關(guān)的信息[3]。在μC/OSII v2.92中,每個(gè)任務(wù)的TCB數(shù)據(jù)結(jié)構(gòu)包含9個(gè)指針變量,采用本文描述的16位指針替換方法后,每個(gè)任務(wù)控制塊均可以節(jié)省18字節(jié)的RAM空間。在μC/OSII中還存在很多數(shù)據(jù)結(jié)構(gòu),均包含著大量的指針變量。這些數(shù)據(jù)結(jié)構(gòu)采用本文描述的方法所節(jié)約的RAM空間如表1所列。

表1 μC/OSII數(shù)據(jù)結(jié)構(gòu)內(nèi)存占用情況對(duì)比

注:其中X為OS_LOWEST_PRIO,由用戶(hù)進(jìn)行配置,典型值為63。表中內(nèi)存占用大小是筆者根據(jù)ucos_ii.h文件進(jìn)行統(tǒng)計(jì)的,實(shí)際占用內(nèi)存可能會(huì)由于用戶(hù)配置不同而略有差異。

可以看出,以16位短指針替代ARM編譯器默認(rèn)的32位長(zhǎng)

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉