Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
线程上下文调度切换_context
启动调度rt_hw_context_switch_to();后偶尔会发生异常
发布于 2016-03-24 09:50:18 浏览:9268
订阅该版
在用龙芯 ls1b 启动过程中,在调度`rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp); `后偶尔会发生`RESTORE_ALL_AND_RET`异常,用的`pmon`起的rt-thread. 代码如下: ``` rt_hw_context_switch_to: lw sp, 0(a0) /* get new task stack pointer */ RESTORE_ALL_AND_RET ```
查看更多
30
个回答
默认排序
按发布时间排序
bernard
2016-03-24
这家伙很懒,什么也没写!
这个好像是会有概率出这种问题,情况未知,看看是否和cache,中断相关。
Eason
2016-03-25
这家伙很懒,什么也没写!
>这个好像是会有概率出这种问题,情况未知,看看是否和cache,中断相关。 感觉是因为中断,我发现两点奇怪的现象. 1. 出现异常后我读取了mips的原因寄存器,发现其 TI(当有内部定时器中断引发的异常时,此位置1)位被置1了,正常情况此位为0. 2. 异常发生后,pc 跳转到了 pmon 中的异常处理函数(当时pmon可能还在内存中),epc 指向了rt_hw_context_to() 函数中。 第一部分,我看了关于内部定时器的代码,并没有发现问题 ```c void rt_hw_timer_init(void) { write_c0_compare(CPU_HZ/2/RT_TICK_PER_SECOND); write_c0_count(0); } void rt_hw_timer_handler(void) { unsigned int count; count = read_c0_compare(); write_c0_compare(count); write_c0_count(0); /* increase a OS tick */ rt_tick_increase(); } ``` 第二部分,我没明白为什么会跳转到pmon的异常处理中去,还在研究中。 目前已经锁定了发生异常的指令: ``` LONG_L $20, PT_R20(sp) ``` 定义在`libcpu/mips/common/stackframe.h`中 , ``` .macro RESTORE_ALL_AND_RET RESTORE_TEMP RESTORE_STATIC RESTORE_AT RESTORE_SOME RESTORE_SP_AND_RET .endm .macro RESTORE_STATIC LONG_L $16, PT_R16(sp) LONG_L $17, PT_R17(sp) LONG_L $18, PT_R18(sp) LONG_L $19, PT_R19(sp) ** LONG_L $20, PT_R20(sp)** LONG_L $21, PT_R21(sp) LONG_L $22, PT_R22(sp) LONG_L $23, PT_R23(sp) LONG_L $30, PT_R30(sp) .endm ``` 就是不知道为什么会在这条指令上发生异常.
grissiom
2016-03-25
这家伙很懒,什么也没写!
interrupt enable/disable 之后要加指令 barrier,具体的不记得了,要查手册。
bernard
2016-03-26
这家伙很懒,什么也没写!
打开调度器之前要关闭中断的,这部分是否处理了?
Eason
2016-03-26
这家伙很懒,什么也没写!
>`interrupt enable/disable`之后要加指令`barrier`,具体的不记得了,要查手册。 mips 貌似没有这个指令,arm 的?
Eason
2016-03-26
这家伙很懒,什么也没写!
>打开调度器之前要关闭中断的,这部分是否处理了? 实际上我试过把下面的 rt_hw_interrupt_enable(level); 注释掉,依然会有这个问题. ```c void rtthread_startup(void) { /* disable interrupt first */ level = rt_hw_interrupt_disable(); /* init cache */ rt_hw_cache_init(); /* init hardware interrupt */ rt_hw_interrupt_init(); /* copy vector */ rt_memcpy((void *)A_K0BASE, tlb_refill_exception, 0x20); rt_memcpy((void *)(A_K0BASE + 0x180), general_exception, 0x20); rt_memcpy((void *)(A_K0BASE + 0x200), irq_exception, 0x20); #ifdef RT_USING_HEAP rt_system_heap_init((void*)&__bss_end, (void*)RT_HW_HEAP_END); #endif /* initialize timer */ rt_system_timer_init(); /* initialize timer thread */ rt_system_timer_thread_init(); /* init board */ rt_hw_board_init(); /* show version */ rt_show_version(); /* init scheduler system */ rt_system_scheduler_init(); #ifdef RT_USING_DEVICE /* init all device */ rt_device_init_all(); #endif /* init application */ rt_application_init(); #ifdef RT_USING_FINSH /* initialize finsh */ finsh_system_init(); finsh_set_device(RT_CONSOLE_DEVICE_NAME); #endif /* init idle thread */ rt_thread_idle_init(); rt_hw_interrupt_enable(level); /* start scheduler */ rt_system_scheduler_start(); /* never reach here */ return; } ``` ```c rt_hw_interrupt_disable: mfc0 v0, CP0_STATUS and v1, v0, 0xfffffffe //把 IE(使能全局中断) 位清 0 mtc0 v1, CP0_STATUS jr ra nop ```
Eason
2016-03-26
这家伙很懒,什么也没写!
在 rtconfig.py 中指定了栈地址为 0x80003fe8 , 为什么是这个值呢? 相关代码: ``` AFLAGS = ' -c' + DEVICE + ' -EL -fno-pic -fno-builtin -mno-abicalls -x assembler-with-cpp -DSYSTEM_STACK=0x80003fe8' ```
bernard
2016-03-27
这家伙很懒,什么也没写!
调度器启动前打开中断是不对的,系统中断是在切换到第一个任务时,由载入这个任务的初始上下文环境时自动被打开。 至于0x80003fe8,则有些不太记得了。我看另外其他的MIPS处理器移植并没有这样的宏定义设置,你可以拿掉试试。
grissiom
2016-03-27
这家伙很懒,什么也没写!
>>interrupt enable/disable 之后要加指令 barrier,具体的不记得了,要查手册。 > >--- > > >mips 貌似没有这个指令,arm 的? --- 读手册,有。看 see MIPS run Linux
Eason
2016-03-28
这家伙很懒,什么也没写!
>>>interrupt enable/disable 之后要加指令 barrier,具体的不记得了,要查手册。 >> >>--- >> >> >>mips 貌似没有这个指令,arm 的? > >--- > > > >读手册,有。看 see MIPS run Linux --- 仔仔细细在 see MIPS run Linux 的 8.2.3 指令的详细清单中找了以b为开头的指令,确实没找到 , 将指令加到代码中, gcc也不识别 .
撰写答案
登录
注册新账号
关注者
0
被浏览
9.3k
关于作者
Eason
这家伙很懒,什么也没写!
提问
21
回答
36
被采纳
0
关注TA
发私信
相关问题
1
modbusRTU如何避免因为被高优先级任务切走而导致本次通讯失败
2
RT-Thread 4.0.2初次上下文切换失败
3
pendSV中bx lr指令,lr指向哪里?psp中剩余的寄存器啥时候弹出的?
4
Cortex-M0在bootloader环境下的上下文切换问题?
5
arc内核移植线程切换
6
rt_thread_yield 无法在同级别中释放cpu
7
线程执行完后退出 是如何通知cpu切换任务的
8
RTT-NANO 3.1.3 线程切换问题
9
线程切换,打印出来的时间不对
10
软件定时器的回调函数里可以挂起或解挂另一个线程吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【NXP-MCXA153】 定时器驱动移植
2
GD32F450 看门狗驱动适配
3
【NXP-MCXA153】看门狗驱动移植
4
RT-Thread Studio V2.2.9 Release Note
5
CherryUSB的bootuf2配置
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
16
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
9
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部