出现multiple definition of `TlM 20ms Flagmultiple definition of ‘TlM 500ms Flag多重定义,解决方法

主要目的:通过定时器100ms,实现LED灯翻转。主要涉及三个文件main.c,pit_lld_cfg.h,pit_lld_cfg.c。

如下图所示,main.c

#include "components.h"
#include "delay.h"
#include "pit_lld_cfg.h"
int main(void) {

  /* Initialization of all the imported components in the order specified in
     the application wizard. The function is generated automatically.*/
  componentsInit();
  irqIsrEnable();   //开中断

  /*配置PIT并启动*/
  pit_lld_start(&PITD,pit_config);
  pit_lld_channel_start(&PITD,2);
  /* Uncomment the below routine to Enable Interrupts. */
  /* irqIsrEnable(); */

  //pal_lld_setpad(PORT_E,LD1);
  pal_lld_clearpad(PORT_E,LD1);

  /* Application main loop.*/
  for ( ; ; ) {
	/*延迟函数 */
	//pal_lld_togglepad(PORT_E,LD1);
	//delay_ms(1000);
	/*定时器中断 */
	if(TIM_100ms_Flag == 1)
	{
		pal_lld_togglepad(PORT_E,LD1);
		TIM_100ms_Flag = 0;
	}
  }
}

pit_lld_cfg.h

#ifndef _PIT_LLD_CFG_H_
#define _PIT_LLD_CFG_H_

#include "spc5_lld.h"
#include "pit_lld.h"

vuint8_t sg_1ms_Tic;
vuint8_t TIM_1ms_Flag;
vuint8_t TIM_10ms_Flag;
vuint8_t TIM_20ms_Flag;
vuint8_t TIM_100ms_Flag;
vuint8_t TIM_500ms_Flag;
vuint8_t TIM_1s_Flag;
vuint8_t TIM_1min_Flag;

#if (LLD_USE_PIT == TRUE) || defined(__DOXYGEN__)

/*===========================================================================*/
/* Driver constants.                                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Driver pre-compile time settings.                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Derived constants and error checks.                                       */
/*===========================================================================*/

/*===========================================================================*/
/* Driver data strupitres and types.                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Driver macros.                                                            */
/*===========================================================================*/

/*===========================================================================*/
/* External declarations.                                                    */
/*===========================================================================*/

/* List of the PITConfig strucutres defined in pit_lld_cfg.c.*/
extern PIT_CH_Config pit_config[SPC5_PIT_CHANNELS];

/* To make applications interface fully compatible. */
#define PIT1 PITD
#define PITD1 PITD
#define pit0_config pit_config

#ifdef __cplusplus
extern "C" {
#endif
/*Callback Prototypes*/
  void PIT_1msHandle(void);
#ifdef __cplusplus
}
#endif

#endif /* LLD_USE_PIT */

#endif /* _PIT_LLD_CFG_H_ */

/** @} */

pit_lld_cfg.c

#include "pit_lld_cfg.h"
#include "spc5_lld.h"

#if (LLD_USE_PIT == TRUE) || defined(__DOXYGEN__)

/*===========================================================================*/
/* Driver local definitions.                                                 */
/*===========================================================================*/

/*===========================================================================*/
/* Driver exported variables.                                                */
/*===========================================================================*/

PIT_CH_Config pit_config[SPC5_PIT_CHANNELS] ={
  {FALSE,0,NULL}
  ,
  {FALSE,0,NULL}
  ,
  {TRUE,1000,PIT_1msHandle}
  ,
  {FALSE,0,NULL}
  ,
  {FALSE,0,NULL}
  ,
  {FALSE,0,NULL}
};


/*===========================================================================*/
/* Driver local types.                                                       */
/*===========================================================================*/

/*===========================================================================*/
/* Driver local variables.                                                   */
/*===========================================================================*/

/*===========================================================================*/
/* Driver local functions.                                                   */
/*===========================================================================*/

/*===========================================================================*/
/* Driver exported functions.                                                */
/*===========================================================================*/
void PIT_1msHandle(void)
{
	sg_1ms_Tic ++;
	sg_1ms_Tic % 1 == 0 ? TIM_1ms_Flag = 1:0;
	sg_1ms_Tic % 10 == 0 ? TIM_10ms_Flag = 1:0;
	sg_1ms_Tic % 20 == 0 ? TIM_20ms_Flag = 1:0;
	sg_1ms_Tic % 100 == 0 ? TIM_100ms_Flag = 1:0;
	sg_1ms_Tic % 500 == 0 ? TIM_500ms_Flag = 1:0;
	sg_1ms_Tic % 1000 == 0 ? TIM_1s_Flag = 1:0;
	sg_1ms_Tic % 60000 == 0 ? (TIM_1min_Flag = 1,sg_1ms_Tic = 0):0;
}
#endif /* LLD_USE_PIT */

/** @} */

将这个工程运行,出现错误,多重定义

multiple definition of 'sg 1ms Tic
multiple definition of TlM 100ms Flag

multiple definition of TlM 10ms Flag

multiple definition of TlM 1min Flag

multiple definition of 'TlM 1ms Flag

multiple definition of TlM 1s Flag

multiple definition of `TlM 20ms Flag

