C 擦除和写入闪存会在构建时出错

C 擦除和写入闪存会在构建时出错,c,embedded,linker-scripts,nxp-microcontroller,C,Embedded,Linker Scripts,Nxp Microcontroller,我正在为NXP飞思卡尔kinetis微控制器KEA128编写一个C程序。我修改了链接器描述文件,并继续用C编写一个简单的C程序。但是当我构建项目时,它给出了以下错误消息 build\src\flash.o:(.rodata.flashLocat+0x0): multiple definition of `flashLocat' build\src\main.o:(.rodata.flashLocat+0x0): first defined here collect2.exe: error: ld

我正在为NXP飞思卡尔kinetis微控制器KEA128编写一个C程序。我修改了链接器描述文件,并继续用C编写一个简单的C程序。但是当我构建项目时,它给出了以下错误消息

build\src\flash.o:(.rodata.flashLocat+0x0): multiple definition of `flashLocat'
build\src\main.o:(.rodata.flashLocat+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
在这里,我附上了我的C程序文件和主文件,它调用擦除和写入flash的函数以及我的链接器描述文件。下面是我的flash.c和flash.h文件

#include "flash.h"

int flashEraseSector(long int locat)
{
        int temp1,temp2,temp3;

            temp1 = (locat << 8);
            temp1 = temp1 >> 24;
            temp2 = (locat << 16);
            temp2 = temp2 >> 24;
            temp3 = (locat << 24);
            temp3 = temp3 >> 24;


            while(((FTMRE_FSTAT)&(1UL << 7))==0x00);

            if(!((FTMRE_FSTAT)==0x80))
                    {FTMRE_FSTAT = 0x30;}

            int IX = 0;
            FTMRE_FCCOBIX = temp1;
            IX = 1;
            FTMRE_FCCOBIX = temp2;
            IX = 2;
            FTMRE_FCCOBIX = temp3;
            IX = 3;
            FTMRE_FCCOBIX = 0x0A;   //erase a sector

            FTMRE_FSTAT = 0x80;

            while(((FTMRE_FSTAT)&(1UL << 7))==0x00);
        return 1;
}

/*------------------------------------------------------------------------------
  Write a long word to an erased flash block
 *------------------------------------------------------------------------------*/

int flashWriteLongWord(long int locat,long int value)
{
        int temp1,temp2,temp3,temp4,temp5,temp6,temp7;

            temp1 = (locat << 8);
            temp1 = temp1 >> 24;
            temp2 = (locat << 16);
            temp2 = temp2 >> 24;
            temp3 = (locat << 24);
            temp3 = temp3 >> 24;
            temp4 = value >> 24;
            temp5 = (value << 8);
            temp5 = temp5 >> 24;
            temp6 = (value << 16);
            temp6 = temp6 >> 24;
            temp7 = (value << 24);
            temp7 = temp7 >> 24;

            while(((FTMRE_FSTAT)&(1UL << 7))==0x00);

            if(!((FTMRE_FSTAT)==0x80))
                    {FTMRE_FSTAT = 0x30;}
            int IX = 0;
            FTMRE_FCCOBIX = 0x06;    //0x06 is instruction code for write long word.
            IX = 1;
            FTMRE_FCCOBIX = temp1;
            IX = 2;
            FTMRE_FCCOBIX = temp2;
            IX = 3;
            FTMRE_FCCOBIX = temp3;
            IX = 4;
            FTMRE_FCCOBIX = temp4;
            IX = 5;
            FTMRE_FCCOBIX = temp5;
            IX = 6;
            FTMRE_FCCOBIX = temp6;
            IX = 7;
            FTMRE_FCCOBIX = temp7;

            FTMRE_FSTAT = 0x80;

            while(((FTMRE_FSTAT)&(1UL << 7))==0x00);
        return 1;
}
这是我的主要文件 内部主(空) { 长整型值; uint8_t闪光状态; 数值=2147483648

    NVIC_ISER |= ((unsigned int)0x1<<22); // Interrupt Set-Enable Register, IRQ22 (PIT_CH0)

    PIT_TFLG0 = 0x1; // clear TIF
    PIT_TCTRL0 = 0x03; // CHN = 0 -> not chained, TIE = 1 -> interrupt enabled, TEN = 1 -> timer enabled

    CpuComm_Init();

    flashStatus = flashEraseSector(flashLocat);
    flashWriteLongWord(flashLocat,value);

    for(;;)
    {
    }

    return 0;
}

因为在flash.c和main.c中都包含flash.h,所以变量flashLocat定义了两次。这就是为什么会出现错误。

在头文件中,您应该声明常量:

extern const long int flashLocat;
const long int flashLocat = 0x00000800;
然后在单个源文件中,在任何函数外部的全局范围内,定义常量:

extern const long int flashLocat;
const long int flashLocat = 0x00000800;

不要在头文件中定义变量或常量。如果这样做,那么它们将在包含头文件的每个位置定义。只在头文件中声明变量和常量。如果我在main函数中声明并构建了它,并且它显示一个名为
src\main.c:358:14的错误:只读变量'flashLocat'的赋值flashLocat=0x0000800;
还请注意,虽然您的代码可能是用于特定目的,但您遇到的问题实际上与该目的无关。您应该将问题的标题简短地概括为您遇到的实际问题。请,我也建议您阅读。是的,我如您所说,但错误是
src\main.c:358:14:错误:只读变量'flashLocat'flashLocat=0x0000080;
我应该在链接器描述文件中做任何更改吗?@user8540390那么你在做其他错误的事情。如果你完全按照我在回答中说的做,你不应该有那个问题。在我看来,你做了很多你没有告诉我们的事情,其中一个这些都是常量的赋值,这是不允许的。当remove const关键字时,Build没有给出错误,但我指定的地址在闪存中(从我的链接器描述文件0x0000800地址在闪存中)这行得通吗?它没有错误…在移植到板上之前,这不会损坏我的闪存吧?基于这个概念,我做得对吗?只是擦除512字节并写入闪存
flashLocat
不是一个常量。C不支持符号常量(枚举常量除外)。