嵌入式软件系统开发历程

大家好,今天我来介绍一下我自己的大概履历,尤其是我的嵌入式软件开发历程。
现在我在忙着找工作,我发现许多来学校招聘的企业都是招聘Java研发工程师、ios、Android开发工程师。因为最近一年都在做嵌入式软件开发,有些慌乱。怀疑会找不到工作。
本科是软件工程专业出身,因为在大学之前我对计算机技术的了解几乎是空白,之前没有接触过计算机设备,大一的时候C语言挂科,计算机程序设计实践重修。即便如此,最后还是保研了。大一一学年以及大二上学期我的成绩一直都是处于专业里中游的水平。后面我渐渐适应了大学里的学习节奏,你可能觉得我怎么适应的这么慢,其实我那时候也玩游戏。这些就不说了。总的来说,依照我本科时候的技术水平,我是找不到工作的。我十分承认这一点。自然有许多比我技术水平还要差的同学,他们最后能够找到工作,我也感觉没什么。之所以能够保研是因为从大二学年下学期,我就努力的去自习,我那时候很迷茫,但没办法,觉得只要努力学习就对了。可以说也是幸运的。最后两学年综合成绩达到专业前五名。我曾经到过苏州实习,其实就是学习Android开发技术。我担任我们那个小组的组长,最后开发了一款小型的APP。
研究生期间参与了一个小型项目、两个中小型项目。第一个项目是关于物联网无线通信技术的。我负责协助Android客户端的开发。但是现在关于Android我已经有些生疏了。所以一开始校招我还网申了一些移动客户端的开发岗位。经历了腾讯、新浪、网易等大公司笔试的打击之后,我开始思考我到底适合什么。有一段时间,我感觉只要是一份软件开发的工作我都可以胜任,但是因为一直忙于科研项目,没有任何准备,总是在编程题上栽跟头。尽管我一直在进行嵌入式系统软件开发的工作,但是关于数据结构中的图、树甚至链表我都没有用到。从最开始到现在,我从一个C语言挂过科的同学,成长为能够独立承担一个嵌入式项目软件系统的开发。只是一年的时间,我学会了C语言中的socket通信,多线程并发、内存动态分配等技术。我不知道自己到底是什么水平,实验室一起做项目的同学都说我很有能力,但是现实却是我没有找到工作。我也很困惑。我知道自己技术确实一般,但是我不想再傻傻接收许多技术比我差的人都拿到Offer我却一个都没有的尴尬境地。自己有些不善言谈。面试的时候,别人问我什么我都如实回答。忘记了就是忘记了,不在熟悉就是不在熟悉,但也不代表我不能够快速上手,不能够完成分配给我的任务。但别人怎么相信,毕竟求职大军实在是人数太多。但人们不了解并不影响我继续努力。
从去年9月份我开始使用C语言进行项目的开发,从一个源文件到两个、三个、到一个完成的工程。一直都是我一个人在编程序。我也确实参与了华为公司某个部分的协助开发调试工作,那时候甚至加班到晚上十点多钟解决开发中遇到的问题。我也确实参与了项目中设备的实地安装与调试。所以我还是相信自己的能力。我技术确实不够精通,我会Linux内核的裁剪,但是并不太了解Linux内核驱动。只要有资料和指导文档,我可以尽职尽责的做好BSP搭建、编译与调试这项工作。但是我该怎么描述,仿佛只要我一开口,就会暴露自己对知识了解不够底层的缺陷。我自然也想学会许多物联网与嵌入式的底层核心知识,但是我一直都是自己钻研,周围做嵌入式开发的人屈指可数,有些同学是在我原来的工程源码上了解嵌入式软件系统开发的基础。

已经一年了,嵌入式软件开发过程中我遇到过很多难题,尤其是硬件模块的调试。有时间我会再好好整理自己曾经遇到的问题与解决方法。现在一心想要找到一份嵌入式Linux开发的工作。我我会尽心尽力完成我的任务,也会积极帮助团队成员解决项目开发中遇到的问题。但是怎么才能够让面试官相信我呢。现在没有Offer不代表将来我的技术水平不会超越别人。还是相信自己。早就海投简历了,投了一些国企,也投了一些小企业。希望自己能够安心继续科研项目的工作,顺利完成我的学业生涯。也希望自己将来入职,能够遇到一群努力认真工作的人。这样很多事情都会有效率上的提升。

