冲突类型数据定义没有类型或存储类[默认启用]类型默认为'int'

时间:2018-01-30 14:41:22

标签: c microcontroller

我在main.c文件中有一个名为slave_buffer的指针作为全局变量,如下所示:

l_u8 *slave_buffer = 0;

slave_buffer = lld_response_buffer;

在我的main函数中,我将值放入缓冲区,如下所示:

slave_buffer[1] = 0x12;
slave_buffer[2] = 0x34;

我在另一个名为uart.c的源文件中声明并定义了lld_response_buffer

extern l_u8 lld_response_buffer[10];

l_u8 lld_response_buffer[10];

我已将文件uart.c包含在我的主文件中。

但是当我构建项目时,我可以看到以下错误

conflicting types for 'slave_buffer' (data definition has no type or storage class [enabled by default] type defaults to 'int' in declaration of 'slave_buffer' [-Wimplicit-int]) initialization makes integer from pointer without a cast [enabled by default]

subscripted value is neither array nor pointer nor vector在我将值放入slave_buffer的位置。

这是完整的main.c文件:

#include "derivative.h"  include peripheral declarations 
#include <stdio.h>
#include "uart.h"
#include "uart.c"

#define LED0_TOGGLE     OUTPUT_TOGGLE(PORT_C,16)
#define LED0_OFF        OUTPUT_CLEAR(PORT_C,16)
#define LED0_ON         OUTPUT_SET(PORT_C,16)

/**********************************************************************************************
* Global variables
**********************************************************************************************/
l_u8 ret;
l_u8 i;
l_u8 LED_counter;
l_u8 *slave_buffer = 0;

slave_buffer = lld_response_buffer;



void application_timer_FTM0()
{
    SIM_SCGC |= SIM_SCGC_FTM0_MASK; 
    FTM0_SC |= FTM_SC_PS(7);    

    FTM0_C0SC |= FTM_CnSC_CHIE_MASK; 
    FTM0_C0SC |= FTM_CnSC_MSA_MASK;         

    FTM0_C0V = FTM_CnV_VAL(391) ;       
    FTM0_SC |= FTM_SC_CLKS(1); 


    NVIC_ICPR |= 1 << ((INT_FTM0-16)%32);
    NVIC_ISER |= 1 << ((INT_FTM0-16)%32);
}


void GPIO_Init()
{
        CONFIG_PIN_AS_GPIO(PORT_C,16,OUTPUT); 

        LED0_OFF;                           
}



int main(void)
{
    l_u8 i, ret;
    l_u8 vector_number;

    Clk_Init();
    GPIO_Init();
    ret = l_sys_init();  

    ret = l_ifc_init(LI0);



    vector_number = INT_UART0 -16;


    NVIC_ICPR |= 1 << (vector_number%32);   
    NVIC_ISER |= 1 << (vector_number%32);
    application_timer_FTM0();

    for(;;)
    {               

        slave_buffer[0] = 2;
        slave_buffer[1] = 0x12;
        slave_buffer[2] = 0x34;
        uart_tx_response();

    }       
    return 0;
}


void FTM0_IRQHandler()
  {     
    if (1==((FTM0_C0SC & FTM_CnSC_CHF_MASK)>>FTM_CnSC_CHF_SHIFT) )  
    {
        (void)FTM0_C0SC;                            
        FTM0_C0SC ^= FTM_CnSC_CHF_MASK;             
        FTM0_C0V = FTM0_C0V + 391 ; 

        if (LED_counter>=50){

            LED0_TOGGLE;
            LED_counter = 0;
        }
        LED_counter++;
    }
  }

我在uart.c文件中声明了这些

l_u8          *response_buffer = 0;
extern l_u8 lld_response_buffer[10];

l_u8 lld_response_buffer[10];
response_buffer = lld_response_buffer;

和* response_buffer正在uart.c文件中的某些函数中使用

2 个答案:

答案 0 :(得分:2)

这里有很多问题。

  • 首先,避免在整个地方使用extern l_u8 lld_response_buffer[10];的意大利面条全球。这是非常糟糕的做法,也是导致所有问题的原因。

  • 如果您选择意大利面条编程设计,那么至少slave_buffer = lld_response_buffer;需要在h文件中,而不是c文件中。

  • 然后您在文件范围内有一个作业:()。这不是初始化,因此不能放在那里。您无法在文件范围内执行代码,只能初始化变量。

  • 您不应该出于任何原因包含c文件。它没有意义,会导致链接器错误。

  • 在函数为过时样式后清空extern括号。它不应该在C中使用(但在C ++中很好)。这意味着&#34;这个函数接受任何参数,当你给它除void&#34;以外的任何参数时会快速崩溃。

总的来说,设计需要从头开始重新设计。您似乎正在与来自全世界的驱动程序共享UART缓冲区。如果是这样,请不要这样做。

使当前程序使用快速&amp;脏修复(不推荐),您应该删除// in uart.h: l_u8* get_response_buffer (void); // in uart.c: l_u8* get_response_buffer (void) { return lld_response_buffer; } 和c文件包含。然后添加:

slave_buffer =get_response_buffer();

在main中的函数内,添加{{1}}。 main.c只包括&#34; uart.h&#34;。

但如上所述,如果这是一个UART rx缓冲区,你不应该在整个程序中全部投入,1)因为它并不属于整个程序而且2)你最大可能需要在访问缓冲区时实施针对竞争条件的保护机制,并且可能需要某种双缓冲。这需要在驱动程序内部实现,而不是在其他任何地方实现。

确保所有标题文件都有&#34;标题保护&#34;。

答案 1 :(得分:0)

是的,问题已经消失,我的编译器现在没有错误。我定义了以下

l_u8 *slave_buffer = 0;

slave_buffer = lld_response_buffer;

在我的main函数中,而不是全局变量。

可以用一个小例子来解释

例如考虑我的main.c文件

#include <stdio.h>
#include "extern.h"
int x;
x=10;
int main()
{
    print();
    printf("\n X in the file extern_main.c is %d",x);
    return 0;
}

我的extern.c文件

#include <stdio.h> 
extern int x;  
int x;
void print()
{   
x = 9;
printf("\n x in extern.c is %d",x);
}

我的extern.h文件

void print();

编译我的main.c文件会出现与enter image description here

中显示的相同的错误

如果在主函数内部给出x值而不是全局定义并全局初始化它,则不会抛出错误,如下所示

#include <stdio.h>
#include "extern.c" 
void print();
int main()
{
    int x;
    x=10;
    print();
    printf("\n X in the file extern_main.c is %d",x);
    return 0;
}

我的extern.c文件

#include <stdio.h> 
extern int x;  
int x;
void print()
{   
x = 9;
printf("\n x in extern.c is %d",x);
}

我的extern.h文件

void print();