我使用arm-none-eabi-gcc
编译我的代码并使用QEMU
作为模拟器。一切正常,直到我尝试拨打safe_malloc
内的send_no_wait
。如果我在这里调用safe_malloc
,函数send_no_wait
将返回错误的地址,程序将在几个汇编指令中崩溃。 safe_malloc
函数在其他地方工作,我的想法可能是内存在某种程度上被破坏了,因为当我在send_no_wait
之前评论一些需要内存分配的函数时,send_no_wait
再次工作...... < / p>
这是safe_malloc
导致崩溃时分配的内存地址。
(gdb) p m
$5 = (msg *) 0x10501 <_vfiprintf_r+1796>
(gdb) p *m
$6 = {pData = 0x10519 <_vfiprintf_r+1820> "U", Status = 1, pBlock = 0x1b440,
pPrevious = 0xddef90, pNext = 0x2d0e92a} // pPrevious and pNext should point to 0x0
这是在safe_malloc
不会导致崩溃的情况下分配的内存地址(我评论了一些需要内存分配的函数)。
(gdb) p m
$1 = (msg *) 0x1b460
(gdb) p *m
$2 = {pData = 0x1b478 "U", Status = 1, pBlock = 0x1b428, pPrevious = 0x0, pNext = 0x0}
<_vfiprintf_r+1796>
是什么意思?这个分配的内存在这里有什么问题吗?
exception send_no_wait(mailbox *mBox, void *pData) {
volatile uint first_execution = TRUE;
SaveContext();
if (first_execution == TRUE) {
first_execution = FALSE;
if (mBox->nMessages > 0 &&
mBox->pHead->Status == RECEIVER) { // receiving task is waiting
...
} else {
msg *m = safe_malloc(sizeof(msg));
m->pData = safe_malloc(mBox->nDataSize);
memcpy(m->pData, pData, mBox->nDataSize); // copy data to the message
m->Status = SENDER;
listobj *node = list_get_head(ready_list);
m->pBlock = node;
node->pMessage = m;
mailbox_push_no_wait_msg(mBox, m);
// ASYNCHRONOUS, DON'T RESCHEDULE HERE
}
}
return OK;
}
void *safe_malloc(unsigned int size) {
void *mem = malloc(size);
mem_counter++;
return mem;
}
答案 0 :(得分:0)
我认为您的主要问题是memcpy(m->pData, pData, mBox->nDataSize);
,因为它遵循shallow copy
概念。尝试用deep copy
概念替换。