Играюсь с LPC1769 (ARM M3). точнее прикручиваю Fat_FS. В процессе возникла проблемма с вылетом в Hard_Fault.
Возникает он из-за обращения в кусок памяти отмеченный в ДШ как "reserved". Где то недрах ff.c появляется указатель
на переменную типа FATFS которая какбэ лежит за пределами доступного диапазона адресов...
Как можно порешать эту заковыку?
Как это происходит например:
Хочу прочить что лежит в корне флешки: f_mount, f_opendir, f_readdir( read - кручу в цикле до окончания списка имен).
Вылеты в Hard_Fault происходят или не происходят в зависимости от содержимого карточки.
Тыкался шагами по программе в Jtag, обнаружил что выход за границы памяти довольно часто происходят.
Это я что-то не так пишу/настраиваю или это у многих возникает?
Юзаю либу FatFS от March 9, 2015 в среде LPCXpresso.
Чтение и запись в файлы и создание файлов вроде ок-норм работают, что говорит о правильности работы функций работы с флешкой.
Вот пример кода работы с чтением имен папок:
Код
LCD_Clear();
res = f_getcwd(FF_BUFFER, 120); //__Определение активной дирректории
if(res != FR_OK)
{
MEMORY_MODE = 1;
return;
}
res = f_opendir(&FOLDER, DNAME); //__Открытие активной дирректории
if(res != FR_OK)
{
MEMORY_MODE = 1;
return;
}
do
{
res = f_readdir(&FOLDER, &FINFO); //__Чтение директории
if(res != FR_OK)
{
MEMORY_MODE = 1;
return;
}
LCD_Send_string(FINFO.fname); //__Вывожу прочтенное имя на дисплей
temp += Str_len(FINFO.fname); //__Увеличиваю переменную на длину имени файла (для контроля длинны записи на дисплей).
if((temp + 1)>20) //__Если уже "карй" дисплея то перехожу на другую строку и обнуляю temp.
{
temp = 0;
i++;
LCD_Goto_XY(0,i);
}
else
{ LCD_Send_sym(' '); //__Если "карй" дисплея еще не достигнут то вывожу пробел.
}
}
while(FINFO.fname[0] != '\0'); //__Чтение дирректории до тех пор пока не найду все обьекты в ней.
MEMORY_MODE = 3;
break;
res = f_getcwd(FF_BUFFER, 120); //__Определение активной дирректории
if(res != FR_OK)
{
MEMORY_MODE = 1;
return;
}
res = f_opendir(&FOLDER, DNAME); //__Открытие активной дирректории
if(res != FR_OK)
{
MEMORY_MODE = 1;
return;
}
do
{
res = f_readdir(&FOLDER, &FINFO); //__Чтение директории
if(res != FR_OK)
{
MEMORY_MODE = 1;
return;
}
LCD_Send_string(FINFO.fname); //__Вывожу прочтенное имя на дисплей
temp += Str_len(FINFO.fname); //__Увеличиваю переменную на длину имени файла (для контроля длинны записи на дисплей).
if((temp + 1)>20) //__Если уже "карй" дисплея то перехожу на другую строку и обнуляю temp.
{
temp = 0;
i++;
LCD_Goto_XY(0,i);
}
else
{ LCD_Send_sym(' '); //__Если "карй" дисплея еще не достигнут то вывожу пробел.
}
}
while(FINFO.fname[0] != '\0'); //__Чтение дирректории до тех пор пока не найду все обьекты в ней.
MEMORY_MODE = 3;
break;
Код далек от идела, оно и не надо, это просто для того чтобы потестить все функции данной бииблиотеки.