第5課 混合編程和芯片手冊閱讀

5.1 C語言和彙編混合編程

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,檢查是否報錯。若是沒有報錯,下到開發板裏面去運行一下,再開發板裏的執行結果以下:開發

 

5.2 閱讀cpu_arm946_reset(loc)

在路徑/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,保持其餘位不變。

5.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

5.4 總結

這節課主要講了彙編和C語言的混合編程,同時也主要閱讀相關的文檔來加深理解,尤爲是作嵌入式的,芯片手冊的閱讀是一個必須通過的的過程,只有經過閱讀手冊,才能對芯片有一個深刻的瞭解,這節課講解的內容很少,但閱讀量是很是大的,用一個周都是看不完的,接下來還得繼續。

相關文章
相關標籤/搜索