Arduino, ATA 硬盤, 寫一百萬 SECTOR 耗時 230 秒


short URL https://goo.gl/XFRU8Q

neo_IMG_5172

雖然用 ARDUINO 的硬件, 不過開發的工具還是用 C, 因為 ARDUINO 的軟體封裝太耗時間, 執行速度過慢. 例如, 以下兩段碼都是使同一個 LED 亮和滅, 但是碼率及執行速度差了5倍以上, 因此對時間和速度有要求的, 只能用 C, 千萬不要用 ARDUINO WRAPPER的累贅.


ARDUINO wrapper code

digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level);

digitalWrite(ledPin, LOW);    // turn the LED off by making the voltage LOW;

.
.
.

//AVR C code
PORTB ^= _BV(PB7);

.
.

比較一下 PERFORMANCE 和結果, 測試的源碼最後用 ARDUINO 0022 編譯過

Arduino_IO_speedup
Arduino_IO_speedup

/*
  Blink test with cycle time measurement. Arduino 0022
  of/off LED as fast as possible
  measurement of speedup ration and improvment
  xiaolaba, 2008-02-04
 */

void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);
  Serial.begin(57600);

  Serial.println("Start a test loop.");

}

void loop() {

  unsigned int t_a = millis();
  for (unsigned int i=0; i<50000; i++) {
    digitalWrite(13, HIGH);   // set the LED on
    //delay(300);              // wait 300ms
    digitalWrite(13, LOW);    // set the LED off
    //delay(300);              // wait 300ms
  }
  t_a = millis() -t_a; // current time - time start = elapsed time


  unsigned int t_b = millis();  //time start
  for (unsigned int i=0; i<50000; i++) {
    PORTB ^= _BV(PB7); // LED on. PB7, PORTB bit7 is mapping to arduino D13
    //delay(300);              // wait 300ms
    PORTB ^= _BV(PB7); // toggle pin 13, LED off
    //delay(300);              // wait 300ms
  }
  t_b = millis() -t_b ; // current time - time start = elapsed time
  
  
  Serial.println("By xiaolaba, xiaolaba, 2008-02-04\nLED on/off 50,000 cycles, time used,");
  Serial.print("digitalWrite, "); Serial.print(t_a, DEC); Serial.println(" ms");
  Serial.print("Toggle D13, "); Serial.print(t_b, DEC); Serial.println(" ms");
  int ratio = (t_a / t_b);
  Serial.print("speedup & improvement: x"); Serial.println(ratio, DEC);
}

.

.

實際測試, AVR 8 BIT MCU 寫 ATA 硬盤, 用最傳統的 PIO 模式, 最快也不過這樣, 算一下寫入速度, 2.1MB/sec ATA PIO speed

1,000,000 sectors / 230 second = 500,000 KB / 230 second = 2174 KB/sec = 2.1MB/sec = 127MB / min

(因為 512 byte / sector = 512/1024 KB/ sector = 0.5KB / sector)

如果要寫一次 100G 的硬碟空間, 共有 195,371,568 sectors, 大約算作 2億 sectors, 一百萬 SECTOR 耗時 230 秒, 那2億是 100萬的 200倍, 所以估算要耗時,

230 sec x 200 = 46,000 sec = 12.8 hours

這樣是不夠實用的, 時間太長了, 因為每個 BYTE 都要經過控制器寫入 HARD DISK, 除非寫入速度提高10倍到20倍.

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s