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

 
 
 
Reply to this topicStart new topic
> HardFault и FatFS, Не могу побороть вылет в HardFault.
foton6
сообщение Jul 27 2015, 04:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-10-14
Пользователь №: 83 339



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

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


Код далек от идела, оно и не надо, это просто для того чтобы потестить все функции данной бииблиотеки.
Go to the top of the page
 
+Quote Post
TolikG
сообщение Jul 27 2015, 04:44
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



Попробуйте выключить оптимизацию. У меня были проблемы с локальными переменными в коде ядра FatFS
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 27 2015, 04:54
Сообщение #3


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(foton6 @ Jul 27 2015, 07:29) *
на переменную типа FATFS которая какбэ лежит за пределами доступного диапазона адресов...


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

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


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
foton6
сообщение Jul 27 2015, 05:14
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-10-14
Пользователь №: 83 339



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


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

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

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


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

Сообщение отредактировал foton6 - Jul 27 2015, 05:14
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jul 27 2015, 05:19
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



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

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

Там все достаточно просто пошагово проверяется.
Go to the top of the page
 
+Quote Post
foton6
сообщение Jul 27 2015, 07:29
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-10-14
Пользователь №: 83 339



Всем спасибо за внимание и помощь! Я ОЛЕНЬ!
В модуле чтения флешки оставил кусочек кода для будующей реализации проверки CRC16, ну и вообщем считывалось вместо 512, 514 байт. Хотя странно почему вообще чтение ии запись в файл работали)))))
Неделю не мог разгрызть вопрос(

Сообщение отредактировал foton6 - Jul 27 2015, 08:17
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:42
Рейтинг@Mail.ru


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