C中带有eeprom函数的C语法错误

时间:2014-01-26 06:13:41

标签: c syntax avr

我有以下功能。我很久以前就已经写好了并且使用得很好,但现在它在Codevision软件中给我一个语法错误.... 错误发生在函数的声明中,可能来自参数....

void ReadGainPots(void);
void RxGetChannels(void);
void read_adc(uint8_t channel);
void output_motor_ppm(void);
void Initial_EEPROM_Config_Load(void);
void Save_Config_to_EEPROM(void);
void Set_EEPROM_Default_Config(void);
void eeprom_write_byte_changed( uint8_t * addr, uint8_t value );
void eeprom_write_block_changes( const char * src, void * dest, size_t size );

void eeprom_write_block_changes( const uint8_t * src, void * dest, size_t size )
{ 
size_t len;

for(len=0;len<size;len++)
{
    eeprom_write_byte_changed( dest,  *src );

    src++;
    dest++;
}
}

2 个答案:

答案 0 :(得分:3)

嗯,没有错误本身,诊断有点困难: - )

第一个我要看的是“Codevision软件”是否理解uint8_t数据类型。这种类型是在C99中引入的,如果某些嵌入式开发环境仍然使用C90,我也不会感到惊讶。

可以包含stdint.h标题。或者,如果编译器支持它,您可以使用另一种兼容的数据类型(可能是unsigned char)。

一种简单的测试方法是暂时将uint8_t更改为char并查看错误是否消失(或者可能会移动到其他地方)。如果确实如此,那么您需要根据uint8_t对您的实施是否有效来确定哪种方法最佳。

如果您某些支持它,那么请告诉我们生成的实际完整错误。没有它,我们就会陷入困境。


还有一些事情需要检查。

首先,之前之前的文本可能会导致问题。它也应该检查。

第二个(这可能是在你混合UNIX / Windows的环境中),检查行结尾。我在编译器需要基于UNIX的LF结尾的环境中看到了基于Windows的CR / LF行结尾的问题。

注释掉该函数并查看错误是否在其他地方持续存在(例如在以下函数中)。这将为原因(功能本身或某些环境问题)提供有价值的线索。


对于它的价值,该代码本身是非常有效的。以下程序编译正常:

#include <stddef.h>
#include <stdint.h>

void eeprom_write_byte_changed (void *dest, uint8_t ch ) {}

void eeprom_write_block_changes( const uint8_t * src, void * dest, size_t size )
{
size_t len;

for(len=0;len<size;len++)
{
    eeprom_write_byte_changed( dest,  *src );

    src++;
    dest++;
}
}

int main(void) {
    eeprom_write_block_changes ("hello", NULL, 42);
    return 0;
}

答案 1 :(得分:1)

uint8_t更改为unsigned char

或者,尝试加入stdint.h

#define uint8_t自己。