我在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文件中的某些函数中使用
答案 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();
中显示的相同的错误
如果在主函数内部给出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();