文章總列表

Embedded System Studying note 1/24

Low priority task/ Background task


----


在寫 SD card driver 時
我希望把 driver 寫成 interrupt 的形式
但是 SD 卡的操作, 我很難包裝成 IRQ 的形式

下面的程式是 SD 卡諸多命令之一
麻煩的是上藍底的部分, 要等待 SD 卡給回應
這個 sd_wait_command() 也不是很聰明, 直接用 polling 的方式硬來

static int CMD25(unsigned int addr) // WRITE_MULTIPLE_BLOCK
{
unsigned int
i;

for
(i=0; i<SD_COMMAND_RETRY_COUNT; i++)
{

sd_send_command(25, addr, SD_RESPONSE_SHORT);
if
(sd_wait_command(SD_HAVE_RESPONSE))
continue
;
return
0;
}

return
-1;
}



如果硬要把 driver 寫成 IRQ 的形式, driver 會長得很像 state machine
由 IRQ 去 trigger state machine (USB driver 就是這種形式)
但是硬體沒有對應的 register, 提示是什麼原因造成中斷

我恐怕沒剩下太多選擇, 只能寫成 polling 的形式了


----


幸好我的系統有跑 Real-Time OS, 我多了一些選擇
利用 scheduling 的空檔 (本來就是剩餘的時間), 來跑 SD driver
下面的小程式每 100ms 會去檢查記憶卡插槽一次, 確認記憶卡有沒有被拔掉

    unsigned int sd_detected = 0;

while
(1)
{

if
(sd_detected == 0)
{

if
(SD_card_init() == 0)
sd_detected = 1;
}

else

{

if
(SD_card_is_exist() == -1)
sd_detected = 0;
}

OSTimeDly(100);
}

把這個小程式放在一個 low-priority task 裡去跑, 就能實作出 SD 熱插拔了
接下來要考慮的是: 怎麼利用這個 task 把讀寫的操作也嵌在程式裡


----


TODO:

* FAT32 support
* Read/ Write function support

留言

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

幼犬書桌椅選擇心得 升降桌 兒童桌椅

CANON G3000 廢墨瓶改裝