微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的 C 程序会在不使用循环的情况下永远运行?

如何解决为什么我的 C 程序会在不使用循环的情况下永远运行?

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

enter image description here

我的目标是将 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 进入无限循环。

解决方法

您正在为微控制器编程。他们没有广泛的操作系统。大多数情况下,您的 IDE 隐藏了以下事实:您的主程序正在循环运行(就像 Arduino IDE 那样),或者退出您的程序会使微控制器复位,并且只会再次启动程序。

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

,

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

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

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

您可能希望使用显示程序汇编级别的模拟器来跟踪控制流程。

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

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?