loader是系统上电后第一个启动的程序,它要做些什么呢,这可能和实际上loader的功能有关系,但是大部分是通用的,我感觉它和正常的嵌入式程序启动差不多,但又有他的特别之处;首先要想cpu执行的指令和数据从哪里来,这个基本上都是从flash上,不管是NAND、NOR原理上都是一样的,每个系统都有内存控制器,决定一定地址空间的读写参数,如总线读与周期、总线宽度等;但是系统上电后是没有经过任何配置就能直接从flash上读出数据的,这是为什么呢?原因是内存控制器的默认设置和flash的读写要求是一致的,这是soc做好的,下面开始说启动过程。
1、上电后产生reset中断,cpu要执行0地址上的指令,就从flash上读取到cpu的PC寄存器,而这时PC的内容肯定是一条跳转指令,接着跳到reset中断处理程序里开始系统的初始化。
2、首先要禁止watch dog,要不过一会没人喂狗就又会reset。
3、要禁止所有中断,因为我们现在还没有为各种异常模式设置好栈,来了中断中乱了。
4、设置cpu、AHB、APB的时钟,不对吧,难到没有时钟我们的程序会执行到这吗?是这样的刚上电时是有时钟的,只不过这时CPU直接用板子上提供的,比较慢,现在要用内部的时钟的锁相环了,把时钟设置到系统的最大值。
5、内存控制器配置,为什么要配置它呢,别忘了我们现在还在flash上执行,我们要去内存,那里比这好啊,快!最开始已经说内存控制器了,这里就要根据实际SDRAM对内存存制器进行配置。
6、把flash里loader的代码和数据全部移到内存里,至于放在内存的什么位置不重要。
7、这是有两个loader一个在flash一个在sdram里,跳到内存里执行下一条指令,这是在flash里的loader就没用了,下一次再用。
8、设置各种模式下的栈空间,要不中断来了不能处理,而且也不能执行函数。
9、这回该做什么呢?最基本的工作做完了,就不会汇编了,去C语言的main吧。
10、这会可以用C写程序了。
12、还有事可做吗?有,两件事:1、设置GPIO确定所有可选引脚的功能、2、设置MMU。
到此为止所有通用的也是最基本的工作都作完了,剩余的要根据你的实际要求添加代码了。
阅读(1266) | 评论(0) | 转发(0) |