📄 vivi的代碼問題.txt
字号:
請問linux的啟動程序vivi的代碼問題。
1.
/include/headware.h裡面有如下的定義
#ifndef __ASSEMBLY__
#define __REG(x) (*(volatile unsigned long *)(x))
#define __REGl(x) (*(volatile unsigned long *)(x))
#define __REGw(x) (*(volatile unsigned short *)(x))
#define __REGb(x) (*(volatile unsigned char *)(x))
#else
#define __REG(x) (x)
#define __REGl(x) (x)
#define __REGw(x) (x)
#define __REGb(x) (x)
請問__REG(x) 的定義是對x進行二級指針運算嘛?如果不是,那是什麼意思?
2、
/arch/s3c2410/head.S的彙編格式是遵循什麼格式的,是Intel還是AT&T格式的,怎麼看起來都不像。滿多東西看不明白,哪位大俠給點指導。謝謝了。
Re: 請問linux的啟動程序vivi的代碼問題。
1。 不是二級指針。
x中放的是一個常量,比如你的sdram contoler某個寄存器的物理地址是0xa0000000,那麼我就可以這樣用了:
#define SDRAM_CTRL_REG __REG(0xa0000000)
然後我以後要對這個寄存器進行訪問,就可以這樣:
寫:
SDRAM_CTRL_REG = 0xffff;
讀:
if (SDRAM_CTRL_REG != 0x3f4e)
順便說一下,那個#if #lese的意思是這樣的:
由於頭文件中定義的宏有時用在c源碼中,有時用在.S彙編源碼中,這樣對一個宏的定義就需要兩種形式,顯然:像#define __REG(x) (*(volatile unsigned long *)(x)) 這樣的宏,彙編程序不可能認得,所以kernel中引用了__ASSEMBLY__這個宏,如果定義了該宏,說明該塊代碼可以被.S包含;如果沒定義,說明可以被.c包含,不知道我說明白沒有
2.那個。。。話說arm得彙編就不會是intel語法了吧。。。Intel還是AT&T格式的問題只在x86體系下談才有意義。。。。不過可以這樣說,他的操作書順序和市面上的書中介紹的arm彙編的順序是完全一致的。絕大多說指令都是左邊是目的操作數,右邊是源操作數(和第二操作數,如果有的話),除了少數指令,比如str
Re: 請問linux的啟動程序vivi的代碼問題。
謝謝growlanser,令我茅塞頓開。
另外,這裡的地址一定是要絕對地址嗎?如果想用相對地址,用這種方法是不是可以一樣這樣實現?
Re: 請問linux的啟動程序vivi的代碼問題。
呵呵,解釋的非常清楚:-)
在嵌入系統的底層軟件裡面這樣的寫法非常的多。。。
Re: 請問linux的啟動程序vivi的代碼問題。
單從__REG這個宏上可以看出他是不能用相對地址的。建議你使用這些宏,因為使用vivi提供的這些宏在編程的書寫風格上非常一致,看起來也很舒服^^
不過你可以自己定義自己的宏,比如(我沒做過vivi的編程,所以說不定vivi上有呢):
#define __REG2(x, y) __REG((x) + (y))
其中x是基地址(絕對地址),y是相對地址(或者說是寄存器索引)。
最簡單的就是:
read_reg(__REG(x + y));
x是基地址;y是寄存器偏移值(相對地址,寄存器索引,隨你怎麼叫吧^^)
在保持代碼風格的同時可以發揮自己的想像去修改你的代碼。希望對你有所幫助。
Re: 請問linux的啟動程序vivi的代碼問題。
謝謝你的解釋,我現在在看vivi的代碼看得我頭暈腦脹得,以前沒怎麼編程。
現在又得麻煩你了。下面是vivi裡的用彙編編寫的啟動部分的源碼。
#include "config.h"
#include "linkage.h"
#include "machine.h"
@ Start of executable code
ENTRY(_start)
ENTRY(ResetEntryPoint)
@
@ Exception vector table (physical address = 0x00000000)
@
@ 0x00: Reset
b Reset
@ 0x04: Undefined instruction exception
UndefEntryPoint:
b HandleUndef
@ 0x08: Software interrupt exception
SWIEntryPoint:
b HandleSWI
@ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)
PrefetchAbortEnteryPoint:
b HandlePrefetchAbort
@ 0x10: Data Access Memory Abort
DataAbortEntryPoint:
b HandleDataAbort
@ 0x14: Not used
NotUsedEntryPoint:
b HandleNotUsed
@ 0x18: IRQ(Interrupt Request) exception
IRQEntryPoint:
b HandleIRQ
@ 0x1c: FIQ(Fast Interrupt Request) exception
FIQEntryPoint:
b HandleFIQ
@
@ VIVI magics
@
@ 0x20: magic number so we can verify that we only put
.long 0
@ 0x24:
.long 0
@ 0x28: where this vivi was linked, so we can put it in memory in the right place
.long _start
@ 0x2C: this contains the platform, cpu and machine id
.long ARCHITECTURE_MAGIC
@ 0x30: vivi capabilities
.long 0
#ifdef CONFIG_PM
@ 0x34:
b SleepRamProc
#endif
#ifdef CONFIG_TEST
@ 0x38:
b hmi
#endif
@
@ Start VIVI head
@
Reset:
@ disable watch dog timer
mov r1, #0x53000000
mov r2, #0x0
str r2, [r1]
#ifdef CONFIG_S3C2410_MPORT3
mov r1, #0x56000000
mov r2, #0x00000005
str r2, [r1, #0x70]
mov r2, #0x00000001
str r2, [r1, #0x78]
mov r2, #0x00000001
str r2, [r1, #0x74]
#endif
@ disable all interrupts
mov r1, #INT_CTL_BASE
mov r2, #0xffffffff
str r2, [r1, #oINTMSK]
ldr r2, =0x7ff
str r2, [r1, #oINTSUBMSK]
@ initialise system clocks
mov r1, #CLK_CTL_BASE
mvn r2, #0xff000000
str r2, [r1, #oLOCKTIME]
@ldr r2, mpll_50mhz
@str r2, [r1, #oMPLLCON]
#ifndef CONFIG_S3C2410_MPORT1
@ 1:2:4
mov r1, #CLK_CTL_BASE
mov r2, #0x3
str r2, [r1, #oCLKDIVN]
mrc p15, 0, r1, c1, c0, 0 @ read ctrl register
orr r1, r1, #0xc0000000 @ Asynchronous
mcr p15, 0, r1, c1, c0, 0 @ write ctrl register
@ now ,usb clock is 48Mhz
ldr r0, =CLK_CTL_BASE @ Fin=12MHz, Fout=48MHz
ldr r1,upp_48Mhz
str r1, [r0,#oUPLLCON]
nop
nop
nop
nop
ldr r0, = CLK_CTL_BASE @ Fin=12MHz, Fout=48MHz
ldr r1,upp_48Mhz
str r1, [r0,#oUPLLCON]
@ now, CPU clock is 200 Mhz
mov r1, #CLK_CTL_BASE
ldr r2, mpll_200mhz
str r2, [r1, #oMPLLCON]
#else
@ 1:2:2
mov r1, #CLK_CTL_BASE
ldr r2, clock_clkdivn
str r2, [r1, #oCLKDIVN]
mrc p15, 0, r1, c1, c0, 0 @ read ctrl register
orr r1, r1, #0xc0000000 @ Asynchronous
mcr p15, 0, r1, c1, c0, 0 @ write ctrl register
@ now, CPU clock is 100 Mhz
mov r1, #CLK_CTL_BASE
ldr r2, mpll_100mhz
str r2, [r1, #oMPLLCON]
#endif
bl memsetup
#ifdef CONFIG_PM
@ Check if this is a wake-up from sleep
ldr r1, PMST_ADDR
ldr r0, [r1]
tst r0, #(PMST_SMR)
bne WakeupStart
#endif
#ifdef CONFIG_S3C2410_SMDK
@ All LED on
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_F
ldr r2,=0x55aa
str r2, [r1, #oGPIO_CON]
mov r2, #0xff
str r2, [r1, #oGPIO_UP]
mov r2, #0x00
str r2, [r1, #oGPIO_DAT]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -