Перейти к содержанию
    

HardFault и FatFS

Доброго времени суток!

 

Играюсь с 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;

 

Код далек от идела, оно и не надо, это просто для того чтобы потестить все функции данной бииблиотеки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте выключить оптимизацию. У меня были проблемы с локальными переменными в коде ядра FatFS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на переменную типа FATFS которая какбэ лежит за пределами доступного диапазона адресов...

 

изначально, переменную типа FATFS обявляете вы, и иннициализируете через f_mount( &Fatfs );

 

при работе с файлами первое поле структуры FIL это как раз указатель на FATFS. Скорее всего его-то и портите гдето, раз он улетает

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте выключить оптимизацию. У меня были проблемы с локальными переменными в коде ядра FatFS

 

Отключил еще когда понял что не понимаю что происходит)

 

изначально, переменную типа FATFS обявляете вы, и иннициализируете через f_mount( &Fatfs );

 

при работе с файлами первое поле структуры FIL это как раз указатель на FATFS. Скорее всего его-то и портите гдето, раз он улетает

 

Да вроде я никаких манипуляций не совершаю с объявленной FATFS, только передаю указатель в f_mount.

Изменено пользователем foton6

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возникает он из-за обращения в кусок памяти отмеченный в ДШ как "reserved". Где то недрах ff.c появляется указатель

на переменную типа FATFS которая какбэ лежит за пределами доступного диапазона адресов...

99% - Вы не объявили (или объявили неправильно) саму переменную или пользуетесь неинициализированным указателем на переменную или на буфер.

 

Там все достаточно просто пошагово проверяется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо за внимание и помощь! Я ОЛЕНЬ!

В модуле чтения флешки оставил кусочек кода для будующей реализации проверки CRC16, ну и вообщем считывалось вместо 512, 514 байт. Хотя странно почему вообще чтение ии запись в файл работали)))))

Неделю не мог разгрызть вопрос(

Изменено пользователем foton6

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...