加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

针对RTOS使用过程中的死机问题

(2009-03-19 08:10:43)
标签:

杂谈

    RTOS其实并不难,关键使用者要了解它,而且要了解承载它的MCU,两者不可或缺。
    加载RTOS就发生死机的现象,在调试过程中是很正常的,没有必要产生惧怕的心理。
    第一,您要看看你的系统配置文件,也就是在编译器中配置的flash、RAM的地址是否正确。如果编译器工作都不正常了,目标代码肯定跑不起来。
    第二,看看上下文切换,一般来讲,我们都直接使用已经移植好的官方版本,问题不太多。如果是自己移植的,一定要保证这个部分是正常的。
    第三,看栈,有没有给任务分配足够大的空间。建议有条件的开发者,在开发时选择RAM较大且pin2pin的同系列MCU进行开发,这样可以给任务以足够大的栈空间。在开发完成之前,裁减栈配置,测试之后转换到目标芯片运行。

    第四,看中断。

    a) 不能将系统滴答分配到不可屏蔽中断中。

    b) 任何中断都不宜申请过大的RAM,所以在中断中使用到的变量最好在程序设计时就分配全局静态变量。

    c) 在不可屏蔽中断中,必须直接按照裸机中断的方式进行现场保护和恢复,千万不要调用RTOS类型的保护与恢复,以免破坏RTOS关键变量,

    第五,找bug.许多独立开发者都会在兴头上犯些低级错误。

    a) 比如在复制代码时,变量忘了修改了或者函数忘了修改了。有些重复次多较多的代码,建议使用宏定义的方式。千万不要忘了,C语言的宏定义功能可是极其强大的哦。

    b) 随着微控器的功能的加强,部件增多,硬件设计方便了,可是软件设计还是马虎不得滴。您是不是在部件调用之前忘了初始化了,或者调用方式欠佳。许多官方RTOS都有串口输出调试功能,一般都是以查询的方式调用串行接口,您是不是在将串口驱动初始化为中断方式之后,依然在调用原始的printf?如果没有改变查询方式,您是不是在多个任务中同时调用了printf?一般串口发送中断是发送缓冲区无数据时发生,那么在无数据发送时,有没有屏蔽掉该中断。

 

   造成死机的原因很多,以上列出的5类典型性错误。解铃还须系铃人,遇到问题不要抱怨、不要放弃、也不要轻易地请教他人。嵌入式的道路上,要有开拓精神,更要有相对深厚的调试经验。软件设计绝对不能闭门造车,要养成良好的编程习惯,培养自己良好地构件设计能力,最好的方式是读linux原程序,当然不是去研究每一个driver,而是它系统的结构,细微的理念和良好地API接口。

   我也只是嵌入式散步者,以上仅供参考,欢迎拍砖!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有