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

 
 
> 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



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

 


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


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