软件定义汽车6-开发人才从何而来

引言

       从2019年下半年开始,各个玩家都发布了在汽车软件化方面的战略,特别是2020年这种经济大环境不好的情况下,仔细去看看各方的动作,丝毫感受不到有什么汽车业的寒冬,有些玩家是真做,有些玩家是在跟风,还有一些还在睡觉。

       最近和各种背景的人交流,技术派似乎认为这就是未来方向,传统派关注的问题很实际,花这么大代价去重构汽车的软硬件基础架构,究竟有什么意义? 对这个方向还存在疑虑的,现阶段也很难有什么令人信服的证据去说服。我更加关注执行层面的事情,如果这个方向的是正确的,如何能让想法慢慢落地?思考了很久,决定从三个维度去阐述这个事情:

  • 人从哪儿来
  • 要做的事情
  • 执行策略与计划

       为什么先讲人,是因为软件定义汽车这件事情,最关键的还是要重构车辆底层的软硬件基础架构,而行业里面没有现成的人才储备,无论是互联网来的,还是传统汽车电子软件来的,都存在能力上的短板,并且从架构上也没有最佳实践,所以即使是哪家车厂想清楚了要做什么,短时间也招不到如此多的合格的人才,所以传统的玩家无论想做什么软件,三个基本能力是必须掌握的:

  • 软件架构能力
  • 软件开发能力
  • 软件工程的能力

       很多人都在讲,传统巨头转型过来,会吊打特斯拉,可事实是转型过来的巨头依然还在被吊打着,有一个要素大家要清楚,拥有强大软件的研发能力的科技巨头,招揽汽车顶级人才的能力,要明显强于传统巨头招揽软件人才的能力,科技巨头拿二线程序员的薪资就能招揽到一线的汽车人才,虽然很残酷,但却是事实。

互联网人的能力模型

       IT与互联网大部分的软件开发人员,都属于在通用计算机系统上的软件开发,一般是在某种操作系统上(Windows/Linux/IOS等)进行应用软件开发,主要包含电脑端,手机端,服务器端等设备,以X86与ARM架构为主,大部分开发人员都会使用某种高级语言进行特定任务的开发(C++/JAVA/OC//JS/PYTHON等),由于业务的需要,互联网公司会有算法人员(图像/语音/数据),手机与智能硬件的公司,也会有部分BSP的开发团队,他们属于软件团队中最懂电子硬件的人。

       大部分计算机相关专业的人,毕业之后都涌入了这个行业,部分非计算机相关专业的人,自学编程之后也涌入了这个行业,所以这个行业当中有庞大的人口基数,人员规模在百万以上。

       从2015年开始,掀起的智能网联和自动驾驶的热潮,吸引了大批互联网人的加入,从本质上讲,都是围绕车的外围进行的一系列应用开发( 车机+TBOX+手机+服务器),但车还是那辆车,基础架构并没有发生变化。通过几年的摸索,大家也发现,只在外围做创新,本质上无法带来革命性的突破,不去从内核上革命,永远也追不上特斯拉。

总结下来,我的观点可以概括为以下几点:

  • 互联网有大量的优秀软件人才储备,有构建大规模软件的软件工程经验。
  • 搞车联网和自动驾驶,互联网人有技术上的优势。
  • 但是大部分人不懂硬件,需要补上硬件的短板,以及汽车软件的Know-How。
  • IT界在成熟硬件架构的上的工程的经验,照搬到车这个分布式异构平台下是要吃亏的。
  • 按照过往的经验,车载软件一半以上的时间花在了集成联调阶段,不像互联网测试环境到生产环境的迁移那么的流畅。

传统汽车人的能力模型

       传统车企里面最懂软件的应该就是其IT信息部门了,这两年兴起的车联网,车企中最先参与的也是这部分人,但大部分的开发人员还是都来自于IT及互联网。

       传统汽车产业链当中对软件了解最多的,应该是Tier1当中的汽车电子软件部门,汽车电子软件属于嵌入式软件开发范畴,是在专用计算机系统上进行软件开发,一般要求开发人员具有一定的硬件基础,主流的嵌入式平台包含ARM、DSP、FPGA等,开发语言主要是汇编/C/C++,受限于整个行业的限制,汽车电子软件的主流开发平台还是ARM,并且大部分还局限在微控制器层面。

       大部分的嵌入式软件开发人员,来自于通信、自动化、电子等对电子硬件比较了解的专业,少部分来自于计算机(嵌入式只是计算机专业的一个小分支,毕业生更倾向于去互联网),汽车电子软件属于嵌入式软件的一个分支,但由于其行业的封闭性,从业人员的来源就更窄,前面的文章也分析过,如果除掉车联网的那批人,中国整个行业不超过5000人。

       从软件人员的角度看来,和整个软件关系最大的可能就是电子电气架构,可是在传统车企那里,电子电气部门的话语权也是受限的,观察一下各大车企技术中心研究院的负责人,基本都是传统底盘、发动机等领域出身。在他们的领导下搞软件定义汽车,搞数字化系统,想想就知道结果,所以组织架构的变革是前提。

传统ECU的开发模式

       很多文章都提到传统ECU,一辆现代汽车会包含几十到上百个各种各样的ECU,虽然数量很多,但是构型基本一样,以下就是传统ECU的典型架构图:

传统ECU.png

主要包含以下几个部分:

  • 电源、外设接口、ADC、SCI、PWM、看门狗、车载网络接口(CAN、LIN、Ethernet、FlexRay)
  • 非易失性存储NVM(一般在几十K到几兆之间,大部分应用512K以内就足够)
  • SRAM(一般在几十K到几兆之间,大部分应用256K以内就足够)

一般具有以下特性:

  • 采用Cortex-M、Cortex-R内核居多,部分厂家有自己的内核
  • Lock-Step(保持多个CPU、内存精确的同步,在正确的相同时钟周期内执行相同的指令)
  • ECC、ECM 纠错机制
  • 最高能够达到ASIL-D 安全等级要求

代表芯片:

  • 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。

高性能计算单元上的软件开发

       这个章节我先起个头,因为这部分内容和软件定义汽车具体要做的事情非常相关,下图是TI的TDA4的系统框图,非常典型,各家的高性能SOC也都大同小异,大家先看看,有个印象,下篇我们将详细介绍。

高性能计算单元.png

总结

       对于无论是互联网人,还是传统的汽车电子软件开的人员,软件定义汽车都是一个新的领域,需要相互借鉴、相互学习,想要加入这个行业的人需要补齐对应技术上的短板,对于各个玩家来说,现阶段还是以积累能力为主,而且招募相关人员会非常困难,特别是能够进行全局设计的架构人员。

       每个行业都有每个行业的专业性,得心存敬意,但也不是畏惧,为什么有底气说这些,也是有经历的因素在里面,童年时代大家在玩玩具的时候,这些芯片电子元件就是我的玩具,后面的各种项目经历,使得我对各家芯片也是如数家珍,这种经历也为我现在做架构工作提供了非常大的优势,因为一般的开发工程师或者是合作方很难找理由忽悠住我,实在不行我会直接教他怎么做。

        希望有更多软件领域的高手投入到这个行业,做这个事情需要很强攻关能力的技术团队,也需要全行业一起努力!

你可能感兴趣的:(软件定义汽车6-开发人才从何而来)