This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

pstorage didn't load correct data

Hi everybody,

I test the pstorage library. But it didn't work. I print the result with uart, as the image shows. But as you see, It has some problem. And I have no idea why.

image description

I show the code In the following. I hope somebody can help me find which step went wrong.

By the way, I used the softdevice s110 v7.1.

Many thanks!

main function:

    uint8_t data[4]={1,2,3,4};
	uint8_t getdata[8];

	storage_init();
	clear_data();
	
	store_data(0,data,4,0);
	printf("store\r\n ");
	printf("%d ",data[0]);
	printf("%d ",data[1]);
	printf("%d ",data[2]);
	printf("%d \r\n",data[3]);
	
	load_data(0,getdata,4,0);
	printf("load \r\n ");
	printf("%d ",getdata[0]);
	printf("%d ",getdata[1]);
	printf("%d ",getdata[2]);
	printf("%d \r\n",getdata[3]);

function I used:

static void example_cb_handler(pstorage_handle_t  * handle,
                           uint8_t              op_code,
                           uint32_t             result,
                           uint8_t            * p_data,
                           uint32_t             data_len)
{
switch(op_code)
{
   case PSTORAGE_LOAD_OP_CODE:
       if (result == NRF_SUCCESS)
       {
           printf("OP successful\r\n");
       }
       else
       {
           printf("OP failed.\r\n");
       }
       // Source memory can now be reused or freed.
       break;

}
}

======

static pstorage_handle_t base_handle;
static void storage_init(void)
{
     uint32_t retval;
	retval = pstorage_init();
	if(retval == NRF_SUCCESS)
	{
			printf("Module initialization successful\r\n");
	}
	else
	{
		 printf("Initialization failed, take corrective action.\r\n");
	}
	pstorage_module_param_t param;
				
	param.block_size  = 16;
	param.block_count = 32;
	param.cb          = example_cb_handler;
			
	retval = pstorage_register(&param, &base_handle);
	if (retval == NRF_SUCCESS)
	{
			printf("Registration successful%d    %d.\r\n",base_handle.module_id,base_handle.block_id);
	}
	else
	{
			printf("Registration failed.\r\n");
	}

  }

=======

    static void load_data(pstorage_size_t block_num,
										uint8_t * dest_data,
										pstorage_size_t size,
										pstorage_size_t offset)
  {

pstorage_handle_t block_handle;
uint32_t          retval;

retval = pstorage_block_identifier_get(&base_handle, block_num, &block_handle);
if (retval == NRF_SUCCESS)
{
		printf("get block ID success.ID: %d\r\n",block_handle.block_id);
}
else
{
		printf("get block failed.\r\n");
}  
// Request to read 4 bytes from block at an offset of 12 bytes.
retval = pstorage_load(dest_data, &block_handle, size, offset);
if (retval == NRF_SUCCESS)
{
		printf("load success.\r\n");
}
else
{
		printf("load failed.\r\n");
}

    }

========

    static void store_data(pstorage_size_t block_num,
										 uint8_t * source_data,
										 pstorage_size_t size,
										 pstorage_size_t offset)
   {
pstorage_handle_t block_handle;
uint32_t          retval;

retval = pstorage_block_identifier_get(&base_handle, block_num, &block_handle);
if (retval == NRF_SUCCESS)
{
	printf("get block ID success.ID: %d\r\n",block_handle.block_id);
}
else
{
		printf("get block failed.\r\n");
}

// Request to write 8 bytes to block at an offset of 20 bytes.
retval = pstorage_store(&block_handle, source_data, size, offset);
if (retval == NRF_SUCCESS)
{
		printf("store success.\r\n");
}
else
{
		printf("store failed.\r\n");
}

    }

=======

    static void clear_data(void){
uint32_t          retval;    
// Request clearing of all blocks in the module. 32 blocks each with 16 bytes in size.
retval = pstorage_clear(&base_handle, 16 * 32);

if (retval == NRF_SUCCESS)
{
		printf("clear success.\r\n");
}
else
{
		printf("clear failed.\r\n");
}

    }
Parents
  • The 255 (0xFF) value is the erased value of the non volatile memory. Once you do the storage operation you must wait for the operation to complete before doing the load. Storage, erase etc. operations via pstorage merely queue a request that will be handled asynchronously. You will get a pass/fail event back indicating that the operation is complete. Then you can do the load and verify that you get what you wrote.

    There are a number of thread in this forum regarding how this works if you do a search on pstorage that can help you out.

Reply
  • The 255 (0xFF) value is the erased value of the non volatile memory. Once you do the storage operation you must wait for the operation to complete before doing the load. Storage, erase etc. operations via pstorage merely queue a request that will be handled asynchronously. You will get a pass/fail event back indicating that the operation is complete. Then you can do the load and verify that you get what you wrote.

    There are a number of thread in this forum regarding how this works if you do a search on pstorage that can help you out.

Children