错误:'type name'声明为返回函数的函数

时间:2014-08-10 06:38:27

标签: c

我正在使用avr-gcc为PID控制器开发一个小型库。尽管在头文件中声明了该函数并在.c文件中单独定义它,但编译器会抛出以下错误:

Compiling C: pid.c
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -                 
funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-  
adhlns=./pid.lst  -std=gnu99 -MMD -MP -MF .dep/pid.o.d pid.c -o pid.o 
pid.c:5: error: expected declaration specifiers or '...' before '(' token
pid.c:5: warning: function declaration isn't a prototype
pid.c:5: error: 'type name' declared as function returning a function
pid.c:5: error: conflicting types for 'PID_init'
pid.h:23: error: previous declaration of 'PID_init' was here
pid.c: In function 'PID_init':
pid.c:5: error: parameter name omitted

pid.h的头文件内容如下:

#include<avr/io.h>
#include<util/delay.h>

#ifndef PID_CONTROLLER
#define PID_CONTROLLER
struct PIDCONTROL

{

float error;
float prev_error;
float Kp;
float Ki;
float Kd;                       
float pid;
float P;
float I;
float D;
float setpoint;

};

void PID_init(float,float,float,float,struct PIDCONTROL*);

float PID(float,struct PIDCONTROL*);                        

#endif

声明函数的定义已在pid.c中进行,其中包含以下代码:

#include<avr/io.h>
#include<util/delay.h>
#include "pid.h"

void PID_init(float SP,float Kp,float Ki,float Kd,struct PIDCONTROL *a)

{

a->Kp=Kp;

a->Ki=Ki;

a->Kd=Kd;

a->pid=0;

a->setpoint=SP;

a->prev_error=0;

}


float PID(float PV,struct PIDCONTROL *a)

{

a->error=(a->setpoint)-PV;

a->P=(a->Kp)*(a->error);

(a->I)+=(a->Ki)*(a->error)*1.024;

a->D=(a->Kd)*((a->error)-(a->prev_error))/1.024;

a->pid=(a->P)+(a->I)+(a->D);

a->prev_error=a->error;

return(a->pid);

}

我无法弄清楚代码有什么问题。任何帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:1)

avr/io.h文件还会引入包含此小片段的avr/common.h

/*
    Stack pointer register.
        AVR architecture 1 has no RAM, thus no stack pointer.
        All other architectures do have a stack pointer. Some devices have only
            less than 256 bytes of possible RAM locations (128 Bytes of SRAM
            and no option for external RAM), thus SPH is officially "reserved"
            for them.
*/

# ifndef SP
    # define SP _SFR_MEM16(0x3D)
# endif

(它实际上比这复杂一点,多路径取决于你的架构,但是这个减少的例子显示了实际问题是什么,至少)。

它实际上为SP定义了一个预处理器宏,这意味着,当您尝试在代码中使用函数定义时,可以使用以下内容:

void PID_init(float SP,float Kp,float Ki,float Kd,struct PIDCONTROL *a)

实际获得的内容是:

void PID_init(float _SFR_MEM16(0x3D),float Kp,float Ki,float Kd,struct PIDCONTROL *a)

会导致编译阶段抱怨。

我实际上是相信自我描述变量名称的忠实信徒所以通常会选择比SP更冗长的东西,但你可能会发现,即使你做了mySP,它也是如此我会解决眼前的问题。