下面是我一些粗略的总结,都来自于我亲身的体验。

1、首先熟悉串口设备编程,网上有一些通用的串口操作函数。比如设置校验位、波特率以及串口的读写(其实就是对Linux下文件句柄的操作)
2、串口有时候读取或写入异常就要检查一下有些字符的校验设置选项
3、工程模块一个个添加,在最开始就要有一套自己的编程规范,比如说怎么定义变量,怎么定义函数名,怎么定义宏。如果没有标准,工程迟早会乱掉的。之前开发Android工程也是一样。就是要有一套自己的软件设计规范,就像设计一套通讯协议标准一样。然后很重要的一点就是注释。即便是自己的程序,不写注释,一个月之后看着也会变得很陌生。
4、硬件部分的调试一定要多询问硬件开发人员,因为自己在那里钻研只是浪费时间,也不了解原理。与硬件开发人员一起调试设备可以学到一些很有用的知识。当然最好还是有一份指导文档。按照指导文档来做就会事倍功半。
5、嵌入式软件系统的开发最开始不会用到数据结构的难点,只是数组就可以解决大部分的问题。但是定义变量的时候要注意它的作用域,尤其当你开启了多线程之后,变量的值恐怕不再是你想的那样。还有一点就是动态分配的内存一定要注意释放,然后置空,否则内存泄漏的问题严重会导致系统崩溃。
6、我学会了使用JTAG烧写特殊格式的文件到NAND Flash中,使用的就是Xilinx官方的开发工具,Xilinx官方也有一些指导文档,只不过是英文的,需要自己找一些命令来操作。还有就是将image.ub第一次烧写到内存中,让系统现在内存中运转起来。然后拷贝格式化emmc的文件。之后挂在emmc,再之后自然是直接将image.ub拷贝到emmc上面。那么下次系统再启动的时候就不要自己手动输入image.ub文件在内存中的起始地址。BOOT.BIN会自动到emmc上面去寻找image.ub文件,从而启动片上Linux操作系统。
7、关于一些硬件模块的管脚,就是GND接GND,电压接电压。然后RX接TX,TX接RX。注意电压大小要相同,否则就需要转压模块。
8、测试温度传感器需要在最开始编译BSP的时候进行配置,petalinux有图形化的配置页面,根据官方要求进行配置项的选择,之后保存编译。(4G模块 RTC模块也是一样)
9、嵌入式系统还有最重要的一点就是要有配置文件,记录下系统动态或者远程修改的配置,防止系统重启或者异常断电导致配置丢失。
10、普通的嵌入式系统必备的功能有自动校准时间功能,平台通讯功能、传感器数据采集功能、远程更新功能。还有最重要的主控程序。这些都是基本的功能,其他的模块可以根据具体场景与需求动态扩展。

