Linux学习笔记(四)

怎样把EtherCAT主站igh包放到s3c2440的板子里?

1、首先硬件上,连接电源线,串口线,eop烧录线,以太网线。
2、利用eop烧录线往板子里烧录一个u-boot.bin文件。这样板子打开就能进入一个qt系统。
3、打开Mobaxterm串口调试软件,连接板子的串口,烧录这个.bin文件会启动串口程序,此时可以在串口上操控板子上的系统。
4、设置以太网的ip地址,使它和板子的ip地址在同一个频段上,也就是前三个地址要相同。试着ping通板子和电脑的这个以太网线。
5、打开tftpd32软件,用这个软件把需要的文件传给板子。就可以了。

补充:SDRAM和SRAM都是系统的内存。内存的特点就是,掉电之后不能保存信息。所以有了nand flash,这个掉电之后是可以保存的。他们关系就像RAM和ROM,RAM就是随机存取存储器,它就是我们常说的内存。ROM就是只读存储器,它出现的目的就是为了掉电可以保存东西,前期只能读取,后期不断发展,出现了EPROM,EEPROM这些东西,更有利于存储,而后来在这两种技术的发展上又发展出了NAND FLASH闪存,这就是我们现在用的U盘中用到的技术。
一开始它里面的前4K的内容先给SRAM,然后CPU控制内存SRAM将nand flash里面的东西给SDRAM进行运行。

链接就是为了确定地址。
机器码前面的e是根据寄存器中的高四位进行条件判断。
32或者64位是因为电脑最终CPU总共有多少接口来命名的。

堆栈就相当于内存,它的存在的目的是,因为一些寄存器的位置总是被多处调用,而寄存器位置又有限,于是就发明了堆栈,用于临时存储要用的数据,并且堆栈使用一次,SP指针就向下减4,否则不利于别处再使用堆栈。

代码段是不可修改的!

1.韦东山第13课代码重定位第一节
Linux学习笔记(四)_第1张图片
CPU可以直接控制SRAM,SDRAM,Nor,Nand Flash控制器,但是不能直接控制Nand。

1.那么问题来了,既然不能直接控制Nand,为什么可以直接Nand启动?
因为nand启动时,它先把里面前4K的内容复制给SRAM,CPU从SRAM中的0行开始读取。

2.那么问题又来,如果程序代码大于4K怎么办?
这里就引出新的定义,如果程序代码大于4K,那么SRAM中的前4K就需要把所有程序给SDRAM,这就需要对地址进行重定位,简称代码重定位。

3.nor flash的基地址是0x4000 0000
nand flash的基地址是0

nand flash的特点是什么?
它可以像内存一样读程序,但是不能像内存一样写程序。

引申:局部变量放在栈中,栈指向SRAM,而全局或静态变量是放在bin文件中,烧在nor flash文件上面,代码里写全局变量无效(就是在main函数之外定义的代码),需要放到SDRAM中,也就是重定位。
综上可以看出,无论nor还是nand启动都需要重定位。

4.在Linux上查看反汇编:vi sdram.dis
修改makefile:1) vi makefile
2)把arm-linux-ld-Ttext 0 start.o led.o uart.o init.o main.o-o sdram.elfM它改为arm-linux-ld-Ttext 0 -Tdata 0x800 start.o led.o uart.o init.o main.o-o sdram.elfM
也就是代码段从0开始到0x800(十进制2048)

5.可以一次性既下载到nand,又下载到nor。
6.无初值的全局变量和注释不保存在bin文件中。
7.再次强调一遍,nor flash里面是不可以写的。
8.
Linux学习笔记(四)_第2张图片
这段代码的意思是从地址0x800复制一个字节到0x 3000 0000
LDR R0, [R1]
这条指令的意思是,将R1中的值作为地址,将地址里面存的值复制给寄存器R0
STR R1,[R0]
这条指令的意思是,将R1里面的值,复制到以R0里面的值作为地址的内存里面。

9.(1)bss文件和COMON文件里面包含都是初值为0或者没有声明初值的全局变量。
(2)链接脚本里,地址分为运行时地址runtime Addr,重定位地址(有时候也成为链接地址),加载地址,不写时加载 地址等于运行时地址。
(3)一般是.O文件生成elf文件,elf文件里面包含地址信息,elf文件最后会生成bin文件,bin文件里面就不包含地址信息了。
(4)elf的地址怎么使用呢?使用加载器把这些地址读到到内存中加载地址里load addr,加载器对于裸板就是JTAG调试工具.
(5)如果内存中指定的加载地址不等于文件中的运行地址,还需要重定位代码,把加载地址信息给运行地址。
Linux学习笔记(四)_第3张图片
上面图片是老师写的一些步骤。
10.main函数可以正常执行的前期工作:关闭看门狗–设置时钟–设置栈–初始化sdram–重定位代码段–清除bss

add r1, r1 #1这个代表r1=r1+1

第13课第3节
11.在汇编中ldr和ldrb的区别:
-LDR 字数据加载指令
-LDRB 字节数据加载指令
在代码中写ldr,内存控制器就会从nor中读取数据。在代码上写str,内存控制器就会往SDRAM中写入数据。
Linux学习笔记(四)_第4张图片
上面这个图是讲,当CPU想要读信号的时候,它先给内存控制器发送一个指令,然后内从控制器从SDRAM中读到CPU想要的字节返回给CPU,当想要写的时候,CPU同样发送地址和数据指令给内存控制器,同时内存控制还会发出DQM数据屏蔽信号,这样如果CPU只想写一个字节,那么就通过DQM把其他三位屏蔽掉。

