从2019年下半年开始,各个玩家都发布了在汽车软件化方面的战略,特别是2020年这种经济大环境不好的情况下,仔细去看看各方的动作,丝毫感受不到有什么汽车业的寒冬,有些玩家是真做,有些玩家是在跟风,还有一些还在睡觉。最近和各种背景的人交流,技术派似乎认为这就是未来方向,传统派关注的问题很实际,花这么大代价去重构汽车的软硬件基础架构,究竟有什么意义?对这个方向还存在疑虑的,现阶段也很难有什么令人信服的证据去说服。我更加关注执行层面的事情,如果这个方向的是正确的,如何能让想法慢慢落地?思考了很久,决定从三个维度去阐述这个事情:
人从哪儿来?要做的事情有哪些?执行策略与计划?为什么先讲人,是因为软件定义汽车这件事情,最关键的还是要重构车辆底层的软硬件基础架构,而行业里面没有现成的人才储备,无论是互联网来的,还是传统汽车电子软件来的,都存在能力上的短板,并且从架构上也没有最佳实践,所以即使是哪家车厂想清楚了要做什么,短时间也招不到如此多的合格的人才,所以传统的玩家无论想做什么软件,三个基本能力是必须掌握的:
软件架构能力、软件开发能力、软件工程的能力。很多人都在讲,传统巨头转型过来,会吊打特斯拉,可事实是转型过来的巨头依然还在被吊打着,有一个要素大家要清楚,
拥有强大软件的研发能力的科技巨头,招揽汽车顶级人才的能力,要明显强于传统巨头招揽软件人才的能力,
科技巨头拿二线程序员的薪资就能招揽到一线的汽车人才,虽然很残酷,但却是事实。
1
互联网人才的能力模型IT与互联网大部分的软件开发人员,都属于在通用计算机系统上的软件开发,一般是在某种操作系统上(Windows/Linux/IOS等)进行应用软件开发,主要包含电脑端、手机端、服务器端等设备,以X86与ARM架构为主,大部分开发人员都会使用某种高级语言进行特定任务的开发(C++/JAVA/OC//JS/PYTHON等),由于业务的需要,互联网公司会有算法人员(图像/语音/数据),手机与智能硬件的公司,也会有部分BSP的开发团队,
他们属于软件团队中最懂电子硬件的人。大部分计算机相关专业的人,毕业之后都涌入了这个行业,部分非计算机相关专业的人,自学编程之后也涌入了这个行业,所以这个行业当中有庞大的人口基数,
人员规模在百万以上。从2015年开始,掀起的智能网联和自动驾驶的热潮,吸引了大批互联网人的加入,从本质上讲,都是围绕车的外围进行的一系列应用开发( 车机+TBOX+手机+服务器),但车还是那辆车,基础架构并没有发生变化。通过几年的摸索,大家也发现,
只在外围做创新,本质上无法带来革命性的突破,不去从内核上革命,永远也追不上特斯拉。总结下来,我的观点可以概括为以下几点:
互联网有大量的优秀软件人才储备,有构建大规模软件的软件工程经验。
搞车联网和自动驾驶,互联网人有技术上的优势。
但是大部分人不懂硬件,需要补上硬件的短板,以及汽车软件的Know-How。
IT界在成熟硬件架构的上的工程的经验,照搬到车这个分布式异构平台下是要吃亏的。
按照过往的经验,车载软件一半以上的时间花在了集成联调阶段,不像互联网测试环境到生产环境的迁移那么的流畅。
2
传统汽车人的能力模型传统车企里面最懂软件的应该就是其IT信息部门了,这两年兴起的车联网,车企中最先参与的也是这部分人,但
大部分的开发人员还是都来自于IT及互联网。传统汽车产业链当中对软件了解最多的,应该是
Tier1当中的汽车电子软件部门,汽车电子软件属于嵌入式软件开发范畴,是在专用计算机系统上进行软件开发,一般要求开发人员具有一定的硬件基础,主流的嵌入式平台包含ARM、DSP、FPGA等,开发语言主要是汇编/C/C++,
受限于整个行业的限制,汽车电子软件的主流开发平台还是ARM,并且大部分还局限在微控制器层面。大部分的嵌入式软件开发人员来自于通信、自动化、电子等对电子硬件比较了解的专业,
少部分来自于计算机(嵌入式只是计算机专业的一个小分支,毕业生更倾向于去互联网),汽车电子软件属于嵌入式软件的一个分支,但由于其行业的封闭性,从业人员的来源就更窄,前面的文章也分析过,
如果除掉车联网的那批人,中国整个行业不超过5000人。从软件人员的角度看来,
和整个软件关系最大的可能就是电子电气架构,可是在传统车企那里,电子电气部门的话语权也是受限的,观察一下
各大车企技术中心研究院的负责人,基本都是传统底盘、发动机等领域出身。在他们的领导下搞软件定义汽车,搞数字化系统,想想就知道结果,所以
组织架构的变革是前提。
3
传统ECU的开发模式很多文章都提到传统ECU,一辆现代汽车会包含几十到上百个各种各样的ECU,虽然数量很多,但是构型基本一样,
以下就是传统ECU的典型架构图:
传统ECU
主要包含以下几个部分:电源、外设接口、ADC、SCI、PWM、看门狗、车载网络接口(CAN、LIN、Ethernet、FlexRay)
非易失性存储NVM(一般在几十K到几兆之间,大部分应用512K以内就足够)
SRAM(一般在几十K到几兆之间,大部分应用256K以内就足够)
一般具有以下特性:代表芯片:NXP S32K系列 MAC系列 LPC系列 KEA系列 i.MX RT系列 (都是Cortex-M内核)
英飞凌 XMC系列(Cortex-M内核) AURIX TC系列(TriCore内核)
瑞萨 RH850系列
TI Hercules系列(Cortex-R内核)
一个不跑任何操作系统的ECU,其主程序代码一般如下:
void task1()
{
status=!status;//反转某个状态,比如设备的开关
write(device_addr,status); // 向设备地址处写入设备状态
}
int main(void)
{
init_irq(); //初始化中断向量
init_timer(); // 初始化时钟
init_devices();//初始化其他设备
while(1) //开启无限死循环
{
task1();// 运行任务1
delay(1000); // 延时一段时间
task2();// 运行任务2
}
}
在运行到主程序之前,会有一系列汇编代码,处理与CPU体系架构,板级支持相关的事情,一般会包含,屏蔽中断,初始化内存,建立堆栈,把代码搬进内存等等,事实上就是BootLoader该做的事情。
这样写的裸机程序,其任务只能顺序执行(可以通过更改PC指针强制跳转),也可以通过中断执行其他任务,但是却无法灵活的设定任务的优先级,适合于任务非常简单的场景,比如在单核处理器中,做简单的开关控制。稍微复杂一点的场景,就需要有一个OS来实现相关的设备管理,比如小型RTOS,其主程序代码框架一般如下:
void task1()
{
status=!status;//反转某个状态,比如设备的开关
write(device_addr,status); // 向设备地址处写入设备状态
}
int main(void)
{
init_irq(); //初始化中断向量
init_timer(); // 初始化时钟
init_devices();//初始化其他设备
create_task(task1,stack_size,priority); // 创建一个任务
create_task(task2,stack_size,priority);
task_schedule(); // 开始任务调度
}
这个OS最核心的功能就是提供了任务调度、优先级设定、任务间通信的机制,在OS之上就能实现更加丰富的业务逻辑。
如果是遵守Classic AutoSAR的方法论进行开发,整个过程可以分为三个阶段:系统配置、ECU设计与配置、代码生成,开发过程中会使用由Vector公司等公司提供的工具,前期也会在MATLAB Simulink中进行仿真,最后生成项目代码,在这个过程中几乎不用写什么代码。
所以概括下来,有以下几点想表达:
传统ECU软件的开发,也并不像大家想的那样高门槛,本身也不复杂,再复杂也就几百K的代码量,还不如高性能计算单元上的一个引导程序大。
汽车电子软件的核心工作就是与硬件设备交互,开发语言是汇编和C,只做业务会C语言就行了,汽车软件的特殊Know-How是这个行业的一个壁垒。
大部分嵌入软件工程师都精通C编程,但也被C面向过程的思维限制住了,缺少的是构建大规模软件的软件工程能力。
传统的嵌入式软件开发,可以为汽车这个行业提供许多人才储备,过来的人员需要补齐车载软件开发的Know-How。
4
高性能计算单元上的软件开发这部分内容和软件定义汽车具体要做的事情非常相关,
下图是TI的TDA4的系统框图,非常典型,各家的高性能SOC也都大同小异,大家可以看看。
高性能计算单元
5
总结对于无论是互联网人,还是传统的汽车电子软件开发人员,软件定义汽车都是一个新的领域,需要相互借鉴、相互学习,
想要加入这个行业的人需要补齐对应技术上的短板,对于各个玩家来说,
现阶段还是以积累能力为主,而且招募相关人员会非常困难,特别是能够进行全局设计的架构人员。每个行业都有每个行业的专业性,得心存敬意,但也不是畏惧。希望有更多软件领域的高手投入到这个行业,做这个事情需要很强攻关能力的技术团队,也需要全行业一起努力!
作者:leo_huang_
来源:汽车电子与软件