今天,就先说到这。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
 本书内容   本书的各个章节及其组织方式如下所示。   第1章“Android系统概述”,概述Android系统方面的内容,包括智能手机平台的发展历程、Android系统的特点、Android的3种开发工作,以及Android的2种不同的开发方式。   第2章“Android系统开发综述”,介绍Android系统开发的综述性内容,包括工具使用、获得代码、编译系统、仿真器运行、SDK使用等。   第3章“Android的Linux内核与驱动程序”,介绍Android内核的特点、Android中使用的专用驱动程序、Android系统可能使用的标准设备驱动。   第4章“Android的底层库和程序”,介绍Android系统的基础程序,以本地程序为主。   第5章“Android的Java虚拟机和Java环境”,这是介于本地和Java层之间的相关内容,主要介绍Android的Java虚拟机Dalvik的基本概念、Android Java程序的环境、JNI的使用方法,以及Java框架的启动流程等。   第6章“Android的GUI系统”,包括Android GUI系统架构、底层的pixelflinger和libui库、Surface系统、Skia和2D图形系统、Android的OpenGL和3D图形系统等内容。   第7章“Android的Audio系统”,主要是音频的输入输出环节,音频系统从驱动程序、本地框架到Java框架都具有内容。   第8章“Android的Video输入输出系统”,介绍Android的Video输入输出系统,包括Overlay系统和Camera系统两个部分,前者只有本地的内容,后者各个层次均有内容。   第9章“Android的多媒体系统”,介绍Android的多媒体系统的核心部分,包括Android中多媒体系统的业务、结构、多媒体系统的核心框架、OpenCore系统结构和使用等内容。   第10章“Android的电话部分”,介绍Android系统在电话方面的功能,Android是智能手机系统,电话是其核心部分。   第11章“Android的连接部分”,主要包括WiFi、蓝牙及定位系统等,这些Android的连接部分也具有从驱动层到Java应用层的结构。   第12章“Android的传感器系统”,传感器系统涉及Android的各个层次,具有完整的结构,相比其他系统,传感器系统的各个层次都比较简单。   第6~12章分模块介绍Android的几个核心系统,主要是本地框架和Java框架方面的内容,兼顾应用程序和驱动层,这是本书的重点。   第13章“Android应用程序概述及框架”,介绍Android应用程序层的基本概念和应用程序框架,这部分内容是Android自下而上的第4个层次,可以基于源代码或者SDK开发,它们之间的差别非常小。   第14章“Android应用程序的主要方面”,介绍Android应用程序层开发的各个方面,基本上是横向内容,包括应用程序的基本控制、各种UI元素的使用、图形API使用3个方面的内容。   第15章“Android应用程序的设计思想”,本章的内容是基于通用的应用程序和GUI程序的通用设计思想,结合Android系统自身的特点,提出一些值得注意的问题和设计方法。   本书读者   本书适应广大的读者群,力求在Android的系统移植、应用程序开发系统框架改进方面给读者全面的支持。不同的读者在学习本书时,应该使用不同的方法。   Android初级开发者:在本书指引下阅读代码,搭建系统开发环境,对于Android应用程序的开发者,重点关注后3章的内容。   Android中、高级开发者:通过本书的引导,学习系统架构,关注开发要点,并尽量使用手机系统的通用设计思想、软件工程思想、系统工程思想来指导Android系统学习。   嵌入式Linux系统学习者:将Android作为一个集Linux核心和应用层程序于一体的系统进行学习,并可以利用Android的仿真环境运行和调试程序。   读者在学习本书的过程中,应尽量对照本书的框图和手头的Android源代码,这样可以达到事半功倍的效果。本书在重点代码中加上大量的注释,帮助读者阅读,对于非重点的代码,不占用本书的篇幅,读者可以参考开放的源代码。可以采用顺序读和重点读相结合的方式学习本书,顺序读关注系统框架,重点读关注开发要点。   本书作者   本书在编写过程中提炼和综合Android早期开发者的经验、中国大陆Androidin社区的开发成果,以及各位专家的经验和技术,这是本书出版的知识源泉。本书主要由Androidin社区的两名核心技术专家韩超和梁泉领衔规划和编著,韩超统稿。总部设在南加州、专注于Android平台并提供其移动应用开发及解决方案的迈奔无线(mAPPn Inc.)也投入技术和人力参与了本书的工作。   参与本书编写的还有于仕林、张宇、张超等人,赵家维、黄亮、沈桢、徐威特、杨钰等参与了审校工作。   由于时间仓促,可能依然存在一些错误和问题,请读者见谅,欢迎读者讨论和指点。 编辑本段 目 录   第1章 Android系统概述 1   1.1 基础知识 1   1.1.1 Android开发系统的由来 1   1.1.2 移动电话系统开发模式 2   1.1.3 未来移动电话的功能及Android的优势 4   1.2 Android的开发工作 6   1.2.1 Android移植开发 6   1.2.2 Android应用开发 8   1.2.3 Android系统开发 9   1.3 Android的SDK与源代码 10   1.3.1 基于SDK的Android开发 10   1.3.2 基于源代码SDK Android开发 11   第2章 Android系统开发综述 13   2.1 Android的系统架构 13   2.1.1 软件结构 13   2.1.2 Android的工具 16   2.2 Android源代码的开发环境 18   2.2.1 Android源代码的获取和提交 18   2.2.2 Android源代码结构 21   2.2.3 编译 24   2.2.4 系统的运行 25   2.3 Android SDK的开发环境 32   2.3.1 SDK的结构 32   2.3.2 Windows环境SDK开发 33   2.3.3 Linux环境SDK开发 42   第3章 Android的Linux内核与驱动程序 44   3.1 Linux核心与驱动 44   3.2 Android专用驱动 45   3.2.1 Ashmem 45   3.2.2 Binder 45   3.2.3 Logger 46   3.3 Android使用的设备驱动 46   3.3.1 Framebuffer显示驱动 46   3.3.2 Event输入设备驱动 48   3.3.3 v4l2摄像头——视频驱动 50   3.3.4 OSS音频驱动 53   3.3.5 ALSA音频驱动 54   3.3.6 MTD驱动 56   3.3.7 蓝牙驱动 57   3.3.8 Wlan驱动 58   第4章 Android的底层库和程序 60   4.1 底层库和程序的结构 60   4.1.1 本地实现的基本结构 60   4.1.2 增加本地程序和库的方法 61   4.2 标准C/C++库bionic 64   4.3 C语言工具库libcutils 65   4.4 init可执行程序 66   4.5 Shell工具 72   4.6 C++工具库libutils 75   4.6.1 libutils的基本内容 75   4.6.2 Binder 76   4.6.3 libutils中的其他内容 82   4.7 Android的系统进程 85   4.7.1 servicemanager 85   4.7.2 zygote 87   第5章 Android的Java虚拟机和Java环境 88   5.1 Dalvik虚拟机和核心库 88   5.1.1 dex工具库和虚拟机的实现 89   5.1.2 核心库 90   5.1.3 nativehelper库 91   5.2 Android的Java程序环境 91   5.2.1 Java类的层次结构 91   5.2.2 Android Java类的代码 92   5.2.3 Android系统API 92   5.3 JNI的使用 96   5.3.1 JNI的架构和实现方式 97   5.3.2 JNI的实现方式 97   5.3.3 在应用程序中使用JNI 99   5.4 系统服务的Java部分 101   5.4.1 Binder 102   5.4.2 ServiceManager 103   5.4.3 系统进程 103   第6章 Android的GUI系统 106   6.1 Android GUI系统综述 106   6.2 pixelflinger和libui库 108   6.2.1 pixelflinger 108   6.2.2 libui 108   6.2.3 输出/输入与硬件的接口 109   6.3 Surface系统 113   6.3.1 Surface系统本地接口 113   6.3.2 SurfaceFlinger本地代码 115   6.3.3 Surface的Java和JNI代码 119   6.4 Skia和2D图形系统 121   6.4.1 Skia底层库 121   6.4.2 Android图形系统的JNI接口 124   6.4.3 Android的图形包(graphics) 125   6.5 Android的OpenGL系统与3D图形系统 125   6.5.1 OpenGL的本地代码 125   6.5.2 OpenGL的JNI代码 130   6.5.3 OpenGL的Java类 130   第7章 Android的Audio系统 132   7.1 Audio系统综述 132   7.2 Audio系统和上层接口 134   7.2.1 Audio系统的各个层次 134   7.2.2 media库中的Audio框架部分 135   7.2.3 AudioFlinger本地代码 138   7.2.4 Audio系统的JNI代码 140   7.2.5 Audio系统的Java代码 142   7.3 Audio的硬件抽象层 142   7.3.1 Audio硬件抽象层的接口定义 142   7.3.2 AudioFlinger中自带Audio硬件抽象层实现 144   7.3.3 Audio硬件抽象层的真正实现 150   第8章 Android的Video输入输出系统 151   8.1 Video输入输出系统综述 151   8.1.1 Android的Overlay系统结构 152   8.1.2 Android的Camera系统结构 153   8.2 Overlay系统 155   8.2.1 Overlay系统的框架部分定义 156   8.2.2 SurfaceFlinger系统的Overlay部分 158   8.3 Overlay的硬件抽象层 161   8.3.1 Overlay系统硬件抽象层的接口 161   8.3.2 Overlay系统硬件实现框架 164   8.3.3 Overlay系统硬件实现的注意事项 166   8.4 Camera系统与上层接口 169   8.4.1 Camera本地代码框架 169   8.4.2 CameraService 176   8.4.3 Camera的JNI代码 179   8.4.4 Camera的Java代码 182   8.5 Camera的硬件抽象层 182   8.5.1 Camera硬件抽象层的接口定义 182   8.5.2 Camera硬件抽象层的桩实现 184   8.5.3 Camera硬件抽象层的硬件实现 188   第9章 Android的多媒体系统 190   9.1 Android多媒体系统的结构和业务 190   9.1.1 多媒体系统的宏观结构 190   9.1.2 多媒体的各种业务 192   9.2 多媒体系统的各个层次 199   9.2.1 libmedia的框架部分 199   9.2.2 多媒体服务 208   9.2.3 多媒体部分的JNI代码 213   9.2.4 多媒体部分的Java框架代码 215   9.2.5 android.widget.VideoView类 216   9.3 多媒体实现的核心部分OpenCore 216   9.3.1 OpenCore概述 216   9.3.2 OpenCore的层次结构 217   9.3.3 OpenCore的OSCL部分 219   9.3.4 OpenCore的文件格式和编解码部分 221   9.3.5 OpenCore 的Node 222   9.3.6 OpenCore 的功能扩展 223   9.3.7 OpenCore的 Player 226   9.3.8 OpenCore 的Author 236   第10章 Android的电话部分 243   10.1 Android电话部分综述 243   10.2 Modem驱动 243   10.3 本地的RIL代码 245   10.3.1 简介 245   10.3.2 RILD守护进程 246   10.3.3 libril库 247   10.3.4 RIL的实现库Reference RIL 247   10.3.5 Request(请求)流程 248   10.3.6 Response(响应)流程 249   10.3.7 RIL的移植工作 251   10.4 Java框架及应用 251   10.4.1 基本架构 252   10.4.2 呼叫 255   10.4.3 短信 256   10.4.4 数据连接 257   10.4.5 其他框架部分及其他应用 258   第11章 Android的连接部分 259   11.1 WiFi部分 259   11.1.1 WiFi基本架构 259   11.1.2 WiFi本地实现 260   11.1.3 WiFi的Java和JNI 263   11.1.4 Settings中的WiFi设置 265   11.1.5 WiFi工作流程实例 265   11.2 蓝牙部分 267   11.2.1 蓝牙基本架构 268   11.2.2 蓝牙用户空间库bluez 269   11.2.3 bluez适配层 272   11.2.4 蓝牙的JNI和Java部分 272   11.3 GPS和定位部分 280   11.3.1 定位系统基本架构 281   11.3.2 定位系统驱动层 281   11.3.3 GPS本地实现 282   11.3.4 GPS JNI实现 283   11.3.5 定位系统Java实现 284   第12章 Android的传感器系统 286   12.1 传感器系统综述 286   12.2 传感器系统层次结构 288   12.2.1 传感器系统的各个层次 288   12.2.2 传感器系统的JNI 288   12.2.3 传感器系统的Java代码 290   12.3 传感器系统的硬件抽象层 291   12.3.1 传感器系统硬件抽象层的接口定义 291   12.3.2 传感器系统硬件抽象层的示例实现 293   12.3.3 传感器系统硬件抽象层的实现要点 296   12.4 Sensor的使用 296
