ARM处理器的链接列表问题

时间:2014-11-19 10:35:49

标签: c gcc arm

我正在尝试在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编译时会出现这样的错误。有什么想法吗?

1 个答案:

答案 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;首先执行。