uboot启动后在内存中运行裸机程序hello

发布时间:2023-09-06  

如题,实现过程中发现3额问题,先写下来,待解答:

1、uboot启动后再dnw上打印许多信息,我想改变其中的打印信息或加上自己的打印信息以证明程序运行到何处。修改完后重新编译uboot.bin。

在DNW下执行dnw 50008000 USB下载uboot.bin到内存50008000处, go 50008000,从内存50008000处运行我刚下载的程序,发现我修改的内容并未显示。

重新执行dnw 50008000,nand erase 0 100000,nand write.uboot 50008000 0 100000,后从nand直接启动,发现我修改的内容被打印出来了。

总结:可能的原因:1、程序下载到50008000,但50008000处并非有执行命令。2、确实从50008000处执行了,但uboot.bin里的start.s会调用原来nand里的uboot.bin执行

 

2、uboot里有个examples文件夹里有hello_world应用程序(姑且这么说吧):

我dnw 50008000 hello_world.bin,go 50008000,执行后重启了。

看了makefile里LOAD_ADDR = 0xc100000,dnw c10000 hello_world.bin,go c1008000,执行后停住了

然后又看了半天makefile,太繁琐,无果,没解决掉。

 

3、自己写了个hello.c

dnw 50008000 ,go 50008000,运行ok,打印出hello world.

参考并引用:http://blog.csdn.net/liushaowei2008/article/details/7739046

printf函数是uboot 实现的,我们只需要调用就行了。当然了,这个首先得到你uboot 的printf函数地址。这需要你自己编译 uboot,因为每个人
的printf函数地址不一定一样。查看System.map文件 ,找到printf地址。就行了。
调用时我们可以这样用:

  1. void (*show)(char*,...) = 0xc7e11650;

  2. ........

  3. show("hello world/n");

  4. .......

现在我们来个hello world 的例子:
贴一下代码:

  1. void (*show)(char *,...) = 0xc7e11650;


  2. int main(void)

  3. {

  4.     show("hello world./n");

  5.     return 0;

  6. }

(hello.c)
就这么简单。(一个hello world 能多复杂啊?嘎嘎~)
下面我们来说一下编译和连接:
你也会用:arm-linux-gcc hello.c
但是这是不对的,为什么呢? 我们来仔细想一个问题,我们是裸机(好吧,我承认稍微穿了一点),没有操作系统 。想想arm 执行时,它希望
执行的第一条指令是什么?肯定是一条有效的指令了。但是我们生成的这个a.out的前面是有效的可执行的语句么?也许你已经想到了,它的头不是什么
有效指令,是ELF头信息,还有你的用户 名呢,用户名不能执行吧?呵呵,开玩笑。

还有一个问题。
gcc默认的连接地址是你想要的么?八成不是吧。
鉴于以上原因我们要分步进行:
1:编译
arm-linux-gcc -c hello.c -o hello.o
生成hello.o文件。
2:链接 指定我们要的链接地址0x50000000
arm-linux-ld -Ttext=0x50000000 hello.o -o hello
这时你用arm-linux-objdump -d hello 反汇编一下,看看指令的起始地址是50000000吧?
3:去除头ELF头信息
arm-linux-objcopy -L elf32-littlearm -O binary hello hello.bin
这里elf32-littlearm 是指定大小端,咱小端的。
就这样,我们可以在裸板上运行 的二进制程序 就这样成了。为了以后方便可以把上面的指令写在Makefile里,一个make就all了。


总结:就是函数的入口地址搞不清楚,不是在50008000,故失败,先放这里,这个不着急,等有时间再来仔细研究研究。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    稳定运行的一个频率,后面会具体讲;“8GB”就是内存容量,除了8GB之外还有16GB或32GB的单条内存。 三、内存跟硬盘的区别 很多电脑小白还会有疑问,就是内存跟硬盘到底有什么区别?为什......
    新年新气象,蓝豹王DDR4内存条助用户解锁更多工作游戏体验;随着时间的不断推移,春节假期逐渐临近,用户提升电脑配置的愿望也因此变得日益浓烈了起来。近日,推出了新款 紫豹系列,为用......
    插槽位置,2个内存条,最高支持32G内存条。 拆开电脑后,比较一下科赋内存条和三星内存条两根有啥不同的地方。科赋内存条的面板显得PCB板显得更好看一点,纯色设计,纹路设计不明显,观感......
    已报废不适合使用。软件可以正常识别,但自身稳定性却远不如原厂正品。 办案人员在对山寨内存条检测后发现,虽然放入电脑中一段时间内可以保证电脑正常运转,但时间一长功能就会下降,导致电脑运转速度缓慢,其容......
    笔记本电脑内存条芯片加固保护用底部填充胶方案; 客户是一家主要以计算机(含嵌入式计算机)、存储设备、存储系统、软件及辅助设备、电子器件和元件销售;存储产品设计、车载计算机设计、加固......
    简而不减,戴尔OptiPlex再造台式机体验;OptiPlex历经30年创新,如今,购买和管理性能可靠的台式机变得前所未有地简单你还记得小时候的“微机课”?那时候,相比于音乐、美术、体育课,微机......
    以STM32F407ZGT6单片机来讲解一下扩展外部SRAM;现在的电子系统应用,对SRAM要求越来越高,单片机或ARM内部的RAM越来越不够用。当电脑运行比较卡的时候,我们可以通过给电脑加装内存条来改善电脑......
    广大消费者喜爱,为使用者升级电脑首选。严选高品质SK海力士颗粒,符合JEDEC标准规范,并通过各大主流主机板厂QVL测试,兼容于Intel与AMD系统平台。此次升级的KLEVV科赋U-DIMM标准内存条......
    考虑卸载它们并使用替代程序。 4. 增加物理内存:如果你的电脑物理内存较小,并且频繁出现内存占用过高的情况,考虑增加内存条。更多的内存可以提供更好的多任务处理和应用程序运行性能。 5. 检查病毒和恶意软件:计算机感染病毒或恶意软件可能导致内存......
    花式DDR4内存条:加入RGB“光源污染”、还外接4Pin;现在玩手机的越来越多,DIY电脑的实质上是越来越少,而且就PC本身来说,产品形态也趋于稳定,难觅新亮点。 “不在沉默中爆发,就在......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>