嵌入式系统是指应用于特定领域的计算机系统,通常包括硬件和软件两部分。它可以被嵌入到各种设备中,例如智能手机、平板电脑、汽车、家电等,主要用于控制、监测和数据处理等功能。 嵌入式系统的发展历程可以分为以下几个阶段: 1. 单片机时代(1970年代-1980年代) 在单片机时代,嵌入式系统的硬件通常由一块单片机和外围电路组成,软件使用汇编语言编写。这种系统成本低、功耗小、体积小,被广泛应用于家电、电子游戏、电子秤等领域。 2. 微处理器时代(1980年代-1990年代) 随着微处理器技术的发展,嵌入式系统逐渐从单片机向基于微处理器的架构转变。这种系统可以使用高级语言编写软件,如C语言和C++语言,开发效率更高。此时,嵌入式系统已经开始应用于汽车、医疗设备、工业自动化等领域。 3. 智能嵌入式系统时代(1990年代-2000年代) 随着计算机技术的飞速发展,嵌入式系统逐渐变得更加强大、智能化。这种系统通常使用高性能处理器和操作系统,具有更强的数据处理能力和更丰富的功能。此时,嵌入式系统已经应用于移动通信、网络设备、医疗设备、智能家居等领域。 4. 物联网时代(2000年代至今) 随着物联网技术的兴起,嵌入式系统又迎来了新的发展机遇。物联网时代的嵌入式系统通常具有更强的互联性和数据交换能力,可以实现设备之间的智能互联。此时,嵌入式系统已经应用于智能交通、智能城市、智能家居、智能医疗等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值