【发布时间】:2015-02-08 04:42:30
【问题描述】:
为什么 exit() 不适用于 PIC16f877?
#include <htc.h>
#include <pic16f877.h>
#include <stdlib.h>
#define _XTAL_FREQ 4e6
int main(void){
int count;
int max_count = 6;
TRISD = 0xBF;
for (count=0; count<max_count; ++count){
PORTD = 0x40;
__delay_ms(500);
PORTD = 0x00;
__delay_ms(500);
}
exit(0);
}
错误信息:
Error [482] lab1_home.obj; 20. symbol "_exit" is defined more than once in "startup.obj"
Error [482] lab1_home.obj; 20. symbol "_exit" is defined more than once in "startup.obj"
这些代码程序编译成功的原因是什么,但是led一直在闪烁?
尝试1:
#include <htc.h>
#include <pic16f877.h>
#define _XTAL_FREQ 4e6
void main(void){
int count;
int max_count = 6;
TRISD = 0xBF;
for (count=0; count<max_count; ++count){
PORTD = 0x40;
__delay_ms(500);
PORTD = 0x00;
__delay_ms(500);
}
return;
}
尝试2:
#include <htc.h>
#include <pic16f877.h>
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4e6
int main(void){
int count = 0;
int max_count = 6;
TRISD = 0xBF;
do {
count++;
PORTD = 0x40;
__delay_ms(500);
PORTD = 0x00;
__delay_ms(500);
} while ( count != max_count );
abort;
}
循环没有退出吗?还是我试图终止程序的方式错误?我还考虑了另外一件事……WDT 与这个循环永远重复有什么关系吗?
【问题讨论】:
-
你的第二个循环没有初始化
count,所以它有一个不确定的值。这就是为什么你有一个无限循环。第一个问题是多重定义的符号。坚持使用第一个版本并弄清楚为什么exit被多次定义(检查你的标题)。最后,您不需要显式中止或退出;让 main 完成。 -
而不是 exit(0);在 int main() 你可以做 return 0;
-
要诊断问题,在程序结束时,您可以将 PORTD 设置回输入 (
TRISD=0xff;) 并添加 2 秒的延迟。看看会发生什么 -
我想我在这里找到了答案:What happens when an embedded program finishes?
-
又是我的错...是
SLEEP()...