gpt4 book ai didi

c - ARM 处理器的链表问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:27 25 4
gpt4 key购买 nike

我正在尝试使用 GCC 在 C 中创建一个链接列表以在 ARM 处理器上运行(不确定确切的处理器规范,但 -mcpu=arm7tdmi 已传递给编译器)。这是代码:

#include <posapi.h>
#include <posapi_all.h>

const APPINFO AppInfo={
"POS-Simple example",
"APP-TEST",
"1.0",
"pcteam",
"demo program",
"",
0,
0,
0,
""
};

typedef struct st_dllNode {
struct st_dllNode * next;
struct st_dllNode * prev;
void * data;
} dllNode;

typedef struct {
dllNode* first;
dllNode* cur;
uchar size;
} ListContainer;

typedef ListContainer* List;

List createList(void)
{
List listContainer;
listContainer = (List) malloc(sizeof(ListContainer));
listContainer->first = NULL;
listContainer->cur = NULL;
listContainer->size = 0; // exception occurs here
return listContainer;
}

int event_main(ST_EVENT_MSG *msg)
{
SystemInit();
return 0;
}


int main(void)
{
List list;
SystemInit();
while (1)
{
list = createList();
free(list);
Beep();
}
}

由于未知原因,此代码的执行在标记的行停止,我使用的设备开始转储异常消息:

PrefetchAbortHandler:2007FFC4,AA...... (more addresses follows)
PrefetchAbort Addr: (another addr); Status:02020a01

我不知道为什么这段代码在 Windows 中运行得很好,但是当为 ARM 编译时,会出现这样的错误。有什么想法吗?

最佳答案

解决方案:尝试在您的代码中添加一个 barrier() 或类似的宏函数。

详细信息:

List createList(void)
{
List listContainer;
listContainer = (List) malloc(sizeof(ListContainer));
smb(); // this is Linux memory barrier API. Replace it with your OS similar API
listContainer->first = NULL;
listContainer->cur = NULL;
listContainer->size = 0; // exception occurs here
return listContainer;
}

原因:目标ARM处理器可能乱序执行代码。listContainer可能没有分配成功,但是“listContainer->size = 0”首先被执行。

关于c - ARM 处理器的链表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27014644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com