Редактировать: 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;
Спасибо за помощь!