堆栈大小是在编译时就静态分配好的 , 但堆栈是以动态的方式使用的 。 随着代码的执行 , 应用程序需要的变量、返回的地址和其它信息被不断存储在堆栈中 。 这种机制导致堆栈在其分配的内存中不断增长 。 然而 , 这种增长有时会超出编译时确定的容量极限 , 导致堆栈破坏相邻内存区域的数据 。
绝对确保堆栈正常工作的一种方法是实现堆栈监视器 , 将它作为系统“保健”代码的一部分(有多少工程师会这样做?) 。 堆栈监视器会在堆栈和“其它”内存区域之间创建一个缓冲区域 , 并填充已知的位模式 。 然后监视器会不断的监视图案是否有任何变化 。 如果该位模式发生了改变 , 那就意味着堆栈增长得太大了 , 即将要把系统推向黑暗地狱!此时监视器可以记录事件的发生、系统状态以及任何其它有用的数据 , 供日后用于问题的诊断 。
大多数实时操作系统(RTOS)或实现了内存保护单元(MPU)的微控制器系统中都提供有堆栈监视器 。 可怕的是 , 这些功能默认都是关闭状态 , 或者经常被开发人员有意关闭 。 在网络上快速搜寻一下可以发现 , 很多人建议关闭实时操作系统中的堆栈监视器以节省56字节的闪存空间 。 等等 , 这可是得不偿失的做法!
技巧5 - 使用MPU
在过去 , 是很难在一个小而廉价的微控制器中找到内存保护单元(MPU)的 , 但这种情况已经开始改变 。 现在从高端到低端的微控制器都已经有MPU , 而这些 MPU为嵌入式软件开发人员提供了一个可以大幅提高其固件(firmware)鲁棒性(robustness)的机会 。
MPU 已逐渐与操作系统耦合 , 以便建立内存空间 , 其中的处理都分开 , 或任务可执行其代码 , 而不用担心被stomped on 。 倘若真有事情发生 , 不受控制的处理会被取消 , 也会执行其他的保护措施 。 请留意带有这种组件的微控制器 , 如果有 , 请多加利用它的这种特性 。
技巧6 - 建立一个强大的看门狗系统
你经常会发现的一种总是最受喜爱的看门狗(watchdog)实现是 , 在看门狗被启用之处(这是一个很好的开始) , 但也是可以用周期性定时器将该看门狗清零之处;定时器的启用是完全与程序中出现的任何情况隔离的 。 使用看门狗的目的是协助确保如果出现错误 , 看门狗不会被清零 , 即当工作暂停 , 系统会被迫去执行硬件重设定(hardware reset) , 以便恢复 。 使用与系统活动独立的定时器可以让看门狗保持清零 , 即使系统已失效 。
对应用任务如何整合到看门狗系统中 , 嵌入式开发人员需要仔细考虑和设计 。 例如 , 有种技术可能可以让每个在一定时期内运行的任务标示它们可以成功地完成其任 务 。 在此事件中 , 看门狗不被清零 , 强制被复位 。 还有一些比较先进的技术 , 像是使用外部看门狗处理器 , 它可用来监视主处理器如何表现 , 反之亦然 。
对一个可靠的系统而言 , 建立一个强大的看门狗系统是很重要的 。 由于有太多的技术 , 难以在这几个段落中完全涵盖 , 但针对此一议题 , 笔者未来还会发表相关的文章 。
技巧7 - 避免易失存储器分配
不习惯在资源有限环境下工作的工程师 , 可能会试图使用其编程语言的特性 , 这种语言让他们可以使用易失存储器分配 。 毕竟 , 这是一种常在计算器系统中使用的技术 , 在计算器系统中 , 只有在有必要时 , 内存才会被分配 。 例如 , 以C开发时 , 工程师可能倾向于使用malloc来分配在堆(heap)上的空间 。 有一个操 作会执行 , 一旦完成 , 可以使用free将被分配的内存返回 , 以便堆的使用 。
- 报告显示八成互联网电视系统存非法采集共享用户数据问题
- 对于老用户来说|win7系统新增性能指标功能
- 华为鸿蒙系统|进一步挑战安卓和iOS!华为鸿蒙系统3.0开始公测:多款机型可升级
- 操作系统|又一款适配开源鸿蒙的操作系统诞生了!
- Ubuntu Core 22 发布:为物联网/嵌入式设备打造,应用完全容器化
- 华为鸿蒙系统|EVO认证下的鸿蒙生态有多猛? 华为MateBook 16s体验评测!
- 微软|这么突然?微软发布Win11全新轻量级系统:Validation OS来袭!
- 师妹|博士开发出AI乳癌检测系统
- 非标机械企业ERP系统数控加工企业ERP软件机加工行业ERP系统MES
- 华为鸿蒙系统|否认使用AMD芯片却被光速“打脸”,蔚来这是在害怕什么?