为什么我的 C 程序在没有使用循环的情况下永远 运行?
Why is my C program continuously run forever without the usage of loop?
我正在 Proteus 仿真软件上使用以下电路测试我的微控制器 PIC18f4550。
我的objective是把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 进入无限循环。
C 运行时环境可能会无限循环地调用 main()
。这可以像这样故意发生:
/* some other stuff... */
for (;;) {
main();
}
或者它可能发生,因为在 main()
的 return 之后,程序内存中的下一个字节使处理器重新启动,例如由于异常或调用后的其他代码。
您可能希望使用显示程序汇编级别的模拟器来跟踪控制流。
另一种选择是使用您的工具反汇编可执行文件。
您正在为微控制器编程。他们没有广泛的OS。在大多数情况下,您的 IDE 隐藏了一个事实,即您的 main 是 运行 在一个循环中(就像 Arduino IDE 那样),或者退出您的程序会使微控制器重置,并且只会开始又是程序。
你将它标记为“mplab”,如果你查看它的文档,它会指出:
"编译器在 main() 的末尾插入特殊代码,如果此函数结束则执行该代码,即执行 main() 中的 return 语句,或者执行代码
到达 main() 的终止右大括号。这个特殊的代码导致执行
跳转到地址 0,即所有 8 位 PIC 器件的复位向量。这基本上执行
软件复位。请注意,软件复位后寄存器的状态可能不同
硬件复位后的那个。
建议main()函数不要结束"
我建议您使用 MPLAB X IDE 中提供的调试器(在模拟器内部)工具,看看单条指令是如何执行的。检查微处理器是否未被任何外围设备重置。
我正在 Proteus 仿真软件上使用以下电路测试我的微控制器 PIC18f4550。
我的objective是把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 进入无限循环。
C 运行时环境可能会无限循环地调用 main()
。这可以像这样故意发生:
/* some other stuff... */
for (;;) {
main();
}
或者它可能发生,因为在 main()
的 return 之后,程序内存中的下一个字节使处理器重新启动,例如由于异常或调用后的其他代码。
您可能希望使用显示程序汇编级别的模拟器来跟踪控制流。
另一种选择是使用您的工具反汇编可执行文件。
您正在为微控制器编程。他们没有广泛的OS。在大多数情况下,您的 IDE 隐藏了一个事实,即您的 main 是 运行 在一个循环中(就像 Arduino IDE 那样),或者退出您的程序会使微控制器重置,并且只会开始又是程序。
你将它标记为“mplab”,如果你查看它的文档,它会指出: "编译器在 main() 的末尾插入特殊代码,如果此函数结束则执行该代码,即执行 main() 中的 return 语句,或者执行代码 到达 main() 的终止右大括号。这个特殊的代码导致执行 跳转到地址 0,即所有 8 位 PIC 器件的复位向量。这基本上执行 软件复位。请注意,软件复位后寄存器的状态可能不同 硬件复位后的那个。 建议main()函数不要结束"
我建议您使用 MPLAB X IDE 中提供的调试器(在模拟器内部)工具,看看单条指令是如何执行的。检查微处理器是否未被任何外围设备重置。