嵌入式编程 while(1)的妙用!

在嵌入式编程代码中,我们往往能看到许多地方有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)的妙用就说到这,以后笔者会慢慢更新其他嵌入式编程相关的小技巧,敬请期待。

你可能感兴趣的:(嵌入式小技巧)