一开始没有编写链接脚本文件.lds的时候,问题出现在makefile文件中的objs定义中main.o和start.o的位置先后,必须将start.o文件放在main.o文件的前面,不然起始地址0x87800000会直接对应到主函数中去。具体如下:
最近再学习Linux嵌入式逻辑开发,学习到用c语言编写的时候,按照正点原子的教程,首先编写了汇编启动文件start. s,代码如下:
然后就是和32类似,c语言编写主函数,首先需要在main.h中进行寄存器得地址的宏定义,代码如下:
之后就是main.c的编写,main.c中首先要开启时钟的使能,分别对寄存器直接操作,然后是led的初始化,在分别写了led开和led关的函数、1ms的延时函数等。在主函数中,先初始化时钟使能和led灯,然后while中进行led灯闪烁的循环,延时是500ms,代码如下:
最后就是Makefile文件的编写,首先定义objs包含两个.o文件,然后是生成文件.bin文件的依赖,依赖下面就是链接的指令等,然后.o依赖于.s文件、.c文件,最后clean函数。
最开始我以为objs包含两个.o文件没有先后顺序,所以我就将main.o放在了start.o文件的前面,如下所示:
然后编译的时候都能通过,烧写程序在板子的时候没有现象,我开始检查错误,挨着对照,一开始不知道是这个原因,然后我就去看反汇编文件.dis发现最开始的地址0x87000000是对应的主函数,不是启动程序,如图所示:
我就知道了main.o放在了start.o文件的前面,当然这是没有写链接文件.lds的情况,然后我把main.o和start.o文件换了位置,makefile文件如下:
此时查看dis文件可以发现起始位置就是start启动文件程序了,如图所示:
此时烧写到板子中去就可以观察到led灯闪烁的现象,之后编写链接文件.lds之后,objs中的顺序就没有关系了,在.lds文件中直接将起始地址0x87800000对应到启动文件,此时就不会出现以上情况,代码如下:
当然对应的makefile文件指令也要发生变化,对应变化为:
以上就是我碰到的问题解决方法和总结啦!!