⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vivi的代碼問題.txt

📁 linux的啟動程序vivi的代碼問題
💻 TXT
📖 第 1 页 / 共 2 页
字号:
請問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 + -