您的位置 首页 新能源

用uboot调试裸机C言语

昨天用uboot14调试了一下基于s3c44b0的一个LED灯实验,成功,纪录下:最初的设想是想用uboot的loadb命令来调试自己移植的uboot,发现串

昨日用uboot1.4调试了一下根据s3c44b0的一个LED灯试验,成功,纪录下:

开端的想象是想用uboot的loadb指令来调试自己移植的uboot,发现串口没显现,其时就晕了 就不想再动了,原因可想而知是各式各样的,难~~~ 但再想想是不是思路有问题,就计划写个裸C来试下loadb指令。

整个程序便是完成个流水灯(也就只需三个LED),就叫做led.c吧,编译成led.o,再用arm-elf-objcopy成led.bin,经过串口,用uboot指令loadb 0x0c008000 用超级终端传送一下,(很快,一下而过)发现板子没反应,(又晕了)只需找google了(仍是引荐google,百度仍是差点)发现还要链接,那就arm-elf-ld -Ttext 0x0c008000 -nostdinc -o led.elf led.o(不是很懂为什么要加-nostdinc 然道是为了帮ld省劲,不要去找stdinc??)。再次loadb 发现板上的灯仍是没动静()这可杂办呢~~~

再次使出google大法,再看看自己的led.c~~~~~(时刻很长

总算找到了一点有用的:“关于裸机C程序,进口函数应该放在文件最前面”

然道我的灯不动便是由于在entry()之前写了一个delay()????

那就试着改一下吧,一切其他函数都写在entry()之后,再次arm-elf-gcc arm-elf-as arm-elf-ld arm-elf-objcopy~~(各种难啊~~)最终loadb 0x0c00800~~~~~~~

总算是见到板上的LED如程序所写相同的动起来了~~(激动啊

激动之后再想想,觉的所谓的裸C程序,进口函数应该在文件最前面 这一点甚是不明白啊,再次讨教google大叔,哎,发现有关的太少了,看样子是没多少人研讨这个了~~~

忽然想到arm-elf-readelf这个东西,仍是用用吧,翻开led.elf看看,所以在arm-elf-readelf -a led.elf效果下,显现了一大堆,其时就眼花了,怕了~~~

仍是渐渐来吧,一步一步来,先arm-elf-readelf -h led.elf

仍是能看懂的,十分简略的几个english word 再次arm-elf-readelf -s led.elf

感觉自己要的东西呈现了~~~~

呈现了相似表单的文本,不明白头几个单词的意思()却在下面发现了entry ~~

还在同一行看到了0c008000 应该是说在0x0c008000这个当地有一个entry 哈哈,这个我懂啊,所谓的程序进口函数嘛,我的程序便是要在0x0c008000处开端运转啊

所以我再改回我本来的led.c,把delay()放在entry()前面,再次arm-elf-readelf -s led.elf,发现

在0c00800 一行上对应的是 .gcc2_compiled 而entry这一行对应的地址却是0c00802c

哎,这才总算在猜想+测验中发现所谓的裸C程序进口函数为什么要放在最前面了(仅仅猜想没人告诉我why)裸C程序里的函数放置地址是按函数完成的地址来放置的 便是说在内存中函数的放置地址次序与在文件中的完成次序是对应的~~ 而非裸C程序,乃至只需加了个符号链接的话,在内存中的履行地址与程序文本中的完成地址是无关的~~

~~~由此牵扯出的一大堆问题怕是难以一下处理的了,哎 难~~~

路漫漫其修远兮~~~~~~~

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/319419.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部