Friday, January 22, 2010

关于单片机程序的跑飞和无限循环

在单片机系统中,通常都会在程序里面加上一个无限循环,使用操作系统时其实也是类似的,比如uCOS下的每个任务的处理函数通常情况下也会是一个无限循环。至于原因,在“uC/OS-II 初级程序员指南”一文中有如下的解释:
“至于为什么要写成无限循环的形式呢?那是因为系统会为每一个任务保留一个堆栈空间,由系统在任务切换的时候换恢复上下文,并执行一条reti 指令返回。如果允许任务执行到最后一个花括号(那一般都意味着一条ret指令)的话,很可能会破坏系统堆栈空间从而使应用程序的执行不确定。换句话说,就是‘跑飞’了。所以,每一个任务必须被写成无限循环的形式。程序员一定要相信,自己的任务是会放弃CPU使用权的,而不管是系统强制(通过ISR)还是主动放弃(通过调用OS API)。”
在这段描述中,归结到“如果执行到最后很可能会破坏系统的堆栈空间从而使应用程序的执行不确定”,个人感觉这么总结不太完善。系统的堆栈空间是在RAM中的,被破坏只是有这种可能性而已。归根到底的原因是执行完之后系统可能会执行在FLASH空间里面接下来的语句,而接下来的语句是应用相关的,不可预测的。而这种不受控制的执行一般来说会破坏系统程序的执行环境,其中一种可能性就是破坏系统的堆栈空间。这样的话会导致系统的不确定行并且没有安全性可言。因此应该尽量避免这种不确定的情况的发生,对于代码程序员需要明确其执行的确定性和位置。
当然这只是程序跑飞的一个可能性,还有一些情况,比如处理器收到辐射或者在恶劣环境工作导致芯片损坏等,这些情况一般会比较少,除非能确定工作环境会造成这些情况,要不然一般还是怀疑程序的健壮性吧。另外,加上看门狗也在一定程度上能够保证程序的健壮性。

No comments:

Post a Comment