我正在为lm32微处理器做一个CHibiOS RTOS端口。4字节未对齐写入地址
我在第一行代码中设置了一个新线程时出现了未对齐的内存地址的问题。 其他三行在尝试写入内存时已经给我一个类似的问题,但我解决了它对齐intctx
和context
结构放__attribute__((packed));
。
的代码如下:
tp->p_ctx.sp = (struct intctx*)((uint32_t *)wsp + size - sizeof(struct intctx));
tp->p_ctx.sp->r1 = (uint32_t)arg;
tp->p_ctx.sp->r2 = (uint32_t)pf;
tp->p_ctx.sp->ra = (uint32_t)port_thread_start;
的结构是由我实现了一个头文件中定义:
struct intctx {
uint32_t r1;
uint32_t r2;
uint32_t r3;
uint32_t r4;
uint32_t r5;
uint32_t r6;
uint32_t r7;
uint32_t r8;
uint32_t r9;
uint32_t r10;
uint32_t r11;
uint32_t r12;
uint32_t r13;
uint32_t r14;
uint32_t r15;
uint32_t r16;
uint32_t r17;
uint32_t r18;
uint32_t r19;
uint32_t r20;
uint32_t r21;
uint32_t r22;
uint32_t r23;
uint32_t r24;
uint32_t r25;
uint32_t gp;
uint32_t fp;
uint32_t sp;
uint32_t ra;
uint32_t ea;
uint32_t ba;
} __attribute__((packed));
struct context {
struct intctx *sp;
} __attribute__((packed));
我用gdb调试,当它尝试执行行:
tp->p_ctx.sp = (struct intctx*)((uint32_t *)wsp + size - sizeof(struct intctx));
它提供了以下问题:
core: 4 byte misaligned write to address 0x107409 at 0x100b20
Program received signal SIGBUS, Bus error.
0x00000080 in ??()
任何人都可以帮我吗?谢谢。
wsp通过引用传递作为函数的参数,其中这些代码行是。 wsp的类型为void *: 但是这是一个Thread *类型,wsp指向空闲线程的struct。
的代码行,在其他架构相同的功能ChibiOS具有支持实施,我只是做了相同的:
tp->p_ctx.sp = (struct intctx*)((uint32_t *)wsp + size - sizeof(struct intctx));
这是完整的功能:
Thread *chThdCreateI(void *wsp, size_t size,
tprio_t prio, tfunc_t pf, void *arg) {
/* Thread structure is laid out in the lower part of the thread workspace.*/
Thread *tp = wsp;
chDbgCheckClassI();
chDbgCheck((wsp != NULL) && (size >= THD_WA_SIZE(0)) &&
(prio <= HIGHPRIO) && (pf != NULL),
"chThdCreateI");
tp->p_ctx.sp = (struct intctx*)((uint32_t *)wsp + size - sizeof(struct intctx));
tp->p_ctx.sp->r1 = (uint32_t)arg;
tp->p_ctx.sp->r2 = (uint32_t)pf;
tp->p_ctx.sp->ra = (uint32_t)port_thread_start;
//SETUP_CONTEXT(wsp, size, pf, arg);
return _thread_init(tp, prio);
}
包装如何解决错位问题。 – 2013-04-10 23:57:15
在调试器中,是否在执行所讨论的行之前尝试检查'wsp'和'size'的值? – Ganesh 2013-04-11 01:16:57