- 博客(10)
- 资源 (4)
- 收藏
- 关注
原创 对于*(mmu_tbl_base)+virtuladdr>>20等的一点理解
<br />如下:<br /><br />unsigned long *mmu_tlb_base = (unsigned long *)0x30000000; <br />如果执行mmu_tlb_base=mmu_tlb_base+1,会得到mmu_tlb_base为0x30000004的结果,对于指针的加减操作会将+1自动转换为+指针类型字节数 <br />(unsigned short *)mmu_tlb_base+1的结果是0x30000002 <br />(unsigned long)mmu_tlb
2011-01-21 19:11:00 2079
原创 堆栈的问题 SP指针
<br />为什么将SP设为 4096 设定之后怎么运行?是从4096开始写然后再写4095还是往4097写?4096是steppingstone的地址吗?<br />中断为什么设为3072?<br /> <br /> <br />S3C2410、S3C2440有内部RAM、外部的SDRAM,这些都被称为内存;<br />SP设在内存上,可以是内部RAM,也可以是SDRAM,只要不破坏当前运行的程序就可以了。<br /><br /><br />启动时首先执行内部RAM的4096,然后将NAND的代码移到SD
2011-01-20 21:23:00 2803
原创 关于ARM9协处理器CP15及MCR和MRC指令
<br /><br />在基于ARM的嵌入式应用系统中,存储系统通常是通过系统控制协处理器CP15完成的。CP15包含16个32位的寄存器,其编号为0~15。<br />访问CP15寄存器的指令<br />MCR ARM寄存器到协处理器寄存器的数据传送<br />MRC 协处理器寄存器到ARM寄存器的数据传送<br />MCR指令和MRC指令只能在处理器模式为系统模式时执行,在用户模式下执行MCR指令和MRC指令将会触发未定义指令的异常中断。<br />MCR指令<br />MCR指令将ARM处理器
2011-01-18 16:45:00 11753
原创 深入理解SP、LR和PC
<br /><br />深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益。<br />1、堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。<br />2、连接寄存器r14(LR):每种模式下r14都有自身版组,它有两个特殊功能。
2011-01-18 13:54:00 45682 4
原创 为什么adrl r2,mem_cfg_val这里不用ldr r2,=mem_cfg_val,
<br />请教书中sdram裸机代码memsetup:<br />mov r1, #MEM_CTL_BASE<br />adrl r2,mem_cfg_val<br />add r3, r1,#52<br />1:<br />ldr r4, [r2],#4<br />str r4, [r1],#4<br />cmp r1,r3<br />bne 1b<br />mov pc,lr<br />mem_cfg_val:<br /> .long 0x22011110<br /> .long 0x000
2011-01-17 21:08:00 1898
原创 指令B和BL的区别
<br /><br />B常用于不返回的跳转,比如跳到某个标号处,BL则用于子程序跳转(要返回,返回地地存于LR)<br />B. (注意B后面的“.”)这个“.”是指定当前的地址,如果使用 B.这条指令,其实就是死循环。
2011-01-17 14:41:00 1474
原创 指令B和BL的区别
<br /><br />B常用于不返回的跳转,比如跳到某个标号处,BL则用于子程序跳转(要返回,返回地地存于LR)<br />B. (注意B后面的“.”)这个“.”是指定当前的地址,如果使用 B.这条指令,其实就是死循环。
2011-01-17 14:41:00 3386
原创 ARM指令 LDR 和 ADR的一些区别
<br /><br />LDR 是ARM中的指令,也是伪指令。<br />当用 LDR r, =imd // r 为寄存器, imd为立即数<br />LDR 是一条伪指令。编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn指令。<br />当imd能用mov或者mvn操作时,就将它翻译成一条mov或mvn指令。当imd大于mov或mvn能够操作的数时,编译器会将imd存在一个内存单元中,然后再用一条ldr指令加载这个内存单元的的值到寄存器中。<br />LDR r, label 和
2011-01-16 19:46:00 26168 3
原创 讲讲volatile的作用
<br />一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: <br /> 1). 并行设备的硬件寄存器(如:状态寄存器) <br /> 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) <br /> 3). 多线程应用中被几个任务共享的变量
2011-01-14 20:14:00 659
原创 WatchDog
<br />Watchdog是整个ARM体系结构中相对比较简单的接口,控制代码只有几行,写起来比较容易。首先选择学习watchdog,可以快速入门,先对底层硬件工作原理有个初步的认识。(Watchdog即通常我们所说的“看门狗”) Watchdog原理上就是一个定时器。定时器timer对时钟进行计数,当定时器溢出时,产生复位信号,使得整个系统复位。在程序或嵌入式系统中,需要定期的对看门狗timer进行复位重新计数,定时器不会溢出复位系统,从而保证系统的正常运行。当某种原因(例如干扰)引起程序跑飞或者进入死循
2011-01-14 18:24:00 1168
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人