обнаружилась странная особенность, что если я оставляю SD-CARD в покое более чем на 0.5 сек(+/-, точно этот предел не устанавливал), следующий вызов обломается. Как будто карта засыпает? Или это MCI засыпает? Чип LPC1788.
т.е. выполняем следующий код:
Код
for (int i = 0; i < 20; i++) {
printf("---------------Attempt: %d\n\r", i);
dump_file("test1.txt"); // открываем файл и печатаем все содержимое, файл закрываем.
if ( i < 10 )
DELAY_Ms(1000);
else
DELAY_Ms(500);
};
и получаем следующее на выходе:
Код
---------------Attempt: 0
READ SD5 0
Test File Line 1
Test File Line 2
Test File Line 3
---------------Attempt: 1
READ SD5 1
---------------Attempt: 2
READ SD5 1
---------------Attempt: 3
READ SD5 1
---------------Attempt: 4
READ SD5 1
---------------Attempt: 5
READ SD5 1
---------------Attempt: 6
READ SD5 1
---------------Attempt: 7
READ SD5 1
---------------Attempt: 8
READ SD5 1
---------------Attempt: 9
READ SD5 1
---------------Attempt: 10
READ SD5 1
---------------Attempt: 11
READ SD5 0
Test File Line 1
Test File Line 2
Test File Line 3
---------------Attempt: 12
READ SD5 0
Test File Line 1
Test File Line 2
Test File Line 3
---------------Attempt: 13
READ SD5 0
Test File Line 1
Test File Line 2
Test File Line 3
---------------Attempt: 14
READ SD5 0
Test File Line 1
Test File Line 2
Test File Line 3
итд, все последующие вызовы ок. READ SD5 1 -- цифра 1 после SD5, это что возвращает f_open.
Т.е. как только я снижаю паузу между вызовами с 1сек до 500mS все начинает работать.
Полное впечатление, что кто-то засыпает. Worкaround понятен, но хотелось бы понять, что же тут происходит.
Да, сначала я этот сценарий под freeRTOS заметил, грешил на нее, и воспроизвел в точности то же самое поведение без нее. В процессе поиска натолкнулся в инете на страницу, в которой был следующий код:
Код
rc = f_open(&fil, FilePath, FA_WRITE | FA_OPEN_ALWAYS); /* Create a file on the drive 0 */
if(rc) rc = f_open(&fil, FilePath, FA_WRITE | FA_OPEN_ALWAYS);// try again once
http://letrungthang.blogspot.ca/2011/09/fr...f-fat-file.htmlя сначала не придал этому значения, но когда разобрался в природе своего глюка, это место вспомнил. Очень похожу на решение такого же глюка, как у меня. Кто-то может что-то объяснить?
Заранее благодарен!