姓名:刘欢 学号:19020100155 学院:电子工程学院 班级:1902012
原文转自:https://zhuanlan.zhihu.com/p/294255155
【嵌牛导读】我们常见的对于底层编程的语言是C和C++,嵌入式既包含了底层的学习开发,也存在硬件的编程应用,为了更好的学习嵌入式,我们首先需要掌握嵌入式的编程语言。
【嵌牛鼻子】嵌入式 编程语言
【嵌牛提问】嵌入式应该适用什么编程语言呢?
【嵌牛正文】
嵌入式开发几乎离不开C/C++,虽然在一些嵌入式linux的开发场景可以选python、java,不过也需要BSP和SDK的支持,像操作系统移植、驱动开发几乎就是C的天下,最近有传闻rust也能开发linux内核模块了,但距离大规模使用看上去还很远,C++因为提供了比C更现代的面向对象和模板等特性,并且有大量开源代码库,在嵌入式linux领域也有大量的使用。如果是单片机开发,不管是裸机还是RTOS,C基本就是不二选择了,这么多年下来,不管是互联网资源还是各大公司的技术积累,C和C++都是最多的,总而言之呢,所以作为一个嵌入式软件工程师,这就是必备技能。
某种程度上来说,编程语言也体现了嵌入式开发的一些特点,很多时候我们需要面向硬件编程,这个面向硬件有两层含义。
第一是说需要了解硬件特性,然后通过编程来访问硬件,例如通过读写寄存器完成对外设的控制,简单如GPIO,复杂一些像Ethernet控制器,除了了解硬件的操作逻辑,也需要了解引脚、电平、IO复用、、硬件缓存、DMA这些概念。
第二是说硬件资源带来的限制,这是由于嵌入式产品通常针对具体系统,涉及的技术约束大概有计算能力,IO接口,内存,体积,功耗,等方面的约束,在这些约束下进行技术选型和系统设计,很多时候硬件选单片机,ARM,PowerPC,软件使用裸机,RTOS或经过裁剪的linux是比较合适的选择,就是合适,我们也可以用牛刀杀鸡,但是没必要。
从面向硬件这个角度出发,就要求编程语言首先能够方便的访问硬件,同时又足够有效率,不因语言本身占过多资源,这个时候需要虚拟机或解释器的语言就不太合适,而C/C++通过指针(地址)访问硬件的操作最自然不过,也可以做到较少的资源消耗。
C/C++作为系统级的开发语言,虽然强大但也难以驾驭,比如说堆上内存的管理留给了开发人员,相比go这样带内存回收机制的语言虽然效率更好,也更容易出bug,稍不留神就会崩溃给你看,以至于为了解决这个问题,像航天、汽车电子等比较注重安全的行业,在编程规范里干脆不允许使用malloc和free。
不动态分配内存还可以做到,但不用指针就几乎不行了,可以说指针是C/C++暴露出来的,最不安全的点,例如你明明定义了一个char类型的变量(在栈上面分配了内存),我们仍然可以用一个其他类型的指针(int或函数指针)通过强转指到这个地址,编译完全没有问题,只有在运行时问题才会暴露,没错,有指针存在就是这么不安全。
如果说编程规范是一个应用层面的补丁,那么C++就是在语言层面的一个补丁,首先为了解决指针问题,C++提出了引用。引用是个别名,更具体的说是变量,也就是一块有名字的内存的别名,因此必须在定义的时候初始化,我们也可以认为引用最大的作用,是把地址这个东西屏蔽掉了,因此我们没有办法像使用指针一样去随意读取甚至篡改数据。但是C++和C又是完全兼容的,这是一个历史特点,指针还是存在的,在C++11之后,更鼓励的是使用shared_ptr等一众智能指针,为的就是解决裸指针的问题,其本质是使用栈内存自动回收的机制,把程序员从内存管理的机制里解放出来。
这么看上去,嵌入式开发对技能要求还蛮高的,对一些造轮子的开发人员来说也确实是这样,既要懂硬件也要精通软件,但这样的开发人员并不占大多数,毕竟轮子造出来是要复用的嘛,大部分嵌入式工程师其实接触更多的还是业务,能熟悉业务并且在项目里摸爬滚打一段时间,做到能胜任工作还是没问题的。
近几年自动驾驶、智能制造、物联网等话题的火热,也让市场上嵌入式的需求居高不下,这当然是好事,新的领域带来更多的工作机会,同时也让嵌入式开发有了新的特点,例如需要处理的数据更多,有更多需要联网的场景,对开发人员来说也就意味着更好的硬件规格和更复杂的软件,也许以后会催生出其他的选择,但就目前来说C和C++还是嵌入式的首选。