Skip to main content
DOsbo
Associate III
August 1, 2019
Question

BUG: SD_write() and SD_read() will fail every 49.71026962962962962962 days.

  • August 1, 2019
  • 1 reply
  • 587 views

Hi All,

I think SD_write() and SD_read() in sd_diskio.c (see below) have the timer tick overflow bug. For 30 seconds prior to osKernelSysTick() overflowing (every ~49 days), the functions will incorrectly return RES_ERROR without entering the while loop.

DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
 DRESULT res = RES_ERROR;
 osEvent event;
 uint32_t timer;
 
 if(BSP_SD_WriteBlocks_DMA((uint32_t*)buff,
 (uint32_t) (sector),
 count) == MSD_OK)
 {
 /* Get the message from the queue */
 event = osMessageGet(SDQueueID, SD_TIMEOUT);
 
 if (event.status == osEventMessage)
 {
 if (event.value.v == WRITE_CPLT_MSG)
 {
 
 //////////////////////////////////////////
 // BAD JUJU 
 //////////////////////////////////////////
 timer = osKernelSysTick() + SD_TIMEOUT;
 /* block until SDIO IP is ready or a timeout occur */
 while(timer > osKernelSysTick())
 {
 if (BSP_SD_GetCardState() == SD_TRANSFER_OK)
 {
 res = RES_OK;
 break;
 }
 }
 }
 }
 }
 
 return res;
}
#endif /* _USE_WRITE == 1 */

It can be fixed by doing this:

 //////////////////////////////////////////
 // GOOD JUJU 
 //////////////////////////////////////////
 timer = osKernelSysTick();
 /* block until SDIO IP is ready or a timeout occur */
 while((osKernelSysTick() - timer) < SD_TIMEOUT)
 {
 
 }

I've only seen the bug in these 2 functions, so hopefully it's not a common occurrence. However, I think it would be wise to check all the other timeout functions.

Cheers,

David

This topic has been closed for replies.

1 reply

Tesla DeLorean
Guru
August 1, 2019

>>so hopefully it's not a common occurrence.

You might hope, but I've been digging these types of logic errors out of the code for the best part of a decade.

The first HAL_Delay() implementation had this exact problem.

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..