7 {# n6 P, W' v6 i& D4 z
( O2 V8 m. _7 p' L7 E# n
* P7 P1 b% N s- Q
在定时器中断和外中断会先执行EXCEPTION_HANDLER宏,目的是执行中断处理之前的现场保护,跳转至中断服务函数,执行完中断服务函数之后的现场恢复,中断的概念不用多解释了,应该是很熟悉的了。2 H: l+ f# D* K* @0 Y. M5 R
4 T0 `9 E3 t }% M) ~1 g! S 关于or1200中断的流程可以参考《CPU源代码分析与芯片设计及Linux移植》,里面讲得蛮详细的,虽然大部分也是翻译手册的,至于附件的代码关于reset.S剩余部分不是特别难,就不解释了,不解释咯······7 h/ }1 e7 e! T9 m6 \
7 b" P* I7 K+ a7 S% @; P
突然发现,reset的异常向量我们就敲完了,在reset向量里会跳转至main函数,那就开始了,main函数熟悉了吧, - _+ Y) Z0 t: b' Y* \ U 0 T; t5 _1 ]) S3 J: y+ Z 附件中的uart.c和uart.h关于UART16550的串口驱动和头文件,程序不难,对比着uart16550_latest.tar.gz的说明文档、《开源软核处理器OPENRISC的SOPC设计》和源码的注释5分钟就可以看懂了,不详细说了,因为大家都有C语言功底嘛。 9 D" W. T4 ~6 }. o, e& L8 K 1 B4 J3 I1 @$ ]9 B. [. E% n4 ^ 至于附件driver和include的其他文件可以先不管,因为现在还用不上,有兴趣可以自行翻阅下,是关于中断二级向量表的实现和timer的驱动,大部分都是参考u-boot下openrisc架构修修改改过来的,所以最好还是稍微浏览下,然后在下次移植u-boot时能快速上手。! k9 a& |7 ~" n1 x! x4 Q( c
% D& f6 f) `3 Z0 A
Main函数更不用多说了,手痒自己随意打的,随便修改吧,至于里面的函数用sourceinsight追一下就可以了,都是比较简单的东西了。, Y" B8 T* j, k$ Y7 g9 R: p( q% ]: v# ?
9 d& j. r* t: ]; k3 `. A* [" W X* o
UART的代码到这里我们就敲完了,最后就是把程序下到我们的SDRAM中运行了,好,在下到SDRAM之前呢,还需要编写一个连接脚本文件,告诉编译器编译出来的可执行程序各个段的存储位置,入口地址,在学校学汇编和计算机原理的时候都应该讲过这些的了,就是编译源码后得到的可执行bin文件的在RAM的存储位置,例如在link.lds文件中6 S" @- C& w6 z# H# _' Q1 V$ o+ j