multiple definition of 'TlM 500ms Flag

解决方法:不要在头文件中定义变量,去.c中定义,然后其他要用的文件把变量extern 进来

操作:将变量放在.c定义后,会报错

main.c:45:5: error: 'TIM_100ms_Flag' undeclared (first use in this function)

再将变量extern,就不会报错了。

修改后的pit_lld_cfg.h和pit_lld_cfg.c如下:

pit_lld_cfg.h


#ifndef _PIT_LLD_CFG_H_
#define _PIT_LLD_CFG_H_

#include "spc5_lld.h"
#include "pit_lld.h"

extern vuint8_t sg_1ms_Tic;
extern vuint8_t TIM_1ms_Flag;
extern vuint8_t TIM_10ms_Flag;
extern vuint8_t TIM_20ms_Flag;
extern vuint8_t TIM_100ms_Flag;
extern vuint8_t TIM_500ms_Flag;
extern vuint8_t TIM_1s_Flag;
extern vuint8_t TIM_1min_Flag;

#if (LLD_USE_PIT == TRUE) || defined(__DOXYGEN__)

/*===========================================================================*/
/* Driver constants.                                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Driver pre-compile time settings.                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Derived constants and error checks.                                       */
/*===========================================================================*/

/*===========================================================================*/
/* Driver data strupitres and types.                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Driver macros.                                                            */
/*===========================================================================*/

/*===========================================================================*/
/* External declarations.                                                    */
/*===========================================================================*/

/* List of the PITConfig strucutres defined in pit_lld_cfg.c.*/
extern PIT_CH_Config pit_config[SPC5_PIT_CHANNELS];

/* To make applications interface fully compatible. */
#define PIT1 PITD
#define PITD1 PITD
#define pit0_config pit_config

#ifdef __cplusplus
extern "C" {
#endif
/*Callback Prototypes*/
  void PIT_1msHandle(void);
#ifdef __cplusplus
}
#endif

#endif /* LLD_USE_PIT */

#endif /* _PIT_LLD_CFG_H_ */

/** @} */

pit_lld_cfg.c

#include "pit_lld_cfg.h"
#include "spc5_lld.h"
vuint8_t sg_1ms_Tic;
vuint8_t TIM_1ms_Flag;
vuint8_t TIM_10ms_Flag;
vuint8_t TIM_20ms_Flag;
vuint8_t TIM_100ms_Flag;
vuint8_t TIM_500ms_Flag;
vuint8_t TIM_1s_Flag;
vuint8_t TIM_1min_Flag;

#if (LLD_USE_PIT == TRUE) || defined(__DOXYGEN__)

/*===========================================================================*/
/* Driver local definitions.                                                 */
/*===========================================================================*/

/*===========================================================================*/
/* Driver exported variables.                                                */
/*===========================================================================*/

PIT_CH_Config pit_config[SPC5_PIT_CHANNELS] ={
  {FALSE,0,NULL}
  ,
  {FALSE,0,NULL}
  ,
  {TRUE,1000,PIT_1msHandle}
  ,
  {FALSE,0,NULL}
  ,
  {FALSE,0,NULL}
  ,
  {FALSE,0,NULL}
};


/*===========================================================================*/
/* Driver local types.                                                       */
/*===========================================================================*/

/*===========================================================================*/
/* Driver local variables.                                                   */
/*===========================================================================*/

/*===========================================================================*/
/* Driver local functions.                                                   */
/*===========================================================================*/

/*===========================================================================*/
/* Driver exported functions.                                                */
/*===========================================================================*/
void PIT_1msHandle(void)
{
	sg_1ms_Tic ++;
	sg_1ms_Tic % 1 == 0 ? TIM_1ms_Flag = 1:0;
	sg_1ms_Tic % 10 == 0 ? TIM_10ms_Flag = 1:0;
	sg_1ms_Tic % 20 == 0 ? TIM_20ms_Flag = 1:0;
	sg_1ms_Tic % 100 == 0 ? TIM_100ms_Flag = 1:0;
	sg_1ms_Tic % 500 == 0 ? TIM_500ms_Flag = 1:0;
	sg_1ms_Tic % 1000 == 0 ? TIM_1s_Flag = 1:0;
	sg_1ms_Tic % 60000 == 0 ? (TIM_1min_Flag = 1,sg_1ms_Tic = 0):0;
}
#endif /* LLD_USE_PIT */

/** @} */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值