Linux嵌入式裸机开发led灯实验无现象的原因

一开始没有编写链接脚本文件.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文件指令也要发生变化,对应变化为:

以上就是我碰到的问题解决方法和总结啦!!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值