2013-04-10 59 views
1

我正在为lm32微处理器做一个CHibiOS RTOS端口。4字节未对齐写入地址

我在第一行代码中设置了一个新线程时出现了未对齐的内存地址的问题。 其他三行在尝试写入内存时已经给我一个类似的问题,但我解决了它对齐intctxcontext结构放__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); 
} 
+3

包装如何解决错位问题。 – 2013-04-10 23:57:15

+2

在调试器中,是否在执行所讨论的行之前尝试检查'wsp'和'size'的值? – Ganesh 2013-04-11 01:16:57

回答

1

是什么wsp的类型?我建议将一组字符或其他任何你定义的字符都不需要适当地对齐以存储int32_t类型。考虑总线如何按照传统方式对齐以检索以32位组为单位对齐的int32_t值。现在考虑什么“总线错误”实际上可能会在架构层面的意思:

  1. 一个以上的获取需要检索值(在性能方面不理想),或
  2. 你的程序故障(甚至更糟)

在英特尔的常见实现中,除非您或您的调试器为您的程序注入了一些程序集疯狂(例如,请参阅this wikipedia article),否则它将使用第一个选项。在C中,这只是未定义的行为。确保wsp适当对齐指向int32_t类型。

  1. int32_t变量,或
  2. 任何int32_t对象的数组中,或:您可以通过确保它指向的其中一个做到这一点
  3. 的malloc,释放calloc或realloc的返回值,或者:
  4. 任何int32_t“malloc/calloc/realloc返回值被视为指向int32_t的指针”的对象。

我觉得你对指针算术感到困惑。你在读哪本书?

+0

通过引用将wsp作为函数的参数传递给代码行。 – user2268131 2013-04-11 13:37:27