完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
启动线程scheduler.c转到rt_hw_context_switch_to函数,触发system_call()故障。求帮助!rt_hw_context_switch_to函数如下,使用PowerPC芯片PPC460,谢谢!
rt_hw_context_switch_to: |
|
相关推荐
10个回答
|
|
然后呢,进哪儿了? sc 这里是必经之路
|
|
|
|
去了static void System_Call(void),此函数原本是{COND_TRAP(31,0,0);}
我改成:{rt_hw_systemcall_entry();},然后进了Unalign_Access(),死了。 rt_hw_systemcall_entry: mtspr SPRG0,r3 / save r3 to SPRG0 / mtspr SPRG1,r4 / save r4 to SPRG1 / lis r3,rt_thread_switch_interrput_flag@h ori r3,r3,rt_thread_switch_interrput_flag@l lwz r4,0(r3) cmpi cr0,0,r4,0x0 /* whether is 0 */ beq _no_switch /* no switch, exit */ li r4,0x0 /* set rt_thread_switch_interrput_flag to 0 */ stw r4,0(r3) /* load from thread to r3 */ lis r3,rt_interrupt_from_thread@h /* set rt_interrupt_from_thread */ ori r3,r3,rt_interrupt_from_thread@l lwz r3,0(r3) cmpi cr0,0,r3,0x0 /* whether is 0 */ beq _restore /* it's first switch, goto _restore */ /* save r1:sp to thread[from] stack pointer */ subi r1, r1, STACK_FRAME_SIZE stw r1, 0(r3) /* restore r3, r4 from SPRG */ mfspr r3,SPRG0 mfspr r4,SPRG0 /* save registers */ stw r0,GPR0(r1) /* save general purpose registers 0 */ stmw r2,GPR2(r1) /* save general purpose registers 2-31 */ mfusprg0 r0 /* save usprg0 */ stw r0,USPRG0(r1) mfcr r0, /* save cr */ stw r0,CR(r1) mfxer r0 /* save xer */ stw r0,XER(r1) mfctr r0 /* save ctr */ stw r0,CTR(r1) mflr r0 /* save lr */ stw r0, LR(r1) mfsrr0 r0 /* save SRR0 and SRR1 */ stw r0,SRR0(r1) mfsrr1 r0 stw r0,SRR1(r1) _restore: / get thread[to] stack pointer / lis r4,rt_interrupt_to_thread@h ori r4,r4,rt_interrupt_to_thread@l lwz r1,0(r4) lwz r1,0(r1) lwz r0,SRR1(r1) /* restore SRR1 and SRR0 */ mtsrr1 r0 lwz r0,SRR0(r1) mtsrr0 r0 lwz r0,LR(r1) /* restore lr */ mtlr r0 lwz r0,CTR(r1) /* restore ctr */ mtctr r0 lwz r0,XER(r1) /* restore xer */ mtxer r0 lwz r0,CR(r1) /* restore cr */ mtcr r0 lwz r0,USPRG0(r1) /* restore usprg0 */ // mtusprg0 r0 lmw r2, GPR2(r1) /* restore general register */ lwz r0,GPR0(r1) addi r1, r1, STACK_FRAME_SIZE /* RFI will restore status register and thus the correct priority*/ rfi _no_switch: / restore r3, r4 from SPRG / mfspr r3,SPRG0 mfspr r4,SPRG0 rfi |
|
|
|
Unalign_Access 是因为你的目标线程栈地址没对齐还是 pc 指针没对齐。这俩寄存器的值是你的目地线程的初始入口和线程栈地址吗?
|
|
|
|
这个怎么检查呢?是跟STACK_FRAME_SIZE有关吗?线程建立的参数吗?
|
|
|
|
调用 rt_hw_context_switch_to 前,断点查看俩线程控制块。rt_thread_t 里面不是有入口地址和栈地址吗,还有保存的栈顶指针。
|
|
|
|
这有什么问题吗?
to_thread 0x0001000c name 0x0001000c type 0x1 flags 0x0 list {…} tlist {…} sp 0x000107f8 entry 0xfffe2134 parameter 0x00000000 stack_addr 0x00010098 stack_size 0x800 error 0x0 stat 0x3 current_priority 0x2 init_priority 0x2 number_mask 0x4 event_set 0x0 event_info 0x0 init_tick 0x14 remaining_tick 0x14 thread_timer {…} cleanup 0x00000000 user_data 0x0 highest_ready_priority 0x2 |
|
|
|
|
|
|
|
看前边的 to_thread 几个指针挺好的。从流程上讲,这么走也是对的,from thread 是0 第一次进 restore 是对的。
sc指令调用操作系统去运行服务程序。当控制返回到一个运行系统调用的程序时,寄存器的内容依赖于程序提供的系统所使用的寄存器的约定。 跟在sc指令后面的有效指令地址被放在SRR0中。MSR中的位0、5~9和16~31被放在SRR1中相应的位置,SRR1中位1~4和10~15被设置为没有定义值。当sc异常产生,异常处理程序更改MSR寄存器。 lwz r0,SRR1(r1) 这里的 r1 指针能错了? |
|
|
|
这是PPC405原来调试过的呀,用在PPC460有问题嘛
|
|
|
|
问题根源可能不在这儿,但是得找到异常的地方,然后反向找引起异常的原因。
要是说,所有的变量,寄存器值都是正常的,但是走到这里就是出错了,这是不可能的。总有一些值意外变了。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
1664 浏览 0 评论
2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
8011 浏览 10 评论
1849 浏览 0 评论
IaaS+on+DPU(IoD)+下一代高性能算力底座技术白皮书
3255 浏览 0 评论
飞凌嵌入式-ELFBOARD 常用的USB接口及其不同版本介绍第1期
1196 浏览 0 评论
67996 浏览 21 评论
嵌入式热门DIY项目:智能机器人开源资料合集(原理图、代码、论文)
68595 浏览 22 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-12 14:23 , Processed in 0.942457 second(s), Total 86, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191