Browse Source

Merge branch 'test/spi_performance' into 'master'

test(spi_master): add performance display for spi master.

See merge request idf/esp-idf!1923
Ivan Grokhotkov 8 years ago
parent
commit
62f924544d

+ 73 - 0
components/driver/test/test_spi_master.c

@@ -728,3 +728,76 @@ TEST_CASE("SPI master variable cmd & addr test","[spi]")
 
     ESP_LOGI(MASTER_TAG, "test passed.");
 }
+
+#define RECORD_TIME_PREPARE() uint32_t __t1, __t2
+#define RECORD_TIME_START()   do {__t1 = xthal_get_ccount();}while(0)
+#define RECORD_TIME_END(p_time) do{__t2 = xthal_get_ccount(); *p_time = (__t2-__t1)/240;}while(0)
+
+TEST_CASE("spi_speed","[spi]")
+{
+    RECORD_TIME_PREPARE();    
+    uint32_t t_no_dma, t_dma;
+    esp_err_t ret;
+    spi_device_handle_t spi;
+    spi_bus_config_t buscfg={
+        .miso_io_num=PIN_NUM_MISO, 
+        .mosi_io_num=PIN_NUM_MOSI,
+        .sclk_io_num=PIN_NUM_CLK,
+        .quadwp_io_num=-1,
+        .quadhd_io_num=-1
+    };
+    spi_device_interface_config_t devcfg={
+        .clock_speed_hz=10*1000*1000,            //currently only up to 4MHz for internel connect
+        .mode=0,                                //SPI mode 0
+        .spics_io_num=PIN_NUM_CS,               //CS pin
+        .queue_size=16,                          //We want to be able to queue 7 transactions at a time
+        .pre_cb=NULL,  
+        .cs_ena_pretrans = 0,
+    };
+    //Initialize the SPI bus
+    ret=spi_bus_initialize(HSPI_HOST, &buscfg, 1);
+    TEST_ASSERT(ret==ESP_OK);
+    //Attach the LCD to the SPI bus
+    ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi);
+    TEST_ASSERT(ret==ESP_OK);
+
+    spi_transaction_t trans = {
+        .length = 1*8,
+        .flags = SPI_TRANS_USE_TXDATA,
+    };
+    spi_device_transmit(spi, &trans);
+
+    //only record the second time
+    RECORD_TIME_START();
+    spi_device_transmit(spi, &trans);
+    RECORD_TIME_END(&t_dma);
+
+    TEST_PERFORMANCE_LESS_THAN( SPI_PER_TRANS_NO_POLLING, "%d us", t_dma );
+
+    TEST_ESP_OK( spi_bus_remove_device(spi) );
+    TEST_ESP_OK( spi_bus_free(HSPI_HOST) );
+
+    ret=spi_bus_initialize(HSPI_HOST, &buscfg, 0);
+    TEST_ASSERT(ret==ESP_OK);
+    //Attach the LCD to the SPI bus
+    ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi);
+    TEST_ASSERT(ret==ESP_OK);
+
+    trans = (spi_transaction_t){
+        .length = 1*8,
+        .flags = SPI_TRANS_USE_TXDATA,
+    };
+    spi_device_transmit(spi, &trans);
+
+    //only record the second time
+    RECORD_TIME_START();
+    spi_device_transmit(spi, &trans);
+    RECORD_TIME_END(&t_no_dma);  
+
+    TEST_PERFORMANCE_LESS_THAN( SPI_PER_TRANS_NO_POLLING_NO_DMA, "%d us", t_no_dma );
+
+    TEST_ESP_OK( spi_bus_remove_device(spi) );
+    TEST_ESP_OK( spi_bus_free(HSPI_HOST) );
+
+    
+}

+ 4 - 0
components/idf_test/include/idf_performance.h

@@ -14,3 +14,7 @@
 #define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP_PSRAM               270
 #define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP_UNICORE             130
 #define IDF_PERFORMANCE_MAX_ESP_TIMER_GET_TIME_PER_CALL                         1000
+#define IDF_PERFORMANCE_MAX_SPI_PER_TRANS_NO_POLLING                            30
+#define IDF_PERFORMANCE_MAX_SPI_PER_TRANS_NO_POLLING_NO_DMA                     25
+
+