Browse Source

update:读写文件时的底层操作做数据同步

alienwalker 3 years ago
parent
commit
21ee71cd28
1 changed files with 18 additions and 2 deletions
  1. 18 2
      application/src/luat_spi_air105.c

+ 18 - 2
application/src/luat_spi_air105.c

@@ -364,7 +364,7 @@ int luat_lcd_draw(luat_lcd_conf_t* conf, uint16_t x1, uint16_t y1, uint16_t x2,
 
 
 static void *luat_fatfs_spi_ctrl;
-
+static HANDLE luat_fatfs_locker;
 static void sdhc_spi_check(luat_fatfs_spi_t* userdata)
 {
 	if (!luat_fatfs_spi_ctrl)
@@ -381,6 +381,11 @@ static void sdhc_spi_check(luat_fatfs_spi_t* userdata)
 static DSTATUS sdhc_spi_initialize(luat_fatfs_spi_t* userdata)
 {
 	int i;
+	if (!luat_fatfs_locker)
+	{
+		luat_fatfs_locker = OS_MutexCreateUnlock();
+	}
+	OS_MutexLock(luat_fatfs_locker);
 	if (luat_fatfs_spi_ctrl)
 	{
 		for(i = 0; i < USB_MAX; i++)
@@ -406,46 +411,57 @@ static DSTATUS sdhc_spi_initialize(luat_fatfs_spi_t* userdata)
 			Core_UDiskAttachSDHCRecovery(i, luat_fatfs_spi_ctrl);
 		}
 	}
-
+	OS_MutexRelease(luat_fatfs_locker);
 	return SDHC_IsReady(luat_fatfs_spi_ctrl)?0:STA_NOINIT;
 }
 
 static DSTATUS sdhc_spi_status(luat_fatfs_spi_t* userdata)
 {
+	OS_MutexLock(luat_fatfs_locker);
 	sdhc_spi_check(userdata);
+	OS_MutexRelease(luat_fatfs_locker);
 	return SDHC_IsReady(luat_fatfs_spi_ctrl)?0:STA_NOINIT;
 }
 
 static DRESULT sdhc_spi_read(luat_fatfs_spi_t* userdata, uint8_t* buff, uint32_t sector, uint32_t count)
 {
+	OS_MutexLock(luat_fatfs_locker);
 	sdhc_spi_check(userdata);
 	if (!SDHC_IsReady(luat_fatfs_spi_ctrl))
 	{
+		OS_MutexRelease(luat_fatfs_locker);
 		return RES_NOTRDY;
 	}
 	SDHC_SpiReadBlocks(luat_fatfs_spi_ctrl, buff, sector, count);
+	OS_MutexRelease(luat_fatfs_locker);
 	return SDHC_IsReady(luat_fatfs_spi_ctrl)?RES_OK:RES_ERROR;
 }
 
 static DRESULT sdhc_spi_write(luat_fatfs_spi_t* userdata, const uint8_t* buff, uint32_t sector, uint32_t count)
 {
+	OS_MutexLock(luat_fatfs_locker);
 	sdhc_spi_check(userdata);
 	if (!SDHC_IsReady(luat_fatfs_spi_ctrl))
 	{
+		OS_MutexRelease(luat_fatfs_locker);
 		return RES_NOTRDY;
 	}
 	SDHC_SpiWriteBlocks(luat_fatfs_spi_ctrl, buff, sector, count);
+	OS_MutexRelease(luat_fatfs_locker);
 	return SDHC_IsReady(luat_fatfs_spi_ctrl)?RES_OK:RES_ERROR;
 }
 
 static DRESULT sdhc_spi_ioctl(luat_fatfs_spi_t* userdata, uint8_t ctrl, void* buff)
 {
+	OS_MutexLock(luat_fatfs_locker);
 	sdhc_spi_check(userdata);
 	if (!SDHC_IsReady(luat_fatfs_spi_ctrl))
 	{
+		OS_MutexRelease(luat_fatfs_locker);
 		return RES_NOTRDY;
 	}
 	SDHC_SpiReadCardConfig(luat_fatfs_spi_ctrl);
+	OS_MutexRelease(luat_fatfs_locker);
 	switch (ctrl) {
 		case CTRL_SYNC :		/* Make sure that no pending write process */
 			return RES_OK;