开发工具

当前的生活节奏越来越快,对计算处理器的要求也越来越高。即使是有摩尔定律的限制,人们仍然希望在单个芯片中塞入尽可能多的晶体管。尽管现在的MCU动不动就可以跑到几十上百兆,比如NXP高能效的LPC54100系列已破100MHz大关,通用型的LPC54600系列飚到210MHz,i.MX RT1050跨界处理器甚至飞到了怪兽级的600MHz,可是在当下应付图像处理和机器学习等计算大户时,仍然免不了出现“卡”的窘境。这个时候,如果能清楚地知道最消耗性能的具体函数,就有机会制定优化性能的策略。这也是圈子里常说的“profiling”(性能分析)。

有些价格相当昂贵的专业软硬件开发工具,都会提到它们有多么超强的profiling能力,这仿佛让人觉得profiling是有钱人才能玩得起,难道作为广大工程师我们就只能缩手缩脚吗?其实不然,在软件上想一点变通的办法,使用最便宜的仿真器,就完全可以在极小的开销下,做到好用够用的强大profiling利器,丑小鸭秒变金凤凰。

性能分析新思路

下面要介绍的方法的基本思想,就是密集地定期采集PC寄存器的值,从它的概率分布上估计最占CPU的函数。采集得越久,就越接近真实情况(大数定率)。

其原理是,在Cortex-M系MCU进入中断/异常时,会自动把被打断的位置(PC)存储在堆栈中。这样我们可以用汇编写一小段入口程序,读取出入栈的PC数值,作为参数传递给处理程序的C程序主体,在主体中统计PC样本的规律。只要采集了足够久的样本,在概率论的大数定理支持下,咱们就有信心估计程序中PC最常出现的位置,也就是最占CPU时间的函数。

为了贯彻这个思想,需要准备的只有:

1.工具链产生的 .map文件。无论是KEIL, IAR, GCC,在成功构建程序后,都会产生一个map文件来记录各函数和变量的位置。从采集的PC位置,查map文件判定是什么函数。

2.系统中有一个定期产生中断的时基。常见的就是SysTick定时器的周期中断,别的timer也可以。这个中断需要优先级比较高。

3.扩写定时器中断服务程序,按照前面的思路,加入这个屌丝神器。

这样,我们就可以把占CPU最多的计算型函数请到VIP区,它们与CPU有绿色快速通道,加速它们的执行。其实这个VIP区也是分等级的,从小V到大V,特权待遇相差还是明显的,小编今后再专开一文介绍不同VIP的特权。

要想让这个思路能可靠工作,还有几个关键的小坑不要踩:

1.PC最常在的位置并非一定就是最计算密集的位置。比如,程序中经常会出现等候外设寄存器的情况,CPU几万几亿遍地查看一个外设标志。这类IO忙等的代码即使放在大V区,也无济于事。

2.定时器中断的优先级不够高。如果有高优先级的中断服务程序占用了大量CPU时间,定时器中断就没有机会采集到它们,反而是在这些中断返回时定时器中断才得到服务,结果反而冤枉了被高优先级中断给打断的位置。

3.某个函数的工作频率与相位恰好和定时器中断产生“共振”,经常有机会在进入定时器中断的前夕在这个函数中,也会误以为这个函数是最占CPU时间的。这个情况一般是罕见的。

4.CPU负载比较轻,结果大量PC都采集到idle函数中。可能有小伙伴要问了,CPU都这么咸(闲)了,还淡操什么心?这个其实要以发展的眼光来看。比如,有可能随着功能集成的增加CPU终将有不堪重负的时候,或者系统负载不均匀而表现出明显的峰谷性,又可能希望让CPU尽管做完事好进低功耗模式。

转自:恩智浦
作者:宝木山石

围观 394

由于嵌入式开发环境的特殊性(交叉编译),我们会用到一些其他的外围工具,这里做简要的说明。并重新介绍一下整个开发环境中,各个工具的使用,及一个简单应用的开发流程。

