上一页 1 ··· 176 177 178 179 180 181 182 183 184 ··· 191 下一页
摘要: 前面已经介绍进入C语言世界,就会实现更多的功能,支持更多的应用。现在就来仔细地分析源程序,并且理解各部份功能实现。首先来看看下面的函数:/** Returns the external clock frequency, usually the bus clock*/inttgt_cpufreq(){ if(md_cpufreq == 0) { _probe_frequencies(); } return(md_cpufreq);}这个函数实现检测CPU运行的频率和总线的频率。这里又调用函数_probe_frequencies()来探测CPU和总线的频率,再跟踪到那个函数的实现。如下:stati 阅读全文
posted @ 2007-01-06 23:43 ajuanabc 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 经历了漫长的汇编之路,最终走到光明的C世界了,进入高级语言环境,会让开发更方便,写更少的语句就可以实现更多的功能。从这里开始,就初始化PCI局部线所有设备,初始化南桥所有的功能,初始化IDE硬盘,初始化网络,初始化显示卡,并进入响应命令阶段。下面就来分析C函数部份功能,当然它还有时需要调用汇编子函数才能实现特殊的功能。从上次分析移动代码里,就知道代码已经移到0x8000 0000开始运行了。voidinitmips(unsigned int memsz){ /* *Set up memory address decoders to map entire memory. *But first m 阅读全文
posted @ 2007-01-05 23:25 ajuanabc 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 前面已经初始化内存和龙芯的缓存,那么现在已经差不多把新房子已经建立好了,要进入新房居住了。在SDRAM里的存取速度比ROM里快很多,并且可以随时修改数据,而在ROM是不能修改的,就算可以修改,也是非常慢的。从上面初始化缓存回来后,就运行到下面的程序:#####xuhua########open cp1 #if 1 mfc0 t0,COP_0_STATUS_REG and t0,0xdbffffff or t0,t0,0x24000000 mtc0 t0,COP_0_STATUS_REG#endif#################上面的程序打开了CP1处理器,也就是浮点处理器。先从状态寄存器. 阅读全文
posted @ 2007-01-04 22:36 ajuanabc 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 串口输出东西太重要了,因此,再来仔细地看看串口调用的其它函数,这样做到一目了然,没有别的疑问在里面,就可以做到庖丁解牛游刃有余。像下面的函数:PRINTSTR(" CONFIG=")上面这句,就是输出一串字符到串里显示出来。其实它是一个宏定义,那么它是怎么样实现输出字符串到串口上的呢?立即去找到它的宏定义,然后把它展开,最后看看它是怎么样的。宏定义如下:#define PRINTSTR(x) / .rdata;98: .asciz x; .text; la a0, 98b; bal stringserial; nop把它写得好看一些,如下:.rdata98: .asciz 阅读全文
posted @ 2006-12-31 14:52 ajuanabc 阅读(435) 评论(0) 推荐(0) 编辑
摘要: 前面已经介绍到要初始化南桥,现在就来看看南桥是怎么样初始化,并且更重要的工作,就是怎么样初始化串口输出东西。先来看superio_init实现代码:#define PCICONF_WRITEB(dev,func,reg,data) / li a0,CFGADDR(dev,func,reg); / li a1,PHYS_TO_UNCACHED(PCI_CFG_SPACE); / and a2,a0,0xffff; / or a1,a2; / srl a0,16; / li a2,BONITO_BASE+BONITO_PCIMAP_CFG; / sw a0,BONITO_PCIMAP_CFG(bo 阅读全文
posted @ 2006-12-30 16:09 ajuanabc 阅读(319) 评论(0) 推荐(0) 编辑
摘要: 上一次说到怎么样运行起来,现在接着上次再进行分析下去。在locate的程序,如下:locate: la s0,start subu s0,ra,s0 ands0,0xffff0000 li t0,SR_BOOT_EXC_VEC mtc0 t0,COP_0_STATUS_REG mtc0 zero,COP_0_CAUSE_REG .set noreorder li bonito,PHYS_TO_UNCACHED(BONITO_REG_BASE)…bal 1f nop /* bonito endianess */ BONITO_BIC(BONITO_BONPONCFG,BONITO_BONPONC 阅读全文
posted @ 2006-12-29 12:57 ajuanabc 阅读(310) 评论(0) 推荐(0) 编辑
摘要: 天生万物,万物始于天。同样,龙芯2E要运行起来,那么就少不了程序。那么龙芯2E的盘古开天是从那里开始呢?追源寻根,才能了解事物的来龙去脉,才能把握住未来的方向。现在就去寻找龙芯电脑运行的第一行程序,去看看龙芯的初始化阶段都做了些什么事情,有没有做坏事情呢?哈哈,这个很难说的。如果有BUG的出现,就会干出各种各样的坏事情。龙芯2E的内存布局已经说明它要从那里加载第一行程序了,很明确的地址就是0xBFC0 0000,相应的物理地址是0x1FC0 0000。因此,只把PMON程序放到那个ROM Flash里,就会运行第一行程序。打开PMON目录下的文件start.S,就会看到下面的汇编程序:.set 阅读全文
posted @ 2006-12-28 16:42 ajuanabc 阅读(286) 评论(0) 推荐(0) 编辑
摘要: 每个CPU都有自己独特的指令,比如X86结构的CPU有INTEL的指令系统,MIPS的CPU也有自己的指令系统,当然龙芯CPU也不例外,有自己的指令系统。指令是控制CPU怎么样工作的接口,每条指令都会让CPU做出响应的。如果发送一条不是CPU的指令,就会导致CPU非法执行,并且会引起CPU异常。龙芯里,每条指令都是固定长度:32位,4个字节。因此,任何指令段的代码长度,一定要是4字节的倍数,绝对不要出现不是4的倍数,否则就让CPU不能运行了。从龙芯的使用手册中可以看到,每条CPU指令都是一条32位的指令字,这些指令都是字对齐的。指令集包含三种指令格式,如图 2-1所示,立即数指令(I-型),跳 阅读全文
posted @ 2006-12-27 13:35 ajuanabc 阅读(610) 评论(0) 推荐(0) 编辑
摘要: 在以前的MIPS机器里,都需要进行如下处理:1.加载或保存到内存. 2.lw $9, 0($8); 从内存里加载一个值到$93.nop ; $9在这里还没有准备好,所以要跑多一条空指令来解决。4.addiu $10, $9 ; $9在这里已经从内存取值回来,可以使用了。5.分支和跳转. 6. jal myfunc ; 调用函数7. move a0, s0 ; 这条指令在跳转前执行8. addiu s0,s0,v0 ; 这条指令在跳转后执行。不知道龙芯是否也需要这样编程吗?现在的龙芯2E是不需要再在加载和保存指令后面加NOP指令了。跳转连接指令后面,除了跳转指令外其它指令都可以加入去。 阅读全文
posted @ 2006-12-26 15:46 ajuanabc 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 对于软件开发人员来说,一个CPU最重要的部分就是寄存器、内存布局和指令。龙芯2E逻辑上是有32个定点通用寄存器(其中0号固定为0),32个浮点寄存器,一个hi,一个lo,以及若干cp0控制寄存器,两个cp1控制寄存器。物理上是64个定点,64个浮点,和若干控制寄存器。龙芯2E具有下面的逻辑寄存器:l 32个通用的64位寄存器l 1个PC寄存器l 2个保存乘除操作结果寄存器l 32个浮点64位寄存器l 32个CP0控制寄存器l 2个cp1控制寄存器一、32个通用的64位寄存器这32个通用寄存器,可以用作任何使用。但实际上由于编译器已经约定特定的使用,所以还是要服从特定的约定,这样可以减少麻烦,减 阅读全文
posted @ 2006-12-25 13:48 ajuanabc 阅读(431) 评论(0) 推荐(0) 编辑
上一页 1 ··· 176 177 178 179 180 181 182 183 184 ··· 191 下一页