请选择 进入手机版 | 继续访问电脑版
搜索
热搜: XMC1000 XMC4000
查看: 499|回复: 2

一位久经沙场的嵌入式er站在初学者角度谈谈嵌入式开发与...

[复制链接]

15

主题

15

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2018-2-7 14:45:50 | 显示全部楼层 |阅读模式
一位久经沙场的嵌入式er站在初学者角度谈谈嵌入式开发与学习的一些问题
在刚刚涉足嵌入式开发的时候,总想找到这样一本书,它可以解决我一些这样那样的疑惑。但是遗憾的是,到现在也没有这样一本书面世,而且我想永远也不可能面世了。因为我的疑惑太多太杂了。这些疑惑在教科书中又难以寻找到答案。C 教程注重讲C 的语法,编译原理注重讲语法,语义的分析。每一门教科书都是有它的注重,所以那些交叉的问题便成了三不管。市场上的那些自称为《XX 宝典》、《XX 圣经》的书却总是说一些可能连作者自己也没搞清楚的问题。于是我想,我想了解的也许是大家都想了解的吧,那么把我学到的一点东西写出来,大家也许就可以少花点时间在上面,留出宝贵的脑力资源去做更有意义的事。
语言选择,C 还是其他
刚刚涉及嵌入式开发者总是先阅读一些指导类型文章,然后就开始对开发语言的选择踌躇不决。是C 还是C++?还是好像更热门的JAVA?不用犹豫,至少目前看来C 还是你的选择。嵌入式开发的本质是订制开发,硬件平台林林总总,处理能力高下不同,如果想保护你学习精力投资的话,C 是最好的优绩股C++的优点在于它的代码重用,但是效率比C低很多,最重要的是,并非所有芯片的编译器都能支持C++JAVA 就更不用提及,在一个虚拟平台上开发的优点是不用关心具体的硬件细节,但这不是一个嵌入式开发者的作风,换一种说法,这种开发不能称之为嵌入式开发。
C被称为高级语言中的低级语言,低级语言中的高级语言,这是因为其一方面有高级语言所具有的接近于人类思想的语言体系,另一方面同时支持地址与位操作。可以方便的与硬件打交道。嵌入式开发必然要操作IO、硬件地址,没有位操作和指针你又如何方便做到?
嵌入式开发一般流程
嵌入式开发的流程与高层开发大体类似,编码——编译、链接——运行。中间当然可以有联机调试,重新编码等递归过程。但有一些不同之处。
首先,开发平台不同。受嵌入式平台处理能力所限,嵌入式开发一般都采用交叉编译环境开发。所谓交叉编译就是在A 平台上编译B 平台上运行的目标程序。在A 平台上运行的B 平台程序编译器就被称为交叉编译器。一个初入门者,建立一套这样的编译环境也许就要花掉几天的时间。
其次,调试方式不同。我们在Windows 或者Linux 上开发的程序可以马上运行察看运行结果,也可以利用IDE 来调试运行过程,但是嵌入式开发者却至少需要作一系列工作才能达到这种地步。
目前最流行的是采用JTAG 方式连接到目标系统上,将编译成功的代码下载运行,高级的调试器几乎可以像VC 环境一样任意的调试程序。再者,开发者所了解层次结构不同。高层软件开发者把工作的重点放在对应用需求的理解和实现上。
嵌入式开发者对整个过程细节必须比高层开发者有更深的认识。最大不同之处在于有操作系统支持的程序不需要你关心程序的运行地址以及程序链接后各个程序块最后的位置。像WindowsLinux 这类需要MMU 支持的操作系统,其程序都是放置在虚拟地址空间的一个固定的内存地址。不管程序在真正RAM 空间的地址位置在哪里,最后都由MMU映射到虚拟地址空间的一个固定的地址。
为什么程序的运行与存放的地址要相关呢?学过汇编原理,或者看过最后编译成机器码程序的人就知道,程序中的变量、函数最后都在机器码中体现为地址,程序的跳转,子程序的调用,以及变量调用最后都是CPU 通过直接提取其地址来实现的。嵌入式学习企鹅意义气呜呜吧久零就易。编译时指定的TEXT_BASE 就是所有一切地址的参考值。如果你指定的地址与最后程序放置的地址不一致显然不能正常运行。
但也有例外,不过不寻常的用法当然要付出不寻常的努力。有两种方法可以解决这个问题。
一种方法是在程序的最起始编写与地址无关的代码,最后将后面的程序自搬移到你真正指定的TEXT_BASE 然后跳转到你将要运行的代码处。
另一种方法是,TEXT_BASE 指定为你程序的存放地址,然后将程序搬移到真正运行的地址,有一个变量将后者的地址记录下来作为参考值,在以后的符号表地址都以此值作为参考与偏移值合成为其真正的地址。
听起来很拗口,实现起来也很难,在后面的内容中有更好的解决办法——用一个BootLoader 支持。另外,一个完整的程序必然至少有三个段TEXT (正文,也就是最后用程序编译后的机器指令)段、BSS(未初始变量)DATA(初始化变量)段。前面讲到的TEXT_BASE 只是TEXT 段的基址,对于另外的BSS 段和DATA 段,如果最后的整个程序放在RAM 中,那么三个段可以连续放置,但是,如果程序是放置在ROM 或者FLASH 这种只读存储器中,那么你还需要指定你的其他段的地址,因为代码在运行中是不改变的,而后两者却不同。这些工作都是在链接的时候完成,编译器必然为你提供了一些手段让你完成这些工作。
还是那句话,有操作系统支持的编程屏蔽了这些细节,让你完全不用考虑这些头痛的问题。但是嵌入式开发者没有那么幸运,他们总是在一个冷冰冰的芯片上从头做起。CPU 上电复位总是从一个固定的地址去找程序,开始其繁忙的工作。对于我们的PC 来说这个地址就是我们的BIOS 程序,对于嵌入式系统,一般没有BIOS 支持,RAM 不能在掉电情况下保留你的程序,所以必须将程序存放在ROM FLASH中,但是一般来讲,这些存储器的宽度和速度都无法与RAM 相提并论


本帖子中包含更多资源

您需要登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

2

主题

11

帖子

100

积分

注册会员

Rank: 2

积分
100
发表于 2018-2-8 10:09:01 | 显示全部楼层
好文章
回复

使用道具 举报

0

主题

36

帖子

203

积分

中级会员

Rank: 3Rank: 3

积分
203
发表于 2018-3-13 14:32:26 | 显示全部楼层
可以看看,不错的文章。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|英飞凌技术社区

GMT+8, 2018-8-20 14:39 , Processed in 0.099086 second(s), 14 queries , APC On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表