реклама на сайте
подробности

 
 
> SD card: 512 blocks limit.
pitt
сообщение May 7 2015, 20:44
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



Sorry for using English - I don't have russian keyboard.
Here is my problem: I'm writing blocks 512 bytes each on consecutive sectors of SDHC card. Hardware is STM3240G-EVAL. No file system, no OS no interrupts except SDIO and DMA serving SDIO. The goal is to test the software and measure my access speed: average and lowest. When I'm writing 256 blocks(CMD25) at a time loop of 1000 times I don't have issues except sometimes(5%) access time is more than 10 times greater than average. Don't know why but it is. When I'm writing 512 blocks Average speed is the same but lowest is almost 20 times above average. And the last thing: as soon as I'm trying to write >512 blocks I'm getting instantly FEIF...
Please share your thoughts and knowledge.

Thank you in advance.

Google translator:
Вот моя проблема: я пишу блоки 512 байт каждый на подряд секторов SDHC карты. Аппаратное STM3240G-EVAL. Нет файловая система, нет ОС нет прерывания кроме SDIO и DMA служащая для SDIO.Целью является для тестирования программного обеспечения и измерения мою скорость доступа: средний и низкий. Когда я пишу 256 блоков (CMD25) в петле времени в 1000 раз меня нет проблем, кроме иногда(5%) время доступа более чем в 10 раз больше, чем в среднем. Не знаю почему, но это так. Когда я пишу 512 блоков Средняя скорость же, но низкая почти в 20 раз выше среднего. И последнее: как только я пытаюсь написать> 512 блоков я получаю мгновенно FEIF ...
Пожалуйста, поделитесь своими мыслями и знаниями.


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dr.Alex
сообщение May 7 2015, 21:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Цитата(pitt @ May 7 2015, 23:44) *
sometimes(5%) access time is more than 10 times greater than average.

I guess it is normal.
I did not ever bother to test access time for each of that small blocks because I needed *highest* possible write speed which is achievable with BIG chunks only (got over 100 Mbps with regular class-10 or UHS-I cards).


Цитата(pitt @ May 7 2015, 23:44) *
And the last thing: as soon as I'm trying to write >512 blocks I'm getting instantly FEIF...

You'd better try STMcube HAL. It works (with some issues time to time discussed here).
Also you can try Chibios alone with its HAL.
Go to the top of the page
 
+Quote Post
pitt
сообщение May 8 2015, 00:00
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



Цитата(Dr.Alex @ May 7 2015, 17:26) *
You'd better try STMcube HAL. It works (with some issues time to time discussed here).
Also you can try Chibios alone with its HAL.

Подобное творение - STMcube HAL, можно рассматривать исключительно как референс, что я и делал, но ответов на многочисленные вопросы, никак не раскрытые в Reference Manual оно не дает.
Chibios тоже использую, но предпочитаю освоить "материальную часть", а не полагаться на других.
Пример:
Код
#if (defined(STM32F4XX) || defined(STM32F2XX))
  /* Wait until DMA channel enabled to be sure that all data transferred.*/

/***********************************************/  
while (sdcp->dma->stream->CR & STM32_DMA_CR_EN);
/***********************************************/

  /* DMA event flags must be manually cleared.*/
  dmaStreamClearInterrupt(sdcp->dma);

  SDIO->ICR = STM32_SDIO_ICR_ALL_FLAGS;
  SDIO->DCTRL = 0;
  osalSysUnlock();

  /* Wait until interrupt flags to be cleared.*/
  /*while (((DMA2->LISR) >> (sdcp->dma->ishift)) & STM32_DMA_ISR_TCIF)
    dmaStreamClearInterrupt(sdcp->dma);*/
#else

Ну да, прекрасный образчик лупа: пусть остальные занимаются прерываниями пока мы ждем-с...
И, кстати, а зачем флаги ошибок проверять, когда можно все почистить?
Может у меня не свежая версия или ну фантазии, например, не хватает...

Могу и другие примеры привести...


Если у Вас есть код/образчик многоблоковой записи через DMA, буду очень признателен за возможность ознакомиться: есть вопросы с очередностью операций и, особенно, с флагом FEIE.

Спасибо за ответ.

Сообщение отредактировал pitt - May 8 2015, 00:21


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 8 2015, 04:18
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(pitt @ May 8 2015, 05:00) *
Если у Вас есть код/образчик многоблоковой записи через DMA, буду очень признателен за возможность ознакомиться: есть вопросы с очередностью операций и, особенно, с флагом FEIE.

Ссылка на отличные примеры по работе с SDIO: вот. Мне они очень помогли.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
pitt
сообщение May 8 2015, 12:30
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