12.汇编中的
cmp r1, r2
ble clean
此处的 BLE是 指 Branch if Less than or Equal,如果r1小于等于r2,就执行后面的命令。

BNE指令,是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转到后面指定的地址,继续执行。

13.在代码中
#if 0

#endif
可以消除中间段代码的作用

第13课第4节

14.一个程序有代码段,只读数据段(rodata(read only)),数据段(data),还有bss段。程序一开始烧在nor flash上面(注意flash是在nor和nand里面),代码段可以在nor flash 上运行,但是对于数据段必须把它从flash中移动到内存中,只有在内存中,这个变量才可以简单的读写。把程序从一个位置移动到另一个位置就是重定位,可以只重定位数据段,也可以重定位整个程序。

15.sdram.lds文件里存放的是一个代码的链接脚本。
重定位之前,不可以使用全局变量,静态变量,重定位之后才可以。重定位之后,使用ldr pc,=xxxx跳转到SDRAM上的runtime,这个称为绝对跳转指令。如果使用bl命令,则仍然在nor flash上面运行。

不可以访问有初始值得数组,因为初始值放在rodata里面,只能使用绝对地址来访问。

我们不想在程序中保存lds中的变量,但是我们又想使用他们的值,那么这些变量一般保存在符号表symbol table中,用&取值符号获取。

第14课第2节
16.
Linux学习笔记(四)_第5张图片
ARM下面是以“异常”为主,异常里面包括中断。
如图异常包括用户模式和特权模式,特权模式里面的6个可以任意切换,但特权模式和用户模式不能随意切换。修改下副图的SPCR寄存器就可以实现切换。

在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态。

ARM核就好比一个高中学校,那种包含普通高中和职业高中的。普通高中就相当于ARM状态,职业高中就相当于Thumb状态,这样还不能理解的话:可以认为 泡泡卡丁车 中普通模式和加速模式,,卡丁车加速要等到集气管加满,然后“ctrl”一下,就切换到了加速模式,气放完了就又回来了,不管加速模式还是普通模式都是在跑,只是速度不一样而已。

而ARM状态和Thumb状态可以直接通过某些指令直接切换,都是在运行程序,只不过指令长度不一样而已。这个概念对初学者相当重要,因为当ARM Thumb是什么还没弄清楚,怎么能理解两种状态呢?

他们之间的关系清楚了,这样就可以深入了解ARM状态是什么,Thumb状态是什么了。

另外:ARM的M系列主要用Thumb指令,ARM9和A系列主要用ARM指令

S3C2440.S启动代码中根本就没用Thumb指令。
17.
Linux学习笔记(四)_第6张图片
上图是不同模式下的寄存器,带灰色说明那时人家的专属寄存器,不带时不同模式下寄存器可能是相同的。

保存现场,就是保存当时运行的寄存器地址。带灰色寄存器的保存时可以不用保存,因为那时人家专属的寄存器,想用时就用。

第14课第3节
(1)
BX 指令
BX 带状态切换的跳转指令
BX 指令的格式为:

BX{条件} 目标地址

BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。

2、 BL 指令
BL 指令的格式为:

BL{条件} 目标地址

BL 是另一个跳转指令,但跳转之前,会在寄存器R14 中保存PC 的当前内容,因此,可以通过将R14 的内容重新加载到PC 中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以下指令:

BL Label ;当程序无条件跳转到标号 Label 处执行时,同时将当前的 PC 值保存到 R14 中

(2)
adr r0, _start
取得 _start 的地址到 r0,但是请看反编译的结果,它是与位置无关的。其实取得的时相对的位置。
LDR R0, [R1]
这条指令的意思是,将R1中的值作为地址,将地址里面存的值复制给寄存器R0。
(3)
b reset 代表一上电从0地址开始。
(4)
首先一句话说一下stmdb和ldmia指令的作用:

stmdb和ldmia指令一般配对使用,stmdb用于将寄存器压栈,ldmia用于将寄存器弹出栈,作用是保存使用到的寄存器。
指令:stmdb sp!,{r0-r12,lr}
含义:sp = sp - 4,先压lr,sp = lr(即将lr中的内容放入sp所指的内存地址)。sp = sp - 4,再压r12,sp = r12。sp = sp - 4,再压r11,sp = r11…sp = sp - 4,最后压r0,sp = r0。

如果想要将r0-r12和lr弹出,可以用ldmia指令:

指令:ldmia sp!,{r0-r12,lr}
SDRAM的基地址是0x3000 0000

第14课第5节 异常模式之swi异常
MRS指令的格式为:
MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情冴:
Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
Ⅱ.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
指令示例:
MRS R0,CPSR @传送CPSR的内容到R0
MRS R0,SPSR @传送SPSR的内容到R0

从上面提取1个知识点:CPSR或SPSR这两个是状态寄存器,r0是通用寄存器。

BIC―――――位清除指令
指令格式:
BIC{cond}{S} Rd,Rn,operand2
BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。
eg:bic r0, r0, #(1<<7) 代表将r0和1011 1111相与,结果存放到寄存器r0中。

你可能感兴趣的:(嵌入式Linux笔记,linux,stm32)