【问题标题】:Why is my C program continuously run forever without the usage of loop?为什么我的 C 程序在不使用循环的情况下一直持续运行?
【发布时间】:2021-04-22 08:09:05
【问题描述】:

我正在使用 Proteus 仿真软件上的以下电路测试我的微控制器 PIC18f4550。

我的目标是打开 LED 一秒钟然后将其关闭。

以下是我的代码:

#include <xc.h>
#define _XTAL_FREQ 8000000
void delay(int t);
 
void main(void)
 {
   TRISB = 0x00; // set Port B as output
   LATB = 0x00; // set all 8 outputs on Port B to 0
   delay(20);
   LATB = 1b00000001; // set port B0 to 1
   delay(20);
   LATB = 1b00000000; // set port B0 to 0
    
 }
 
 void delay(int t)
 {
    for (int i=0; i<t ; i++)
    {
       __delay_ms(50); //using xc8 compiler internal delay function - it doesn't like it if delay is too big so it is used inside for loop
    }
 }

运行模拟时,LED 会一直闪烁。我没有在我的程序中使用任何循环,我只打算打开一次 LED。是什么导致 LED 持续闪烁?

[编辑 1] 我找到了解决我的问题的方法。我只是在代码末尾添加了while(1){},以阻止 PIC 进入无限循环。

【问题讨论】:

  • 它在程序内存中循环。它从复位向量开始执行,然后完成执行程序,然后对所有空白程序内存地址执行 NOP 或 RETLW 一次,在 NOP 的情况下,PC 到达内存的末尾:在 RETLW 的情况下,它的堆栈下溢并导致设备复位,然后它再次通过复位向量重新启动(PC = 0)。您使用的是硬件循环而不是软件循环:D.
  • 您可能会对微控制器在执行main() 之前运行的代码量感到惊讶——而且该微控制器可能不希望您从main() 返回...这样做将重新启动该程序。您可能会有一个您没有注意到的名为 cstart.c(或 .asm)的文件...

标签: c infinite-loop pic mplab xc8


【解决方案1】:

您正在为微控制器编程。他们没有广泛的操作系统。在大多数情况下,您的 IDE 会隐藏您的 main 正在循环运行(就像 Arduino IDE 一样),或者退出程序会使微控制器重置,并且会再次启动程序。

您将其标记为“mplab”,如果您检查它的文档,它会指出: "编译器在 main() 的末尾插入特殊代码,如果此函数结束,即执行 main() 中的 return 语句,或代码执行,则执行该代码 到达 main() 的终止右大括号。此特殊代码导致执行 跳转到地址 0,即所有 8 位 PIC 器件的复位向量。这基本上执行 软件复位。请注意,软件复位后的寄存器状态可能不同 硬件复位后。 建议main()函数不要结束。"

【讨论】:

  • 如何解决这个硬件重置问题?例如,如果我想让我的微控制器在通电时闪烁一次怎么办?
  • 我找到了一个解决方案,只需在代码末尾添加while循环即可阻止程序无限循环
【解决方案2】:

C 运行时环境可能会在无限循环中调用main()。这可以像这样故意发生:

/* some other stuff... */
for (;;) {
    main();
}

或者它可能是因为在返回main() 之后程序存储器中的下一个字节使处理器重新启动,例如由于异常或调用后的其他代码。

您可能想使用一个模拟器来显示您的程序的汇编级别以遵循控制流。

另一种选择是使用您的工具来反汇编可执行文件。

【讨论】:

    【解决方案3】:

    我建议您使用 MPLAB X IDE 中提供的调试器(内部模拟器)工具,并查看单个指令是如何执行的。检查微处理器是否没有被任何外围设备重置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2022-12-10
      • 1970-01-01
      相关资源
      最近更新 更多