自硕士毕业,笔者从事汽车嵌入式行业已经3年的时间了。相较于学校的项目,公司的项目对代码的书写规范,测试用例都要求更加严格,在汽车行业,工程师大部分的代码都是EB Tresos和 Davinci以及Matlab生成的,只有少数的复杂驱动代码需要工程师自己设计。但是这并不意味着工程师只需要按照设计要求,在图像化配置工具上勾勾点点,生成代码,稍微测试一下就可以了,如果只具有配置生成测试的能力,只能停留在初级工程师阶段,难以独自承担一个模块的开发,在薪资上也很难有大的突破。
我认为做一个中级工程师,首先要具有的能力就是调试能力。在汽车行业,一个项目的代码有几十万行,甚至上百万行,工程师不可能对每一个模块都十分了解,所以必须具有调试能力,出现问题以后通过调试工具,定位到问题出现哪个模块,然后找到相应的模块负责人去修改模块的配置,以满足实际项目的需求。
接下来,我们以winIDEA这个调试工具为例,介绍一些常用的调试技巧,以帮助工程师们在项目中更好地解决实际项目问题。
# 技巧一
在C语言中代码分为全局变量和局部变量,全局变量存储在单片机的RAM里面,局部变量存储在栈里面,调试器可以随时查看修改全局变量,我们可以通过全部变量的值来查看对模块的配置情况,以及变量的赋值情况。这些内容都是入门单片机的工程师就了解到的。但是在实际的项目中这个功能是最基础的也是最关键的。
举几个小例子,在调试的时候,我们需要查看一些局部变量的值,有些情况可以在Locals界面查看,但是这个界面并不能查看所有局部变量的值,为了查看局部变量的值,我们可以新建一个与局部变量相同类型的值,在代码中不断的将局部变量赋值给全部变量,我们就可以通过查看全局变量,间接的查看关键局部变量的值。
在实际的项目中,我们可能要对一些参数进行调参,我们可以不停的修改代码,编译,然后将生产的elf文件烧录到单片机,如果使用这种方法不仅降低工作效率,还有可能不断的烧录代码损坏单片机,最主要是麻烦,让工作及其不爽,此时就可以双击变量值的位置修改全局变量的值,以下图为例,我们在工作中需要不断的修改不同PWM的输出占空比,来找到项目中最需要的占空比,可以先修改DutyCycle的值,然后将Test_Flag置为1或者2来让设置占空比的函数执行一次,使用这个方法,可以大大的提高工作的执行效率。
# 技巧二
在项目的开发中,时常出现进入Det的情况,可能是我们的配置有错,又或者是赋值有错,因为种种的失误,无可避免的让函数进入Det,函数进入死循环,此刻,CallStack功能就非常的好用,我们可以让函数暂停,然后打开CallStack界面来查看由于那一个函数进入Det,导致函数进入死循环,可以一步一步的解决问题。双节函数在右面对应的窗口就可以进入相应的函数,非常方便调试。
# 技巧三
在查看变量的时候,我们一般使用watch窗口,但是在查看大量数据时,比如SPI的缓存数据使用watch窗口的话,会发现严重的干扰程序的运行,表现为数据刷新缓慢,但是使用Memory就非常棒,刷新非常流畅,所以查看大数据时,采用memory窗口就很有优势了。在项目中由于各种原因,例如调试工具的配置问题,导致下载进入的程序是一致的但是单片机的功能就是不一致,此时就可以通过memory窗口把Flash的数据全部拷贝出来,然后使用工具进行对比来查看烧录进单片机的代码是否一致。
由于时间的原因,暂时分享以上三个开发调试技巧,日后工作中遇到新的调试技巧和常规性的错误,都可以总计出来分享给读者,给大家的开发工作带来便利。