野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9042|回复: 2

[rt-thread] 从0写rtthread中线程切换的疑问

[复制链接]
发表于 2018-8-21 11:10:13 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]        ; 确保异常返回使用的栈指针是PSP,即 lr 寄存器的bit2要为1
        ORR                lr, lr, #0x04
        ; 异常返回,这个时候栈中的剩余内容会自动加载到 CPU 寄存器
        ; xPSR, PC(线程入口地址), r14, r12, r3, r2, r1, r0(线程的形参)
        ; 同时 psp 的值也将更新,即指向线程栈的栈顶
        BX                lr[/mw_shl_code]
这个lr寄存器什么时候改变的,没找到呢。如果不改变lr的值,那bx lr这条命令岂不是又返回到触发pendsv的地方了,这里就是当前线程,并不是要切换到的目的线程。这里没搞明白@fire
回复

使用道具 举报

 楼主| 发表于 2018-8-21 11:51:49 | 显示全部楼层
搞明白了。
原文地址:http://m.elecfans.com/article/572693.html

任务调度函数会将PSP堆栈指针指向我们定义自定义的堆栈,然后最后一句汇编是BX LR,那么按照普通子函数执行BX LR的意义,这个时候MCU是会运行OS_TaskReturn这个函数吗?这样不就进入错误函数了吗?

其实不然,因为用M系列实现ucos的任务调度是在PendSV异常(中断)里面实现的,而在异常(中断)里的LR寄存器不再是普通函数里面“返回地址”的意义,而是一个定义为一个称作exc-return的值,当执行BX  LR时候,这个值决定了MCU退出异常(中断)之后的运行等级是在特权级还是用户级以及用的堆栈是MSP还是PSP,而MCU即将要执行的是从PSP堆栈中POP出来的p_task函数,而不是OS_TaskReturn函数。
回复 支持 反对

使用道具 举报

发表于 2018-10-11 23:30:06 | 显示全部楼层
RTT源码中LR寄存器传进去的是一个删除线程的函数,,,也就是说你的线程没有while死循环,线程退出时候就会触发LR寄存器,然后线程就被删除了,也就是线程只能执行一次,,,,,,火哥书好像没有写到这个线程删除函数

rt_threat exit印象中好像叫这个函数,,线程初始化的时候传进去的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 20:57 , Processed in 0.043896 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表