gp ,g lobal pointer,全局指針寄存器,RISC-V 32個寄存器之一,為了優(yōu)化±2KB內(nèi)全局變量的訪問。
gp寄存器在啟動代碼中加載為__global_pointer$
的地址,并且之后不能被改變。
linker時使用 __global_pointer$ 來比較全局變量的地址,如果在范圍內(nèi),就替換掉lui或puipc指令的 absolute/pc-relative尋址, 變?yōu)間p-relative尋址,使得代碼效率更高。 該過程被稱為 linker relaxation (鏈接器松弛),也可以使用-Wl,--no-relax
來關(guān)閉此功能。
如:需要讀取全局變量 tao_global的值,地址位 0x20000100 ,gp指針地址為 0x20000800 ;
- 普通調(diào)用方式為:
lui a5,0x20000 /* 將0x20000100高20位0x20000 左移12位賦給a5寄存器 */ lw a5,256(a5) /* 加載a5+256(0x100,0x20000100低12位)的值至a5寄存器 */
- gp指針優(yōu)化調(diào)用方式:
lw a5,-1792(gp) /* 加載gp-1792地址處的值至a5,即0x20000100處的值*/
通過gp指針,訪問其值±2KB,即4KB范圍內(nèi)的全局變量,可以節(jié)約一條指令。
4KB區(qū)域可以位于尋址內(nèi)存中任意位置,但是為了使優(yōu)化更有效率,最好覆蓋最頻繁使用的RAM區(qū)域。 對于標(biāo)準(zhǔn)的newlib應(yīng)用程序,這是分配.sdata部分的區(qū)域,因為它包含了諸如_impure_ptr、malloc_sbrk_base等變量。 因此,定義應(yīng)該被放在.sdata部分之前。 以RISC-V MCU CH32V103 ld文件為例:
.data :
{
*(.gnu.linkonce.r.*)
*(.data .data.*)
*(.gnu.linkonce.d.*)
. = ALIGN(8);
PROVIDE( __global_pointer$ = . + 0x800 ); /* __global_pointer地址*/
*(.sdata .sdata.*)
*(.sdata2.*)
*(.gnu.linkonce.s.*)
. = ALIGN(8);
*(.srodata.cst16)
*(.srodata.cst8)
*(.srodata.cst4)
*(.srodata.cst2)
*(.srodata .srodata.*)
. = ALIGN(4);
PROVIDE( _edata = .);
} >RAM AT>FLASH
gp指針優(yōu)化代碼空間---
通常情況下,gp指針定義在data區(qū),有時候為了優(yōu)化代碼密度,可以根據(jù)實際情況修改gp指針的位置,如工程中定義了大量的初始化為0或未初始化的全局?jǐn)?shù)組作為緩沖區(qū),可以將gp指針的位置定義到bss段。
-
mcu
+關(guān)注
關(guān)注
146文章
17964瀏覽量
366410 -
寄存器
+關(guān)注
關(guān)注
31文章
5433瀏覽量
124385 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71178 -
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28941 -
RISC-V
+關(guān)注
關(guān)注
46文章
2555瀏覽量
48755
發(fā)布評論請先 登錄
擁抱RISC-V的開發(fā)世界 兆易創(chuàng)新推GD32VF103系列RISC-V MCU
國產(chǎn)RISC-V MCU推薦
RISC-V的MCU與ARM對比
RISC-V的MCU關(guān)于USB高速通信設(shè)計的難點
risc-v的mcu對RTOS兼容性如何
RISC-V MCU技術(shù)
RISC-V MCU開發(fā) (一):集成開發(fā)環(huán)境
RISC-V MCU開發(fā)相關(guān)資料分享
RISC-V MCU開發(fā)相關(guān)資料分享
RISC-V的相關(guān)資料分享
RISC-V MCU開發(fā)的相關(guān)資料分享
RISC-V gp全局指針寄存器說明
RISC-V MCU開發(fā)(一):集成開發(fā)環(huán)境

評論