在嵌入式编程代码中,我们往往能看到许多地方有while(1)的身影。最初接触嵌入式编程时,对这个常见的符号有些不解,后来慢慢熟悉后发现,while(1)原来有着这么多有用的小技巧。
1 循环主函数
我们都知道while(1)是一个死循环,很多单片机程序裸跑的时候的结构基本上为
main()
{
init_something();
while(1)
{
do_something();
}
}
Interrupt()
{
doing_something();
}
这样的结构使得程序在主循环中运行,有中断来时去运行中断。其效果和for(;;)类似。
2 调试代码
有时我们为了检测某一段代码是否有bug,就在这段代码后面加上while(1),程序运行完之后,便停在了这个位置,防止后面的程序对之前的程序运行结果产生影响。当然,打断点也是可以的。
3 程序复位
单片机的运行机制是由看门狗防止程序跑飞。
当单片机在规定时间内没有喂狗,这程序启动复位机制,强制单片机复位执行。
因此,在需要单片机执行复位操作的地方,可以添加while(1)来实现。
笔者测试过某些单片机,发现有些单片机存在看门狗中断,也就是在看门狗计数器快达到临界值时进入看门狗中断,在中断中喂狗。防止程序没有喂狗造成的跑飞。
如果存在这种情况,while(1)的复位效果就不那么理想了。这时我们可以编写一个简单的程序运行控制权转移函数,俗称跳转函数实现复位。
大致结构为:
static void vControlSwitch(unsigned int sp,unsigned int pc)
{
asm("ldr r0, [r0]");
asm("mov sp, r0");
asm("ldr r0, [r1]");
asm("bx r0");
}
函数中的sp为程序起始地址,pc为sp+4即复位中断地址。这样便可以实现复位操作。
关于while(1)的妙用就说到这,以后笔者会慢慢更新其他嵌入式编程相关的小技巧,敬请期待。