英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 4068|回复: 1
打印 上一主题 下一主题

多个c文件和一个c文件的区别?

[复制链接]
跳转到指定楼层
1#
发表于 2009-3-28 16:01:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用PICC18 + MPLAB + ICD2. 我做了一个小测试程序,这是把rb0每500ms闪烁一次。我发现如果把所有代码写成一个c文件,就可以;但分成几个c文件, 就不行了:
(方法1) 如果把所有的代码放入一个c文件,什么都可以。把icd2当成debugger在板子上转程序,可以;把icd2当成烧录器把程序烧到板子上,断开icd2,让板子独立运行,也可以。
(方法2)把闪烁那句话 (RB0 = !RB0)做成一个独立的c文件,加入到project中。这时候把icd2当成debugger在板子上转程序,可以;把icd2当成烧录器把程序烧到板子上,断开icd2,让板子独立运行,不行。灯闪的特别快,有时还停。
我的问题是:在一个project中,写成一个c文件和分割成多个c文件有什么区别?有时候你必须放到多个c文件里,那怎么办?

刚才说的两种方法, 我都用的compiler, linker and assambler的缺省设置. 我同时也试了以下的设置:

compiler: Global Optimization level = 9
enable assembly optimization = UNCHECKED
assembler: Enable optimization = checked
linker: warning level = -9

结果是相同的。

烧片的时候enable了 WDT. 也试过disable WDT, 更不行。

我的程序:

方法1: (one big main.c file, and the isr):

/* main.c */
#include
#include "mainPLC.h"

volatile unsigned char flashyCounter = 0;

void TaskFlashy(void)
{
RB0 = !RB0;
}



void main(void)
{
/*** timer0, 10 ms tick ***/
T0CON=0b01000110; //preload=178. 78*128*1us=10ms
TMR0IF=0;
TMR0L = 178;
TMR0IE=1;
PEIE = 1;
GIE = 1;
TMR0ON = 1;

/**** Port Init ***/
TRISB = 0x00; /* PortB: digital output */

for(;;)
{
if(flashyCounter >= 50)
{
flashyCounter = 0;
TaskFlashy();
}
}
}

/* isr.c */
#include
#include "mainPLC.h"
void interrupt ISR(void)
{
if(TMR0IE && TMR0IF) // Timer0 interrupt
{
TMR0IF = 0;
TMR0L = 178;
flashyCounter = flashyCounter + 1;
}
}

方法 2: (main.c file, taskFlashy.c file and the isr):

/* main.c */
#include
#include "mainPLC.h"

volatile unsigned char flashyCounter = 0;

extern void TaskFlashy(void);


void main(void)
{
/*** timer0, 10 ms tick ***/
T0CON=0b01000110; //preload=178. 78*128*1us=10ms
TMR0IF=0;
TMR0L = 178;
TMR0IE=1;
PEIE = 1;
GIE = 1;
TMR0ON = 1;

/**** Port Init ***/
TRISB = 0x00; /* PortB: digital output */

for(;;)
{
if(flashyCounter >= 50)
{
flashyCounter = 0;
TaskFlashy();
}
}
}

/* isr.c */
#include
#include "mainPLC.h"
void interrupt ISR(void)
{
if(TMR0IE && TMR0IF) // Timer0 interrupt
{
TMR0IF = 0;
TMR0L = 178;
flashyCounter = flashyCounter + 1;
}
}


/* taskFlashy.c */
#include
#include "mainPLC.h"

void TaskFlashy(void)
{
RB0 = !RB0; //toggle RB0
}
;


我的问题是:在一个project中,写成一个c文件和分割成多个c文件有什么区别?有时候你必须放到多个c文件里,那怎么办?
2#
 楼主| 发表于 2009-3-28 16:02:42 | 只看该作者
将 extern void TaskFlashy(void); 句改为

#include "TaskFlashy"

然后去掉 /* taskFlashy.c */  文件中的
#include
#include "mainPLC.h"
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-5-10 13:23 , Processed in 0.051292 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表