<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM Cortex―M0/M0+單片機的指針變量替換方法

ARM Cortex―M0/M0+單片機的指針變量替換方法

作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:32位ARM Cortex-M0/M0+內核定位于“全面替代”各類(lèi)8/16位微控制器(MCU)內核,其硬件設計支持使用16位短指針變量。目前主流的ARM編譯器僅使用32位長(cháng)指針變量,這對于資源有限的MCU來(lái)說(shuō)十分浪費。為了優(yōu)化指針變量的使用方式、節約資源,本文給出一種替換長(cháng)指針的方法,并以運行μC/OS-II為例,說(shuō)明替換效果。

本文引用地址:http://dyxdggzs.com/article/201609/304500.htm

引言

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

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

1 原理

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

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

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

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

ARM Cortex—M0/M0+單片機的指針變量替換方法

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

Address_32bits=Address_16bits+Address_base (1)

Address_16bits=Address_32bits_Address_base (2)

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

2 方案

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

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

ARM Cortex—M0/M0+單片機的指針變量替換方法

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

pointer_16 ptl6_data=addr_16(data);

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

ARM Cortex—M0/M0+單片機的指針變量替換方法

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

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

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

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

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

MOV , ;寄存器間數據傳送

ADD , ;基地址+偏移量

CMP , ;地址的比較

這里Rd和Rm之一可以是高組寄存器??梢钥闯?,對于高組寄存器,ARMv6僅保留了高低組寄存器間數據傳遞、不影響標志位的加法運算和單獨的地址比較這3種操作,其用處顯然是為了支持將高組寄存器用于地址運算。

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


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>