Цитата(AHTOXA @ May 8 2015, 00:18) *
Ссылка на отличные примеры по работе с SDIO: вот. Мне они очень помогли.

Thank you. I've seen that but didn't find some answers:
Цитата
//Check if the DMA is disabled (SDIO disables the DMA after it is done with it)

Could you please point me where this is in RM?
Код
  //Check if the DMA is disabled (SDIO disables the DMA after it is done with it)
  while (DMA2_Stream3->CR & DMA_SxCR_EN) {};

Very nice loop wub.gif
Код
if (DMA2->LISR & (DMA_LISR_TCIF3 | DMA_LISR_TEIF3 | DMA_LISR_DMEIF3 | DMA_LISR_FEIF3)) {
      if (!(DMA2->LISR & DMA_LISR_TCIF3)) {//A DMA error has occured. Panic!

Always have FEIF set!!! Why? How to get rid of it? Keil example doesn't look at this flag at all.

Thank you for replay though.



Цитата(jcxz @ May 8 2015, 03:44) *

Thank you.



This is the snippet from my code:
Код
void DMA2_Stream3_IRQHandler (void) {
    event_dma = true;
    *(uint8_t *)&dma_isr = DMA2->LISR>>DMA_ISR_STREAM_3;
    if (_sdio->dma_isr != NULL) (*_sdio->dma_isr)(_sdio);
    DMA2->LIFCR &= (DMA_LIFCR_CTCIF3|DMA_LIFCR_CHTIF3|DMA_LIFCR_CTEIF3|DMA_LIFCR_CDMEIF3|DMA_LIF
CR_CFEIF3);
    DMA2_Stream3->CR  &= ~(DMA_SxCR_TCIE |DMA_SxCR_TEIE);
    DMA2_Stream3->FCR &= ~DMA_SxFCR_FEIE;
}

_sdio->dma_isr is NULL
When event_dma is noticed dma_isr has only FEIF set but DMA->LISR has FEIF and TCIF even they both were cleaned in the handler...

Сообщение отредактировал pitt - May 8 2015, 13:23


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 8 2015, 18:31
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(pitt @ May 8 2015, 17:30) *
Could you please point me where this is in RM?

31.3.2 SDIO APB2 interface.
Там пример транзакции DMA. Да это и логично, ведь в случае с SDIO у нас периферийный модуль является flow controller-ом.
Цитата(pitt @ May 8 2015, 17:30) *
Very nice loop wub.gif

Ой, да ладно. Понятно же, что это в целях упрощения примера. Никто не мешает включить прерывание и взводить там какой-то флаг.
Цитата(pitt @ May 8 2015, 17:30) *
Always have FEIF set!!! Why? How to get rid of it? Keil example doesn't look at this flag at all.

Посмотрел у себя - я тоже не смотрю на этот флаг.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- pitt   SD card: 512 blocks limit.   May 7 2015, 20:44
|- - pitt   Цитата(AHTOXA @ May 8 2015, 14:31) 31.3.2...   May 8 2015, 19:42
|- - AHTOXA   Цитата(pitt @ May 9 2015, 00:42) This fla...   May 8 2015, 19:53
|- - pitt   Цитата(AHTOXA @ May 8 2015, 15:53) Я не с...   May 8 2015, 20:22
||- - AHTOXA   Цитата(pitt @ May 9 2015, 01:22) Wait a m...   May 9 2015, 06:04
||- - pitt   Поздравляю всех с днем нашей общей Победы. Вечная ...   May 9 2015, 12:10
|- - pitt   Цитата(AHTOXA @ May 8 2015, 15:53) Я не с...   May 10 2015, 14:49
|- - AHTOXA   Да, конечно же я имел в виду, что больше 512 блоко...   May 10 2015, 14:58
|- - pitt   Цитата(AHTOXA @ May 10 2015, 10:58) Да, к...   May 11 2015, 02:21
|- - AHTOXA   Цитата(pitt @ May 11 2015, 07:21) Можно, ...   May 12 2015, 04:06
- - jcxz   Цитата(pitt @ May 8 2015, 02:44) I don...   May 8 2015, 07:44
- - Golikov A.   Тоже хочу делать роботов на гусенках.... даже могу...   May 8 2015, 20:44
|- - jcxz   Цитата(Golikov A. @ May 9 2015, 02:44) То...   May 9 2015, 11:20
- - Golikov A.   они торопятся с чипами, так что их не хватает, оши...   May 11 2015, 09:40
|- - pitt   Цитата(Golikov A. @ May 11 2015, 05:40) ....   May 11 2015, 17:02
- - Golikov A.   ссылки... ну типа http://forum.easyelectronics.ru...   May 12 2015, 05:01
- - pitt   Проблема в том, что я не могу просимулировать ошиб...   May 12 2015, 10:38


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 19:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016