浅谈软件硬件联系
软件硬件看似两个分家的东西,其实内在有千丝万缕的联系。我举一些小例子:
开关电源的电感在一个时钟周期内,要满足伏秒平衡。物理意义是,开关周期内电感吸收的能量和释放的能量应该是相等的。否则,系统不会平衡,不稳定。对于软件系统,特别是复杂的大型系统,虽然有严谨的理论去判断一个软件模块的稳定性。但对于程序员调试,并不是一个简单轻松的过程。可以借鉴伏秒平衡的思路,一个大型的代码在一个状态结束时,除了一些统计变量之外,应该是回到最初的状态,具体的体现:内存释放与申请,系统输出的结果等应和最初状态一致。栈在没有中断回到初始位置时,应该也是回到最初位置的。否则,系统会不稳定。
关于初始化,一直不被软件工程师所重视。硬件工程师有时候也会忽视这个问题。软件中的初始化,从宏观上讲,模块的初始化;启动操作系统的准备工作;任务栈,堆的准备。从微观上讲,变量的初始化,全局构造函数,全局变量初始化。对于硬件,上电的顺序;芯片管脚上电的状态。数字芯片的初始逻辑状态。模拟信号的初始范围等等。有一些音箱,开机的时候会砰一声。这个是上电产生的电流冲击,比较难抑制。消音电路很难做好。一些高级的CPU,会有上电顺序要求。一些可靠的系统,要求上电,掉电,信号都必须有确定的状态。单纯的硬件去做,有时候很困难。可能需要软件硬件一起结合着做。Bootloader 为了后续的应用代码做了很多初始化工作。
在软件抽象一些客观事物时,可以参考硬件的抽象。比如说以太网相对于处理器是个低速设备,为了解决无休止的中断,DMA 可以大大缓解处理器的压力。如果处理器抽象成一个类、以太网抽象成一个类,那么DMA可以看作一个通信关联类了。其参数的抽象和深入的分析,对软件设计和硬件设计都是个极大的促进。
芯片是别人给你的库函数。完成各种各样的功能。软件开发过程中,需要了解库函数的执行行为,参数范围,使用技巧,应用场景。其实,芯片的应用也是一样的。需要了解管脚的功能定义,芯片的动作行为,应用场景,功耗等等各方面的信息。了解得越细,对应用越有帮助。
软件硬件的结合,主要是洞悉背后解决问题的方法,处理实际的工程问题。