Hi
I had got some problem with fds_record_write(). I found that I couldn't get the correct data from flash without waiting fds_evt_handler( ) that was called after calling fds_record_write( ).
This is the wrong data below.
So I change my code.I had waited fds_evt_handler( ) that was called after calling fds_record_write( ).And I got the correct data.There is below.
And there is my code with waitting fds_evt_handler( ). It must wait for the fds_evt_handler( ) after calling fds_record_write( )?
/*********************************************************************
* Logcal Varialbe
*/
#ifdef FLASH_STORE
static bool data_write_flash_flag;
#endif //FLASH_STORE
/*********************************************************************
* Logcal Function
*/
#ifdef FLASH_STORE
static void fds_evt_handler(fds_evt_t const * p_evt)
{
switch (p_evt->id)
{
case FDS_EVT_INIT:
break;
case FDS_EVT_WRITE:
case FDS_EVT_UPDATE:
if( ( p_evt->write.file_id == DATA_FILE_ID )&&
( p_evt->write.record_key == DATA_RECORD_KEY ) )
{
data_write_flash_flag = false;
}
break;
case FDS_EVT_DEL_RECORD:
if( ( p_evt->write.file_id == DATA_FILE_ID )&&
( p_evt->write.record_key == DATA_RECORD_KEY ) )
{
//data_delete_flash_flag = false;
}
break;
case FDS_EVT_DEL_FILE:
break;
case FDS_EVT_GC:
break;
default:
break;
}
}
#endif //FLASH_STORE
/*********************************************************************
* Gobal Function
*/
/*********************************************************************
* @fn data_store_init
*
* @brief initializing data store
*
*
* @param none
*
* @return none
*/
void data_store_init( )
{
#ifdef FLASH_STORE
uint32_t init_err;
data_write_flash_flag = false;
//data_delete_flash_flag = false;
init_err = fds_register( fds_evt_handler );
APP_ERROR_CHECK( init_err );
//init_err = fds_init( ); //had done in peer_manager_init( )
//APP_ERROR_CHECK( init_err );
#endif //FLASH_STORE
}
/*********************************************************************
* @fn data_store_write
*
* @brief write data to flash
*
*
* @param none
*
* @return none
*/
void data_store_write( )
{
#ifdef FLASH_STORE
if( !data_write_flash_flag )
{
uint32_t write_err = 0;
fds_record_desc_t desc = {0};
fds_find_token_t tok = {0};
fds_record_t data_record;
uint8_t writeData[DATA_RECORD_LENGTH]; //__align(4)
uint8_t temp;
writeData[0] = RECORD_HEAD;
if( bondPeer.bondStatus )
{
writeData[1] = RECORD_BOND;
}
else
{
writeData[1] = 0;
}
temp = 0;
for( uint8_t loopCnt=0; loopCnt<6; loopCnt++ )
{
writeData[loopCnt+2] = Addr[loopCnt];
temp += Addr[loopCnt];
}
writeData[8] = temp;
writeData[9] = RECORD_END;
data_record.file_id = DATA_FILE_ID;
data_record.key = DATA_RECORD_KEY;
data_record.data.p_data = writeData;
data_record.data.length_words = ( sizeof(writeData)+3 )/4;
write_err = fds_record_find( DATA_FILE_ID, DATA_RECORD_KEY, &desc, &tok );
if( write_err == NRF_SUCCESS )
{
data_write_flash_flag = true;
write_err = fds_record_update( &desc, &data_record );
if( write_err != NRF_SUCCESS )
{
data_write_flash_flag = false;
APP_ERROR_CHECK(write_err);
}
else
{
while( data_write_flash_flag !=0 );
}
}
else
{
data_write_flash_flag = true;
write_err = fds_record_write( &desc, &data_record );
if( write_err != NRF_SUCCESS )
{
data_write_flash_flag = false;
APP_ERROR_CHECK(write_err);
}
else
{
while( data_write_flash_flag !=0 );
}
}
}
#endif //FLASH_STORE
}
/*********************************************************************
* @fn data_store_read
*
* @brief get data from store
*
*
* @param none
*
* @return none
*/
void data_store_read( )
{
Status = false;
#ifdef FLASH_STORE
uint32_t read_err;
fds_record_desc_t desc = {0};
fds_find_token_t tok = {0};
read_err = fds_record_find( DATA_FILE_ID, DATA_RECORD_KEY, &desc, &tok );
if( read_err == NRF_SUCCESS )
{
fds_flash_record_t config = {0};
uint8_t *readDataPointer;
uint8_t readData[DATA_RECORD_LENGTH];
uint8_t dataTemp;
/* Open the record and read its contents. */
read_err = fds_record_open(&desc, &config);
APP_ERROR_CHECK(read_err);
readDataPointer = (uint8_t *)config.p_data;
for( uint8_t rLoopCnt=0; rLoopCnt<DATA_RECORD_LENGTH; rLoopCnt++ )
{
readData[rLoopCnt] = readDataPointer[rLoopCnt];
}
read_err = fds_record_close(&desc);
APP_ERROR_CHECK(read_err);
if( ( readData[0] == RECORD_HEAD )
&&( readData[9] == RECORD_END ) )
{
if( readData[1] == RECORD_BOND )
{
Status = true;
}
dataTemp = 0;
for( uint8_t loopCnt=0; loopCnt<6; loopCnt++ )
{
Addr[loopCnt] = readData[loopCnt+2];
dataTemp += Addr[loopCnt];
}
if( dataTemp != readData[8] )
{
Status = false;
}
}
}
#endif //FLASH_STORE
}
Unfortunately, My code was stuck at while( data_write_flash_flag !=0 ). And then I check the assembler, I found the " while( data_write_flash_flag !=0 ) " was compiled to CMP r0, #0x00. It compared to zero ,so my code was stuck at here.I have no idea for that. please tell me what do I miss.