嵌入式學習 賦值 編譯 連線位址問題

2021-07-07 05:11:31 字數 1103 閱讀 8581

1、假設p1=0x12345678;需要把第二位置為1,即p1=0x1234567a,在具體賦值時,採用如下方式為常見做法。

1.重置

p1=p1 & 0xfffffff0;

2.賦值

p1=p1 | 0x0000000a;

注意按位或|  與邏輯或||的區別。

2、將p1=0b01011010前4位轉為1100。

1.重置

p1 = p1 & 0b00001111 = 0b00001010

2.賦值

0b00001100<<4=0b11000000

p1= p1 | 0b11000000 = 0b11001010

上邊是以前的,昨天寫程式又給忘了除錯了半天,真是笨的要死。

在來總結下賦值,最好用移位來解決,不要直接給定值。

比如 p0 要給p02 賦值1

1.p0 |= (1<<2)

p0要給p02賦值0

1.p0 &= ~(1<<2)

當要給 p02 p03 賦值10的時候,必須先重置,經過兩個步驟

1.p0 &= ~(3<<2)

2,p0 |=(2<<2)

昨天又犯了致命問題,在編譯的時候檔案前後有致命的問題,必須按順序來編譯,先連線start.o

arm-linux-ld -ttext 0x00000194 -o led_key.elf led_key.o start.o   這裡指定的**位址其實就是定義程式的**初始位址   cpu上電從0執行,**不是0開始則不會執行**

執行位址即鏈結位址,是程式設計師對**的一種標記    實際執行是靠pc指標的值然後去找對應的標記,所以重點在於怎麼去計算pc的值

pc值在程式初始時都是0,在沒有認為去給pc賦值的時候

b bl mov這些跳轉指令都是位置無關碼,pc值=當前pc值+反彙編**bit[23:0]    與程式設計師的標記無任何關係

ldr pc,=***   ldr是位置有關碼, ***通常和程式設計師對**的標記號有關   pc值=當前pc值+***  所以此時pc值和標記號有關 直接就與儲存位址相關了 會直接跳轉到標記號上執行此時pc和標記號相等  如果有拷貝到sdram 標記號飛到sdram範圍內 pc也就執行儲存到sdram上的程式了

嵌入式學習筆記之gcc編譯器

原始檔需要經過編譯才能生成可執行檔案,pc下的編譯工具鏈為gcc,ld,objcopy等,它們編譯出來的程式在x86平台下執行,要編譯出可以在arm平台執行的程式,就需要使用交叉編譯工具 arm linux gcc,arm linux ld等,主要介紹前者.乙個c c 檔案要經過 預處理 prepr...

嵌入式 交叉編譯Qt 時 可能出現的問題

昨天交叉編譯qt的時候出現的乙個問題,曬出來和大家一起學習一下,謝謝指點 usr c20.10 2 c2 100713 bin lib gcc c2 linux uclibc 4.0.3 c2 linux uclibc bin ld skipping incompatible usr local t...

正點原子嵌入式Linux學習 13 連線檔案

通過inode產生新檔名,inode是記錄檔案屬性的,乙個檔案乙個inode。硬連線的關鍵就是 多個檔案指向同乙個inode ln help 用法 ln 選項 t 目標 鏈結名 第一種格式 或 ln 選項 目標 第二種格式 或 ln 選項 目標.目錄 第三種格式 或 ln 選項 t 目錄 目標.第四...