Commit d0088c9d authored by 李冠华's avatar 李冠华

feat:增加校验提供的flash空间是否够用的功能

parent 35ace98a
......@@ -12,47 +12,11 @@
uint32_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK0_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_FLAG_SIZE)
// uint32_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK1_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_S27_SIZE)
// uint32_t g_u32EEPROMBlock1Buffer[EEPROM_BLOCK1_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK2_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_S2E_SIZE)
// uint32_t g_u32EEPROMBlock2Buffer[EEPROM_BLOCK2_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK3_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_CONFIG_SIZE)
// uint32_t g_u32EEPROMBlock3Buffer[EEPROM_BLOCK3_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK4_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_DTC_SIZE)
// uint32_t g_u32EEPROMBlock4Buffer[EEPROM_BLOCK4_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK5_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_ODO_SIZE)
// uint32_t g_u32EEPROMBlock5Buffer[EEPROM_BLOCK5_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK6_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_ODO_STAMP_SIZE)
// uint32_t g_u32EEPROMBlock6Buffer[EEPROM_BLOCK6_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK7_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_TRIP_STAMP_SIZE)
// uint32_t g_u32EEPROMBlock7Buffer[EEPROM_BLOCK7_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK8_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_SERVICE_INFO_SIZE)
// uint32_t g_u32EEPROMBlock8Buffer[EEPROM_BLOCK8_BUFFER_SIZE / 4U];
static const EEPROM_Block_st_t g_stEEPROMBlockTable[] =
{
/* u32StartAddr u32EndAddr u32DataSize pu32DataBuffer */
{SECTOR_14_START_ADDR, 0x0801E7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,},
// {0x08019080UL, 0x080190FFUL, EEPROM_BLOCK1_BUFFER_SIZE, g_u32EEPROMBlock1Buffer,},
// {0x08019100UL, 0x0801917FUL, EEPROM_BLOCK2_BUFFER_SIZE, g_u32EEPROMBlock2Buffer,},
// {0x08019180UL, 0x080191FFUL, EEPROM_BLOCK3_BUFFER_SIZE, g_u32EEPROMBlock3Buffer,},
// {0x08019200UL, 0x0801927FUL, EEPROM_BLOCK4_BUFFER_SIZE, g_u32EEPROMBlock4Buffer,},
// {0x08019280UL, 0x0801967FUL, EEPROM_BLOCK5_BUFFER_SIZE, g_u32EEPROMBlock5Buffer,},
// {0x08019680UL, 0x08019B7FUL, EEPROM_BLOCK6_BUFFER_SIZE, g_u32EEPROMBlock6Buffer,},
// {0x08019B80UL, 0x0802157FUL, EEPROM_BLOCK7_BUFFER_SIZE, g_u32EEPROMBlock7Buffer,},
// {0x08021580UL, 0x080215FFUL, EEPROM_BLOCK8_BUFFER_SIZE, g_u32EEPROMBlock8Buffer,},
/*u32UsageTimes u32StartAddr u32EndAddr u32DataSize pu32DataBuffer */
{EEPROM_TARGET_ERASE_NUM, SECTOR_14_START_ADDR, 0x0801E7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,},
{EEPROM_TARGET_ERASE_NUM1, SECTOR_12_START_ADDR, 0x0801A7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,},
};
/****************************************************************************
......@@ -61,9 +25,10 @@ static const EEPROM_Block_st_t g_stEEPROMBlockTable[] =
EEPROM_Block_Access_st_t g_stEEPROMBlockAccess[EEPROM_TOTAL_BLOCK_NUM];
void EEPROM_Init(void)
EEPROM_Init_Status_en_t EEPROM_Init(void)
{
EEPROM_Media_Access_st_t stFlashAccessFunc;
uint8_t u8Result = 0U;
// TYW_FDL_Init();
......@@ -74,10 +39,19 @@ void EEPROM_Init(void)
// Int_Data_Flash_Register_P_E_Complete_Cb(EEPROM_Mem_Access_Complete_Callback);
EEPROM_Access_Init( g_stEEPROMBlockTable,
g_stEEPROMBlockAccess,
&stFlashAccessFunc,
EEPROM_TOTAL_BLOCK_NUM);
u8Result = EEPROM_Access_Init( g_stEEPROMBlockTable,
g_stEEPROMBlockAccess,
&stFlashAccessFunc,
EEPROM_TOTAL_BLOCK_NUM);
if (u8Result == 0xFFU)
{
return EEPROM_INIT_FAIL;
}
else
{
return EEPROM_INIT_SUCCESS;
}
}
EEPROM_Status_en_t EEPROM_Get_Status(void)
......
......@@ -22,6 +22,13 @@ typedef enum
EEPROM_STAT_BUSY,
}EEPROM_Status_en_t;
typedef enum
{
EEPROM_INIT_SUCCESS = 0,
EEPROM_INIT_FAIL,
}EEPROM_Init_Status_en_t;
/****************************************************************************
* !!! The following code should be generated by configuration tool !!! *
****************************************************************************/
......@@ -50,11 +57,14 @@ enum g_enEEPROMBlockName
#define EEPROM_TOTAL_BLOCK_NUM (1U)/*创建的独立的负载均衡空间的个数*/
#define EEPROM_TARGET_ERASE_NUM 4000000U
#define EEPROM_TARGET_ERASE_NUM1 4000000U
/****************************************************************************
* !!! End of code generation !!! *
****************************************************************************/
extern void EEPROM_Init(void);
extern EEPROM_Init_Status_en_t EEPROM_Init(void);
extern EEPROM_Status_en_t EEPROM_Get_Status(void);
extern EEPROM_Block_Status_en_t EEPROM_Get_Block_Status(uint16_t u16BlockID);
......
......@@ -192,15 +192,13 @@ EEPROM_Mem_Blank_Chk_Func_ptr_t g_pfnEEPROMMemBlankCheck;
EEPROM_Mem_Read_Func_ptr_t g_pfnEEPROMMemRead;
EEPROM_Mem_Write_Func_ptr_t g_pfnEEPROMMemWrite;
void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
uint8_t EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
EEPROM_Block_Access_st_t * pstBlockAccess,
EEPROM_Media_Access_st_t * pstMediaAccess,
uint16_t u16BlockNum)
{
uint16_t i;
uint8_t u8Loop;
uint8_t u8Ready;
uint16_t u16Index;
uint16_t u16IndexBkup;
uint16_t u16RecordNum;
......@@ -210,12 +208,40 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
uint32_t u32DataAddr;
uint32_t u32DataAddrBase;
uint32_t u32DataAddrEnd;
uint32_t u32DataSpaceSize = 0U;
uint32_t u32GivenSpaceSize = 0U;
uint32_t u32LostAccuracy = 0U;
EEPROM_Ctrl_Data_un_t unCtrlData;
if ((pstBlockTable != NULL) && (pstBlockAccess != NULL) &&\
(pstMediaAccess != NULL) && (u16BlockNum != 0U))
{
/*** Step 0 : 通过传入的使用次数计算使用的flash空间大小,是否会超限 */
for (i = 0U; i < u16BlockNum; i++)
{
u32LostAccuracy = 0U;
u32LostAccuracy = pstBlockTable[i].u32UsageTimes % MAX_ERASE_FREQUENCY; /*计算空间时丢失的精度*/
if (u32LostAccuracy != 0U)
{
/*增加1个存储块的空间*/
u32LostAccuracy = 1U;
}
u32DataSpaceSize += (((pstBlockTable[i].u32UsageTimes / MAX_ERASE_FREQUENCY) + u32LostAccuracy) * ONE_PAGE_LEN);
u32GivenSpaceSize += (pstBlockTable[i].u32EndAddr - pstBlockTable[i].u32StartAddr + 1U);
}
printf("u32DataSpaceSize wei : %x\n\r",u32DataSpaceSize);
printf("u32GivenSpaceSize wei : %x\n\r",u32GivenSpaceSize);
if (u32DataSpaceSize > u32GivenSpaceSize)
{
printf("kong jian bu zu!\n\r");
return 0xFFU;
}
/*** Step 1 : Setup media(data flash) access functions ***/
g_pfnEEPROMMemErase = pstMediaAccess->pfnMemErase;
g_pfnEEPROMMemBlankCheck = pstMediaAccess->pfnMemBlankChk;
......@@ -224,7 +250,7 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
/*** Step 2 : Generate flash read / write control data ***/
g_stEEPROMAccess.u8State = EEPROM_WR_STATE_IDLE;
g_stEEPROMAccess.u16BlockNum = u16BlockNum; /*可以操作的E方的区域(这个项目是9个,对应g_stEEPROMBlockTable这个数组)*/
g_stEEPROMAccess.u16BlockNum = u16BlockNum; /*可以操作的E方的区域,可以按项目将flash划分为多个磨损空间,每个空间存储擦写次数相近的数据*/
g_pstEEPROMBlock = pstBlockAccess;
......@@ -276,7 +302,6 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
}
u16RecordNum = 0U;
u8Ready = 0U;
while (u8Loop)
{
......@@ -287,7 +312,6 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
if (unCtrlData.stField.u16Index + unCtrlData.stField.u16IndexInv == 0xFFFFU)
{
u8Loop = 0U;
u8Ready = 1U;
g_pstEEPROMBlock[i].u8Status = EEPROM_BLOCK_ACTIVE;
g_pstEEPROMBlock[i].u8SectorOffset = 0U;
......@@ -443,6 +467,11 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
}while(u8Loop);
}
}
return 0;
}
else
{
return 0xFFU;
}
}
......
......@@ -5,9 +5,11 @@
#include <stdint.h>
#define ONE_PAGE_LEN 0x100U
#define MAX_ERASE_FREQUENCY 100000U
typedef struct
{
uint32_t u32UsageTimes;
uint32_t u32StartAddr;
uint32_t u32EndAddr;
uint32_t u32DataSize;
......@@ -47,7 +49,7 @@ typedef struct
#define EEPROM_BLOCK_CTRL_BYTE_SIZE (8U)
extern void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
extern uint8_t EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
EEPROM_Block_Access_st_t * pstBlockAccess,
EEPROM_Media_Access_st_t * pstMediaAccess,
uint16_t u16BlockNum);
......
......@@ -7,22 +7,22 @@
#define FLASH_DATA_LEN 32
#define SECTOR_0_START_ADDR 0x08000000
#define SECTOR_1_START_ADDR 0x08002000
#define SECTOR_2_START_ADDR 0x08004000
#define SECTOR_3_START_ADDR 0x08006000
#define SECTOR_4_START_ADDR 0x08008000
#define SECTOR_5_START_ADDR 0x0800A000
#define SECTOR_6_START_ADDR 0x0800C000
#define SECTOR_7_START_ADDR 0x0800E000
#define SECTOR_8_START_ADDR 0x08010000
#define SECTOR_9_START_ADDR 0x08012000
#define SECTOR_10_START_ADDR 0x08014000
#define SECTOR_11_START_ADDR 0x08016000
#define SECTOR_12_START_ADDR 0x08018000
#define SECTOR_13_START_ADDR 0x0801A000
#define SECTOR_14_START_ADDR 0x0801C000
#define SECTOR_15_START_ADDR 0x0801E000
#define SECTOR_0_START_ADDR 0x08000000UL
#define SECTOR_1_START_ADDR 0x08002000UL
#define SECTOR_2_START_ADDR 0x08004000UL
#define SECTOR_3_START_ADDR 0x08006000UL
#define SECTOR_4_START_ADDR 0x08008000UL
#define SECTOR_5_START_ADDR 0x0800A000UL
#define SECTOR_6_START_ADDR 0x0800C000UL
#define SECTOR_7_START_ADDR 0x0800E000UL
#define SECTOR_8_START_ADDR 0x08010000UL
#define SECTOR_9_START_ADDR 0x08012000UL
#define SECTOR_10_START_ADDR 0x08014000UL
#define SECTOR_11_START_ADDR 0x08016000UL
#define SECTOR_12_START_ADDR 0x08018000UL
#define SECTOR_13_START_ADDR 0x0801A000UL
#define SECTOR_14_START_ADDR 0x0801C000UL
#define SECTOR_15_START_ADDR 0x0801E000UL
typedef struct
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment