作為過來人,我發(fā)現(xiàn)很多程序猿新手,在編寫代碼的時(shí)候,特別喜歡定義很多獨(dú)立的全局變量,而不是把這些變量封裝到一個(gè)結(jié)構(gòu)體中,主要原因是圖方便,但是要知道,這其實(shí)是一個(gè)不好的習(xí)慣,而且會(huì)降低整體代碼的性能。
另一方面,最近有幸與大神「公眾號(hào):裸機(jī)思維」的傻孩子交流的時(shí)候,他聊到:“其實(shí)Cortex在架構(gòu)層面就是更偏好面向?qū)ο蟮模呐履阒皇鞘褂昧私Y(jié)構(gòu)體),其表現(xiàn)形式就是:「Cortex所有的尋址模式都是間接尋址」——換句話說「一定依賴一個(gè)寄存器作為基地址」。
舉例來說,同樣是訪問外設(shè)寄存器,過去在8位和16位機(jī)時(shí)代,人們喜歡給每一個(gè)寄存器都單獨(dú)綁定地址——當(dāng)作全局變量來訪問,而現(xiàn)在Cortex在架構(gòu)上更鼓勵(lì)底層驅(qū)動(dòng)以寄存器頁(yè)(也就是結(jié)構(gòu)體)為單位來定義寄存器,這也就是說,同一個(gè)外設(shè)的寄存器是借助擁有同一個(gè)基地址的結(jié)構(gòu)體來訪問的。”
以Cortex A9架構(gòu)為前提,下面一口君詳細(xì)給你解釋為什么使用結(jié)構(gòu)體效率會(huì)更高一些。
一、全局變量代碼反匯編
1. 源文件
「gcd.s」
.text
.global _start
_start:
ldr sp,=0x70000000 get stack top pointer
b main
「main.c」
* main.c
*
* Created on: 2020-12-12
* Author: pengdan
int xx=0;
int yy=0;
int zz=0;
int main(void)
{
xx=0x11;
yy=0x22;
zz=0x33;
while(1);
return 0;
}
「map.lds」
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x40008000;
. = ALIGN(4);
.text :
{
gcd.o(.text)
*(.text)
}
. = ALIGN(4);
.rodata :
{ *(.rodata) }
. = ALIGN(4);
.data :
{ *(.data) }
. = ALIGN(4);
.bss :
{ *(.bss) }
}
「Makefile」
TARGET=gcd
TARGETC=main
all:
arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGETC).o $(TARGETC).c
arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGET).o $(TARGET).s
arm-none-linux-gnueabi-gcc -O1 -g -S -o $(TARGETC).s $(TARGETC).c
arm-none-linux-gnueabi-ld $(TARGETC).o $(TARGET).o -Tmap.lds -o $(TARGET).elf
arm-none-linux-gnueabi-objcopy -O binary -S $(TARGET).elf $(TARGET).bin
arm-none-linux-gnueabi-objdump -D $(TARGET).elf > $(TARGET).dis
clean:
rm -rf *.o *.elf *.dis *.bin
【交叉編譯工具,自行搜索安裝】
-
嵌入式設(shè)計(jì)
+關(guān)注
關(guān)注
0文章
390瀏覽量
21267 -
Cortex
+關(guān)注
關(guān)注
2文章
202瀏覽量
46441 -
ARM架構(gòu)
+關(guān)注
關(guān)注
14文章
177瀏覽量
36290
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論