- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PS 死机案例 系统死机的典型案例 取数据异常 所有中断均失效只有ARM核运行 栈溢出,界外数据被破坏 数据越界访问 中断被误打开,并没有清除中断 不能等到寄存器置位或者清零 函数重入问题 函数声明和实现的接口不统一 双处理器的同步问题 取数据异常 取数据异常 所有中断均失效 在607平台老的Framework 上,有两个现象 在第一幅开机动画处死机 反复播放前一段开机铃声 任何按键没有反应 栈溢出,界外数据被破坏 数据越界访问 数据越界访问 中断被误打开,且没有清除中断 中断被误打开,且没有清除中断 不能等到寄存器置位或者清零 不能等到寄存器置位或者清 函数重入的问题 函数重入的问题 函数声明和实现的接口不统一 双处理器的同步问题 双处理器的通信方式(串口,双口RAM等) 造成不能同步的原因往往是数据Buffer溢出,或者中断丢掉 数据Buffer大小的合理设定,考虑“生产者”和“消费者”的活动状态;从系统角度考虑中断优先级的安排 两边同步失调可能会造成死机 “死机”预防(最重要) 绝大部分的“死机”可以通过仔细的设计和编码预防 主动设置“陷阱”,主动增加调试代码,在任何程序不该进入的地方设置“陷阱”来“捕获”它,一旦捕获有更多的信息来分析(使用StackInsight工具) 在一些看起来没有任何问题的地方也要设置“陷阱”(数据越界访问和栈溢出等导致看起来没有问题的地方也容易无辜牵连,这也是“死机”分析的突破口) “死机”预防 系统软件正常运行图 “死机”预防 “死机”分析 必现或者容易重现的“死机”分析,(Debug,代码走读,案例套用,版本比较) 落入陷阱的“死机”分析(StackInsight输出文件) 没有落入陷阱的,又很难重现的“死机”分析(陷阱没有设置全,运气不好?)。重复1-2个星期的专项测试,争取重现,如果还重现不了,就让领导拍板是否可以量产。 “死机”的“亡羊补牢” “陷阱”处让系统reset Watchdog “偷偷”地reset 提高“死机”分析的能力 扎实的基本功(C,汇编,硬件知识,各种仪器使用等) 对系统的充分熟悉(BIOS,AP,Protocol,BBIC等) 遇到问题多问“为什么”,并且找到真正的答案 遇到问题,迎难而上,碰到难题应该庆幸,是提高自己的机会,“进一步海阔天空” StackInsight工具输出文件的熟练和完备的分析 谢谢! 谢谢! * * 非法指令 Function A(){…} Function B() { Struct *pStr = (Struct *)m_malloc(sizeof(Struct)); pStr-pC = A; …. m_free(pStr);//不小心free了pStr,这时候pStr指向的数据块已经被其他数据所填充 …. pStr-pC;//调用A,但实际跳转到其他地址,可能进入指令预取异常中断,或者未定义指令异常中断,或者程序跑飞(最麻烦的) } 取数据异常中止(DataAbort) Function A() { char *p = GetPointer(index);//GetPointer没有写好,返回了一个非法的地址(乱七八糟的数据) …. U8 q = *p;//CPU遇到从一个非法地址取数而产生DataAbort异常,注意:如果是p=NULL是不会产生异常中断的,必须是一个CPU认为的不能取数的地址 } 系统无任何中断产生,Melody部仅反复播放最开始送入的Midi数据,对用户来说是“死机”,实际是ARM核在bloop()中执行有限的几行代码。 //#define SMS_NUM 10 //UTXXX SMS number #define SMS_NUM 50 //UTXXX SMS number …. Function A { SMSLog sms[SMS_NUM];//仅仅修改宏定义是不够的,必须察看与之有关的所有代码 …. memset((void *)sms, 0xFF, SMS_NUM*SMS_SiZE);//栈后面可能有其他全局量,被“无辜”的赋为0xFF …. } Function A { …. m = m_malloc(size); … m++;//不小心++,可能是其他方式导致其++ … memset((void *)m, 0, size);//堆中的数据被“无辜”破坏 } 可以看到,紧挨在m后面的数据被无辜的破坏,导致系统在其他状态下“死机”。所有的赋值语句都要慎重,特别是对某一地址指向
文档评论(0)