我正在尝试在C中创建一个链接列表,以便在ARM处理器上运行(不确定精确的处理器规范,但-mcpu=arm7tdmi
是使用GCC传递给编译器)。这是代码:
#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编译时会出现这样的错误。有什么想法吗?
答案 0 :(得分:1)
解决方案:尝试在代码中添加一个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可能无法成功分配,但&#34; listContainer-&gt; size = 0&#34;首先执行。