Embedded System Studying note 1/24
Low priority task/ Background task
----
在寫 SD card driver 時
我希望把 driver 寫成 interrupt 的形式
但是 SD 卡的操作, 我很難包裝成 IRQ 的形式
下面的程式是 SD 卡諸多命令之一
麻煩的是上藍底的部分, 要等待 SD 卡給回應
這個 sd_wait_command() 也不是很聰明, 直接用 polling 的方式硬來
如果硬要把 driver 寫成 IRQ 的形式, driver 會長得很像 state machine
由 IRQ 去 trigger state machine (USB driver 就是這種形式)
但是硬體沒有對應的 register, 提示是什麼原因造成中斷
我恐怕沒剩下太多選擇, 只能寫成 polling 的形式了
----
幸好我的系統有跑 Real-Time OS, 我多了一些選擇
利用 scheduling 的空檔 (本來就是剩餘的時間), 來跑 SD driver
下面的小程式每 100ms 會去檢查記憶卡插槽一次, 確認記憶卡有沒有被拔掉
把這個小程式放在一個 low-priority task 裡去跑, 就能實作出 SD 熱插拔了
接下來要考慮的是: 怎麼利用這個 task 把讀寫的操作也嵌在程式裡
----
TODO:
* FAT32 support
* Read/ Write function support
----
在寫 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
留言