stm32: через 20 раз добавить новый узел в связанный список, после чего происходит сбой системы - PullRequest
0 голосов
/ 22 января 2019

Редактировать: 2019/1/22 (Я решил эту проблему, увеличив размер кучи с 512 байт до 2048 байт)

[Извините за мой плохой английский в первую очередь!]

У меня есть связанный список, и иногда я добавляю к нему новый узел, он отлично работает на Visual Studio (компилятор Visual C ++), но есть проблема при использовании ARM Compiler V5.

Мой код работает на stm32f103vet6, после 20 раз добавьте новый узел в список ссылок, после чего система выйдет из строя, компьютер перейдет к HardFault_Handler. Не знаю почему? Мой код отлично работает на окне (visual studio).

Я гуглю уже несколько дней, но у меня нет идеала

// Это мой код

typedef struct OutputLineStructure   
{

    int16_t OP_Name;
    uint16_t Time1;
    uint16_t Value;
    uint16_t Time2;
    struct  OutputLineStructure *pNext;
    struct  OutputLineStructure *pPrev;

} OutputLine;
//

typedef struct StoryboardStruct   
{
    OutputLine *Line;
    uint16_t Lenght;
    uint16_t ID;
} StoryboardStructure;
//

StoryboardStructure _Storyboard[12]; 

// Set break point inside to view exeption
char SE_File[100] = {[0 ... 99]  = 0};
char SE_Function[100] = {[0 ... 99] = 0};
char SE_Comment[150] = {[0 ... 99] = 0};
void SystemFault_Exception(char* File, char* Function, char* Comment, uint32_t ErrorCode)
{
    sprintf(SE_File, "%s", File);

    sprintf(SE_Function, "%s", Function);

    sprintf(SE_Comment, "%s", Comment); 

    uint32_t Code = ErrorCode;

    delayMs(10); // Set break point here 
}
//

void StoryboardInit(StoryboardStructure *MyStoryboard, uint16_t ID)
{
    MyStoryboard->Lenght = 0;
    MyStoryboard->Line = NULL;
    MyStoryboard->ID = ID;
}
//

void StoryboardAllInit(void)
{
    for (int i = 0 ; i< 12; i++)
    {
        StoryboardInit(_Storyboard+i, i+1);
    }
}
//

void StoryboardAddLine(StoryboardStructure *MyStoryboard, int16_t _Name, uint16_t _Time1, uint16_t _Value, uint16_t _Time2)
{
    if (MyStoryboard->Lenght == 0)
    {
        if (MyStoryboard->Line != NULL) 
        {
            SystemFault_Exception("storyboard","StoryboardAddLine","HeadLine is not NULL",0);
            while(1); // the pc never jump to this point
        }
        OutputLine *NewLine = (OutputLine*)malloc(sizeof(OutputLine));

        NewLine->OP_Name = _Name;
        NewLine->pNext = NULL;
        NewLine->pPrev = NULL; 

        NewLine->Time1 = _Time1; //Set break point and error occur here
        NewLine->Time2 = _Time2; //Set break point and error occur here
        NewLine->Value = _Value; //Set break point and error occur here

        MyStoryboard->Line = NewLine;
        MyStoryboard->Lenght ++;
    }
    else
    {
        OutputLine *NewNode = (OutputLine*)malloc(sizeof(OutputLine)); 
        NewNode->OP_Name = _Name;
        NewNode->Time1 = _Time1;
        NewNode->Time2 = _Time2;
        NewNode->Value = _Value;


        OutputLine *Scan = MyStoryboard->Line;
        while (Scan->pNext != NULL)
        {
            Scan = Scan->pNext;
        }

        Scan->pNext = NewNode;
        NewNode->pPrev = Scan;
        NewNode->pNext = NULL;
        MyStoryboard->Lenght++;
    }
}
//

int main(void )
{
    StoryboardAllInit();

    for (int id = 1; id< 10; id++)
    {
        for (int line = 0; line < 10; line ++)
        StoryboardAddLine(_Storyboard + id-1,id + line,0,0,0);
          // When ID = 3 and line  = 0. system has crashed
    }

    while(1)
    {

    }
}
//

см. Функцию main для цикла, когда (id == 3 и line == 0) происходит сбой системы. См. Функцию StoryboardAddLine, блок (MyStoryboard-> Длина == 0), ошибка возникает, когда я устанавливаю свойства для MyStoryboard, например: NewLine-> Time1 = _Time1;

Спасибо за помощь!

...