C 擦除和写入闪存会在构建时出错
我正在为NXP飞思卡尔kinetis微控制器KEA128编写一个C程序。我修改了链接器描述文件,并继续用C编写一个简单的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
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不支持符号常量(枚举常量除外)。