嵌入式启动方式-从Nand启动cpu .上(学习整理笔记)
《嵌入式Linux应用开发完全手册》6.2章节
方法:结合51单片机的知识基础进一步了解嵌入式s3c2440的程序启动方式
----------------------------------------------------------------------------------------------------
先了解单片机启动方式:51单片机上电后就可直接启动执行程序的原因(这比嵌入式简单多了)
要了解单片机工作方式,先得了解其硬件组成原理:
单片机外部存储分为1.程序存储器 2.数据存储器(内存)如下
1.程序存储器 2.数据存储器(内存)
存放你所编写的程序 -> ......... 存放数据变量-> ...........
pc指针指向你所要执行的程序-> ..........
-------------------------------------------------------------------------------------------------------
1.单片机既然能执行我们写好的指令程序,那它的指令存放在哪?
——单片机既然要执行程序,那它必然有一个空间用来存放所要执行的程序以方便提取(就好比电脑中要用硬盘存放各种软件程序一样)。所以程序存储器就是这么一个设备用来存放执行程序的。
------------------------------------------------------------------------------------------------------
2程序指令放在程序存储器中有什么规定或规律?
——这得先知道怎么把程序指令放入程序存储器中。
首先我们在电脑中写好了程序,用编译软件将它生成为存放在硬盘中的一个文件(二进制的.bin文件,而不是.c文件)。
此时指令文件仍旧在我们电脑硬盘上,必须将它传入单片机中才能让单片机工作执行(我们开发的最终 目的是要让写好的程序在单片机上运行,而不是在我们的电脑上,电脑只是方便我们写程序的)
存储器的存储和读取原理很简单,就好比我们在图书馆借书和还书一样。你拿书时只要清楚的告诉图书管理员你要的书在哪一个书架的第几排第几格,就能拿到。你知道书的存放地址,就好比知道数据在存储器中的地址一样,是哪还是存就看你实际的操作了。
数据在存储器中的地址就用0x00000~0xfffff这些数字来表示(十六进制总得知道吧?)
比如你要将一个字节的字母a存入0x000003,那首先通过地址线向单片机的存储器发送地址信号0x000003,然后同过数据线将字母a送给存储器。这还没完,再通过控制线发送写信号给存储器,这时存储器就会把a存入它的地址为0x000003的一字节空间了。
电 ->地址线 (0x000003)----------> 单 存
0x00000 (1字节)
脑 ->数据线 (a)--------------------> 片 储
0x00001 (1字节)
最后->控制线 (写信号)---------------> 机 器
0x00002 (1字节)
0x00003 a
(1字节)
...................
0xffffff
-------- 所以,我们完全可以决定将所写的程序指令存放到单片机程序存储器的任意位置(参考单片机的程序烧制)
--------------------------------------------------------------------------------------------------------
3不要纠结于程序到底该放在存储器的哪个位置,先来看看程序怎么被读取并执行的。
假设程序寄存器的地址从0x000000到0xffffff
为什么我们一开机,单片机就会自动执行指令,它怎么知道指令的第一条是放在存储器的哪个位置?
单片机的方式很简单:上电启动后,pc指针默认指向程序存储器的0000000地址,cpu首先取得的是000000上的第一字节的程序指令。我们只要把写好的程序从000000开始依次存入单片机中,它就会自动的先从000000拿指令来开始执行了。(这是最简单的方式)
---------------------------------------------------------------------------------------------------------
4单片机启动后读取程序指令的方式可以更改吗?
—— 不可以
启动后默认pc指向程序寄存器的000000地址,我们不能更改为默认指向00000003或者其他地址。
原因是:这是一个固定的启动方式,由硬件决定也是出厂后制造商设定好的,我们只要遵循就好。
那假如我首先要执行的程序指令存放在了地址000008怎么办?
——在汇编语言中有跳转指令jmp
我写一个伪指令存放在程序存储器的方式如下:
1步 pc -> 0x000000 jmp 0x0000008
0x0000.....
2步 pc-> 0x000008 main()函数{
3步 pc-> 0x000009 int a=10;
0x00000.... ...........;
pc首先从00000取指令,因为jmp跳转命令pc+8跳到了000008,然后pc从00008取指令,如果没有跳转指令,pc+1继续往下取指令。
所以程序是可以灵活存储的,只要你懂原理
---------------------------------------------------------------------------------------------------------