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

 
 
> STM32F103RET6 уходит в HardFault_Handler
011119xx
сообщение Feb 21 2011, 05:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Работаю в Keil 4. Пытаюсь инициализировать FAT следующей функцией:

Код
void MountDrive(void)
{
    uint32_t    TotSectors;
    uint32_t    DataSectors;
    uint32_t    FirstSector;
    struct    partrecord *pr;
    struct    bpb710 *bpb;
    int i;

    SectorBuffer = (uint32_t*) malloc(512);

    if (SectorBuffer == NULL)
    {
        return;
    }

    readsector(0, (uint8_t *)SectorBuffer);

            то что ниже не привожу, так как проблема возникает выше
}


SectorBuffer объявлено выше как:
Код
uint32_t    *SectorBuffer;


При этом при попытке прочитать сектор программа уходит в HardFault_Handler в файле stm32f10x_it.c и там зависает.

Если поменять код на такой:

Код
void MountDrive(void)
{
    uint32_t TotSectors;
    uint32_t DataSectors;
    uint32_t FirstSector;
    struct partrecord *pr;
    struct bpb710 *bpb;
    int i;
    uint8_t buffer[512];

    SectorBuffer = (uint32_t *)buffer;                            

    if (SectorBuffer == NULL)
    {
        return;
    }
      
    readsector(0, (uint8_t *)SectorBuffer);                        
}


то сектор читается и перехода в HardFault_Handler не происходит. Вопрос: почему не работает первый вариант кода? Что там не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
011119xx
сообщение Feb 22 2011, 08:24
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



А может память выделяется не из кучи, а из стека?
Go to the top of the page
 
+Quote Post
zhevak
сообщение Feb 22 2011, 08:44
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(011119xx @ Feb 22 2011, 13:24) *
А может память выделяется не из кучи, а из стека?

А разве такое возможно для malloc()? Это же нонсэнс!


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 22 2011, 09:02
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zhevak @ Feb 22 2011, 10:44) *
А разве такое возможно для malloc()? Это же нонсэнс!

Скорее всего, для инициализации того, что выделено из кучи, используется стек.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Feb 22 2011, 09:26
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(ViKo @ Feb 22 2011, 14:02) *
Скорее всего, для инициализации того, что выделено из кучи, используется стек.

Вообще не представляю как это возможно!

У Вас есть указатель стека, который перемещается каждый раз при вызове продпрограмм. По этому указателю записываются адреса возвратов, локальные переменные и т.д.

И вот в какой-то момент одна из функций запрашивает кусочек памяти. Указатель сдвигается, т.к. следующий оператор, допустим вызов еще какой-нибудь функции... Пока все нормально. Потом, допустим, вы возвращаемся из нескольких вложенных функций, но при этом кусок памяти не отдаем системе. Он все еще нам нужен! Потом опяит следуют вызовы, которые приближают указатель стека к началу нашего выделенного участка памяти... Вы понимаете проблему? Кто-то же должен сказать стеку "Э-э, парень! Стоп! Дальше идет выделенный кусок памяти, ну-ка прыгай вверх на 512 байт"


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 22 2011, 09:51
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zhevak @ Feb 22 2011, 11:26) *
Вообще не представляю как это возможно!

Допустим, создается локальный массив из 512 байтов. При его создании нужно его инициализировать, забить нулями.
У меня в функции, инициализирующей ЖКИ, использовался массив констант. Пока я не задал ему квалификатор static, этот массив сначала создавался в стеке.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Feb 22 2011, 12:57
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(ViKo @ Feb 22 2011, 14:51) *
У меня в функции, инициализирующей ЖКИ, использовался массив констант. Пока я не задал ему квалификатор static, этот массив сначала создавался в стеке.

Ну да, все правильно. static переводит переменную из разрядя автоматических (созданных) на стеке, в разряд статических, созданных в оперативе до запуска main(). Тут все понятно.

Но куча (heap)? Тут же совсем другие механизмы выделения памяти работают.
Или мы о чем с Вами говорим? У меня такое чувство, что о разном.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 011119xx   STM32F103RET6 уходит в HardFault_Handler   Feb 21 2011, 05:18
- - zhevak   Могу ошибиться. Рассматривайте это как вариант пои...   Feb 21 2011, 06:08
- - 011119xx   SectorBuffer указывает на область ОЗУ по адресу 0x...   Feb 21 2011, 06:25
|- - Dron_Gus   Цитата(011119xx @ Feb 21 2011, 09:25) ......   Feb 21 2011, 08:30
- - 011119xx   Да.   Feb 21 2011, 09:15
- - sonycman   А куча и стек имеют достаточный размер? Вообще пр...   Feb 21 2011, 09:54
|- - 011119xx   Цитата(sonycman @ Feb 21 2011, 14:54) А к...   Feb 21 2011, 10:08
|- - sonycman   Цитата(011119xx @ Feb 21 2011, 13:08) Вот...   Feb 21 2011, 16:22
- - ViKo   А stdlib.h включен в исходный файл?   Feb 21 2011, 18:08
- - 011119xx   Да. Дело было в стеке. У меня стоял размер 512 бай...   Feb 22 2011, 03:42
|- - sonycman   Цитата(011119xx @ Feb 22 2011, 06:42) Да....   Feb 22 2011, 06:59
- - zhevak   Цитата(011119xx @ Feb 22 2011, 08:42) Да....   Feb 22 2011, 07:27
|- - aaarrr   Цитата(zhevak @ Feb 22 2011, 10:27) А сей...   Feb 22 2011, 13:31
|- - ViKo   Цитата(zhevak @ Feb 22 2011, 14:57) Ну да...   Feb 22 2011, 13:12
|- - sonycman   Цитата(ViKo @ Feb 22 2011, 16:12) Вопрос,...   Feb 22 2011, 16:41
- - zhevak   Цитата(ViKo @ Feb 22 2011, 18:12) Я тольк...   Feb 22 2011, 18:17
- - ViKo   Цитата(zhevak @ Feb 22 2011, 20:17) Невер...   Feb 22 2011, 18:46


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

 


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


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