SecureCRT : 串口输出显示工具、SSHclient 。

SecureCRT 是一款支持SSH(SSH1和SSH2)的终端仿真程序,同时支持Telnet和rlogin协议。

这个是最有用的吧,你看到她就会爱上她。并且是可以窗口内多标签,界面和蔼可亲的。

DNW : USB下载工具。(配合u-boot使用)

DNW 是一款USB下载传输工具,把编号的目标板的.bin二进制文件通过开发板的USB线,下载传输到板子上,通常用来传输的是编译好的Linux目标板镜像或者板子上无OS裸奔的程序,这里主要是配合bootloader使用的。需要进行传输时,在串口工具的u-boot输出菜单中选择对应的选项(比如:download Linux kernel to Nandflash),bootloader就会在目标机端(开发板端)准备好USB端口,等待在USB中数据的写入,然后,在PC端打开DNW选择要传输的文件,传输就好。传输过程中以及传输完成后,都会在串口工具窗口(也就是SecureCRT )看到串口输出的信息反馈。DNW有windows版也有Linux版,Linux下的需要自己编译并安装附带的USB驱动模块,而windows下的只用一个DNW.exe就ok了,不需要安装包安装(如果你真的想那么做的话。。。。。ps:应用USB下载即DNW下载时,需要安装USB下载驱动,开发板的光盘中都会有所附带)

DNW 在引起windows蓝屏后无法运行的问题解决如何解决?

另外需要注意:比如TQ2440出厂的U-boot,通过DNW传输时,会出现传输后没反应,然后再次选择传输文件,电脑就蓝屏了(如你所知,这肯定是在windows环境下),这样,确实很悲剧,并且你会不只一次碰到,如果你的PC足够顽强,应该不会有什么事儿的,也有可能是windows 7的兼容问题吧,上次发生是不是在XP下,我也忘了。言归正传,蓝屏后,重启系统,会出现DNW 无法运行的情况,即使你再找个dnw.exe,它还是不甩你。怎么办呢?它肯定是知道了在上次运行时你虐待它了,这是在记仇啊,记仇?它怎么记?软件么,很定时在配置文件中记的,打开C盘,在根目录下有一个dnw.ini ,这个就是它的配置文件,直接把它删了,它就会忘记你曾经对她犯下的错,又是这么小气又是这么的通情达理。。。。OK,可以正常运行了。

U-boot:强大的bootloader。

为什么把它也作为开发工具来说呢?因为学习刚开始,我们暂且还不去涉及bootloader的移植问题,而它的存在,会方便我们往开发板上烧写程序。有了它,我们可以用NFS下载镜像(程序),我们可以用USB下载镜像(程序),我们还可以用ftp下载……一劳永逸啊。为了方便开发,我们就直接把它作为我们目标板端的常用工具,暂且屏蔽到它的内部细节,这不影响我们做裸奔的接口实验,和Linux内核移植及驱动开发,过早的接触并试着去了解太多名词,会领我们有恐惧感的,是时候了解它的内部逻辑时,我们自然会接触到,万法自然,随他去吧……

Jlink :仿真器。

还要涉及一个名词是j-tag,jlink是一个外部仿真器,jtag是个内部开发调试接口。Jlink是通过jtag接口实现的一个仿真器,可以跟踪调试。目前我们用到它的可能就是来烧写u-boot了。如果用于调试的话,可以配合ADS使用,来编写裸奔程序。至于如何在空板子上烧写u-boot,各个开发板都会有详细说明,我也不费这口舌了,他们写的要比我专业的多。。。。。

好的,下边用一张图片来描述一下工具之间的配合使用。

图片只是简述了各个工具在开发过程中扮演的角色。希望画的还能让您明白。。。。

文章来源:玩转单片机

围观 469
订阅 RSS - 开发工具