C語言和彙編的混合編程,實現混合編程的一個重要方面就是要實現C代碼和彙編代碼的數據、函數共享。linux
彙編程序以.S結尾,在/work/uClinux-dist/user/下新建一個scu1的文件夾。在文件夾裏新建一個文件testasm.S,在testasm.S裏用匯編寫兩個函數,實現兩個數的加減。以下編程
.text
.global MyAdd
.global MySub
MyAdd:
add r0, r0, r1
mov pc, lr
MySub:
sub r0, r0, r1
mov pc, lr函數
而後,在C語言裏調用這兩個函數,在scu1裏新建一個test.c文件。內容以下:spa
#include <stdio.h>
extern int MyAdd(int a, int b);
extern int MySub(int a,int b);
int main(void)
{
printf(「\nMyAdd=%d」, MyAdd(5,6));
printf(「\nMySub=%d」, MySub(8,3));
return 0;
}orm
其中,extern在彙編中用來引用一個在其餘模塊中定義過的符號名,使得這個符號名所表示的數據或函數能在該模塊中被使用。Extern申明爲外部函數。最後須要一個Makefile文件,blog
EXECS = test
OBJS = testasm.o test.o
AFLAGS := -mapcs-32
all: $(EXECS)
testasm.o: testasm.S
$(CC) $(AFLAGS) -c -o $@ $<
$(EXECS): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
romfs:
$(ROMFSINST) /bin/testip
但這三個文件代碼寫好了之後,在/work/uClinux-dist目錄下執行sudo make,檢查是否報錯。若是沒有報錯,下到開發板裏面去運行一下,再開發板裏的執行結果以下:開發
在路徑/work/uClinux-dist /linux-2.4.x/arch/armnommu/mm/proc-arm946.S下,找到該函數,函數以下:文檔
* cpu_arm946_reset(loc)it
* Perform a soft reset of the system. Put the CPU into the
* same state as it would be if it had been reset, and branch
* to what would be the reset vector.
* loc: location to jump to for soft reset
*/
.align 5
ENTRY(cpu_arm946_reset)
mov ip, #0
mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
mrc p15, 0, ip, c1, c0, 0 @ ctrl register
bic ip, ip, #0x000f @ ............wcam
bic ip, ip, #0x1100 @ ...i...s........
mcr p15, 0, ip, c1, c0, 0 @ ctrl register
mov pc, r0
這個程序是對arm946CPU進行軟件復位,首先分配5個字節空間存放代碼,MCR 傳送 ARM 寄存器 Rd 的內容到協處理器,MRC 從協處理器傳送一個單一的字並把它放置到 ARM 寄存器 Rd 中,bic是在一個字中清除位的一種方法,與 OR 位設置是相反的操做,這條指令的目的是清除位0,1,2,3,保持其餘位不變。
經過閱讀芯片手冊Part 1 - FireFox-Overview-Rev0-1 – 120602和Part 2 - FirefoxCPU-Benjamin_Nov_01_02能夠找到相應問題的答案。
(1) Which pin is used to select boot chip?
BOOTCSn(Pin65)
(2) Which pins are used to select SDRAM?
M_CS[2:0]n(Pin56,Pin57,Pin85)
(3) What is the base address of boot device?
0xFFC0_0000
(4) What is the base address of GPIO registers?
0x8000_D000
(5) What is the base address of UART registers?
0x8000_C840
這節課主要講了彙編和C語言的混合編程,同時也主要閱讀相關的文檔來加深理解,尤爲是作嵌入式的,芯片手冊的閱讀是一個必須通過的的過程,只有經過閱讀手冊,才能對芯片有一個深刻的瞭解,這節課講解的內容很少,但閱讀量是很是大的,用一個周都是看不完的,接下來還得繼續。