Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: HardFault и FatFS
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
foton6
Доброго времени суток!

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


Код далек от идела, оно и не надо, это просто для того чтобы потестить все функции данной бииблиотеки.
TolikG
Попробуйте выключить оптимизацию. У меня были проблемы с локальными переменными в коде ядра FatFS
megajohn
Цитата(foton6 @ Jul 27 2015, 07:29) *
на переменную типа FATFS которая какбэ лежит за пределами доступного диапазона адресов...


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

при работе с файлами первое поле структуры FIL это как раз указатель на FATFS. Скорее всего его-то и портите гдето, раз он улетает
foton6
Цитата(TolikG @ Jul 27 2015, 07:44) *
Попробуйте выключить оптимизацию. У меня были проблемы с локальными переменными в коде ядра FatFS


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

Цитата(megajohn @ Jul 27 2015, 07:54) *
изначально, переменную типа FATFS обявляете вы, и иннициализируете через f_mount( &Fatfs );

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


Да вроде я никаких манипуляций не совершаю с объявленной FATFS, только передаю указатель в f_mount.
Ruslan1
Цитата(foton6 @ Jul 27 2015, 07:29) *
Возникает он из-за обращения в кусок памяти отмеченный в ДШ как "reserved". Где то недрах ff.c появляется указатель
на переменную типа FATFS которая какбэ лежит за пределами доступного диапазона адресов...

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

Там все достаточно просто пошагово проверяется.
foton6
Всем спасибо за внимание и помощь! Я ОЛЕНЬ!
В модуле чтения флешки оставил кусочек кода для будующей реализации проверки CRC16, ну и вообщем считывалось вместо 512, 514 байт. Хотя странно почему вообще чтение ии запись в файл работали)))))
Неделю не мог разгрызть вопрос(
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.