启动线程scheduler.c转到rt_hw_context_switch_to函数,触发system_call()
故障。
求帮助!rt_hw_context_switch_to
函数如下,使用PowerPC芯片PPC460,谢谢!
/* void rt_hw_context_switch_to(to); */
.globl rt_hw_context_switch_to
rt_hw_context_switch_to:
/* set rt_thread_switch_interrput_flag = 1 */
lis r5,rt_thread_switch_interrput_flag@h
ori r5,r5,rt_thread_switch_interrput_flag@l
li r6, 0x01
stw r6,0(r5)
/* set rt_interrupt_from_thread = 0 */
lis r5,rt_interrupt_from_thread@h
ori r5,r5,rt_interrupt_from_thread@l
li r6, 0x00
stw r6,0(r5)
/* set rt_interrupt_from_thread = to */
lis r5,rt_interrupt_to_thread@h
ori r5,r5,rt_interrupt_to_thread@l
stw r3,0(r5)
/* trigger a system call */
sc
blr
去了
static void System_Call(void)
,此函数原本是{COND_TRAP(31,0,0);}
我改成:
{rt_hw_systemcall_entry();}
,然后进了Unalign_Access()
,死了。@derekjoon Unalign_Access 是因为你的目标线程栈地址没对齐还是 pc 指针没对齐。这俩寄存器的值是你的目地线程的初始入口和线程栈地址吗?
@出出啊 这个怎么检查呢?是跟STACK_FRAME_SIZE有关吗?线程建立的参数吗?
@derekjoon 调用 rt_hw_context_switch_to 前,断点查看俩线程控制块。rt_thread_t 里面不是有入口地址和栈地址吗,还有保存的栈顶指针。
@出出啊 这有什么问题吗?
逐条确认是restore里面第7条语句引起的异常:
@derekjoon 看前边的 to_thread 几个指针挺好的。从流程上讲,这么走也是对的,from thread 是0 第一次进 restore 是对的。
lwz r0,SRR1(r1)
这里的 r1 指针能错了?@出出啊 这是PPC405原来调试过的呀,用在PPC460有问题嘛
@derekjoon 问题根源可能不在这儿,但是得找到异常的地方,然后反向找引起异常的原因。
要是说,所有的变量,寄存器值都是正常的,但是走到这里就是出错了,这是不可能的。总有一些值意外变了。