找回密码
 立即注册
楼主: tzz***

RTOS 基本原理, 框架模型 讲解@STC全球技术互助论坛

[复制链接]
  • TA的每日心情
    开心
    昨天 23:10
  • 签到天数: 46 天

    [LV.5]常住居民I

    15

    主题

    221

    回帖

    1157

    积分

    金牌会员

    积分
    1157
    发表于 2024-2-6 15:41:23 | 显示全部楼层
    感谢分享,我也学习一下
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 121 天

    [LV.7]常住居民III

    12

    主题

    315

    回帖

    870

    积分

    高级会员

    积分
    870
    发表于 2024-2-6 16:00:53 | 显示全部楼层
    感谢分享
    回复 送花

    使用道具 举报

    该用户从未签到

    4

    主题

    62

    回帖

    300

    积分

    中级会员

    积分
    300
    发表于 2024-2-6 17:42:04 | 显示全部楼层
    请教
            //SP保存到任务控制块
            MOV   DR0,DR60
            MOV   DR4,OSTCBCur
            MOV   @WR6+0x2,WR2
    @WR6+0x2 这部分指向哪里?
    此外, 看到任务切换 所有ALU寄存器都要切换上下文, 有没有"节约"一点的可能?

    点评

    MOV DR0,DR60 //DR60即SP MOV DR4,OSTCBCur //OSTCBCur是任务控制块指针,任务控制块第一个数据就是任务栈栈顶指针 MOV @WR6+0x2,WR2 //WR6是DR4的低两有效字节 等  详情 回复 发表于 2024-2-6 21:17
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    519

    回帖

    1640

    积分

    荣誉版主

    积分
    1640
     楼主| 发表于 2024-2-6 21:17:06 来自手机 | 显示全部楼层
    本帖最后由 tzz1983 于 2024-2-6 21:29 编辑
    13918210822 发表于 2024-2-6 17:42
    请教
            //SP保存到任务控制块
            MOV   DR0,DR60


            MOV   DR0,DR60             //DR60即SP
            MOV   DR4,OSTCBCur    //OSTCBCur是任务控制块指针,任务控制块第一个数据就是任务栈栈顶指针
            MOV   @WR6+0x2,WR2   //WR6是DR4的低两有效字节,+0x02是因为通用指针是四字节,现在只使用两字节,所以地址加2
    等一句读出SP,第二句读出OSTCBCur,第三句保存SP到任务控制块。

    回老家过年了,没有电脑,有问题留言,明年解答

    点评

    谢谢解答  发表于 2024-2-7 10:38
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

    积分
    13946
    发表于 2024-2-9 10:13:14 | 显示全部楼层
    截图202402091013115285.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    无聊
    9 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    17

    主题

    528

    回帖

    1209

    积分

    金牌会员

    积分
    1209
    发表于 2024-2-9 14:11:10 | 显示全部楼层
    学习了
    不停地学习
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-7 07:55
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    0

    主题

    11

    回帖

    90

    积分

    注册会员

    积分
    90
    发表于 2024-2-18 22:00:55 | 显示全部楼层
    感谢分享
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 108 天

    [LV.6]常住居民II

    0

    主题

    17

    回帖

    478

    积分

    中级会员

    积分
    478
    发表于 2024-3-2 17:16:21 | 显示全部楼层
    写的通俗易懂,楼主用心了!
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    519

    回帖

    1640

    积分

    荣誉版主

    积分
    1640
     楼主| 发表于 2024-3-2 18:24:29 | 显示全部楼层
    本帖最后由 tzz1983 于 2024-3-19 08:52 编辑

    闲暇时间就来论坛发个贴玩玩,就当是业余休息了。

    本贴接着讲 RTOS 基本原理 之 栈和任务栈,希望有人喜欢。本贴文继续叠加到1楼.

    栈和RTOS中的任务栈
    在RTOS领域,堆栈是一个不容忽视的概念,RTOS里的任务栈,是栈的一个分支,正确的理解栈,对学习RTOS有非常大的帮助。
    堆栈分为堆和栈,这里只讲栈,为了不混淆概念,以下不管是堆栈还是栈,指的都是栈。
    以下是栈概念的描述
    1. 简单的来理解,栈就是一片内存,它的访问地址由栈顶指针SP给出。
    2. SP是指向内存的一个指针,他永远指向最后写入数据的那个内存的地址.也就是当我们向栈内写入一字节数据后,相应的要操作SP+1,如果是拿出一字节数据,则SP-1.
    3. 栈和普通的内存其实没什么区别,但是栈必须是SP指针能够访问的区域,例如,51内核的栈必须是在IDATA区, 251内核的栈必须是在EDATA区
    4. 栈的另一个特征是和CPU内核指令,中断等硬件操作息息相关,比如子程序调用指令LCALL暗含栈操作,栈操作指令PUSH,POP在写入数据后同时也会操作SP增减。

    栈还有一个重要特征是后入先出,这好比我们往一个小纸箱内不断的堆叠钞票,下次取钞票时,最先取出的是最后叠入的钞票。

    用代码举例来说明后入先出特征:

    void fc(void)
    {
        return;
    }

    void fb(void)
    {
        fc();
        return;
    }

    void fa(void)
    {
        fb();
        return;
    }

    上面的代码体现出函数调用链,即函数fa()调用了fb(),函数fb调用了fc(), 我们来分解一下这个调用过程即可体现出先入后出的特征,

    执行语句fb()时, 编译器产生的汇编代码是 LCALL fb; 指令的具体操作是把当前(PC+3)的值写入栈,并且SP值自动加2 然后跳转到函数fb()并开始执行。
    注意,在这里LCALL指令有隐含PC值入栈的操作。
    接下来执行语句 fc(); 同样是把当前(PC+3)的值写入栈,并且SP值自动加2 然后跳转到函数fc()并开始执行。
    此处也隐含PC值入栈的操作。

    接下来执行fc()函数内return(RET)指令,RET指令从栈中读出两字数据写回PC,并使SP值-2,执行过后程序返回到fb()函数内return处
    接下来执行fb()函数内return(RET)指令,RET指令从栈中读出两字数据写回PC,并使SP值-2,执行过后程序返回到fa()函数内return处
    此时运行轨迹又回到了fa();

    仔细分析上面的例子就可以发现,我们最后存入栈的数据(PC值)是被最先取出来的,这就是后入先出!

    栈的几个作用:
    1. 发生中断时硬件自动往栈内存储当前PC值(断点位置)和部分寄存器值并调整栈顶指针SP值,也就是自动保存中断发生时的程序运行断点位置,中断返回时,从堆栈中弹出PC值恢复PC , 并调整栈顶指针SP值。
    2. 子程序(函数)调用时指令自动往栈内存储当前PC值(断点位置)并调整栈顶指针SP值,子程序返回时,从堆栈中弹出PC值恢复PC , 并调整栈顶指针SP值
    3. 编译器可以用堆栈传递函数形参,定义局部变量。
    4. 如果用汇编语言编程,PUSH,POP栈操作指令可以对用户开放,用来存储临时数据。

    栈容量大小需求的估算:了解了栈的几个作用以后,就可以大至估算出栈容量大小需求. 主要由中断嵌套层数,子程序调用深度,形参数量以及局部变量的多寡(如果编译器利用栈传递形参,把局部变量放在本内)几个因数决定。然而实际使用时却很难准确的计算出具体栈需求,原因是我们不断的在编辑代码,总不可能每改一次就去计算一次吧,并且这种计算本身也不容易,其次是中断是随机发生的,实际运行时最坏的情况短时间内可能体现不出来。所幸的是几乎所有成熟的RTOS都有堆栈检验功能,在RTOS自动检测的基础上我们只要稍为留些余量就可以轻易解决了。

    如果没有使用RTOS,栈顶指针SP的初始化是由编绎器完成的,通常情况下,如果栈是向上增长的,除了我们代码已使用掉的内存外,剩下的内存都会自动成为栈。这也是为什么有些范例程序特别说明要留下多少RAM给堆栈使用的原因,如果你把内存用完了,那就等于没有堆栈了。

    RTOS是一个多任务的系统,每个任务是相对独立的,每个任务都需要一个独立的堆栈。也就是说我们在运行这个任务的时候,使用这一片内存作为堆栈,切换到另一个任务后,需要使用另一片内存作为堆栈,只能这么做, 不让它们相互干扰.  切换堆栈很简单,只需改变栈顶指针SP的值就可以了。

    RTOS在创建任务的时候,会为每一个任务指定堆栈区域和大小。


    任务栈 就是 RTOS任务使用的堆栈

    除此之外,RTOS中任务栈还有一个作用是用于保存上下文. 因为每一个任务运行都需要使用到寄存器组这种公共片上资源,当需要切换至另一个任务时,RTOS需要保存当前任务的寄存器组的数据,以备任务切换回来时,可以恢复这些数据,程序才能无差错的继续往后执行。



    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 117 天

    [LV.6]常住居民II

    3

    主题

    57

    回帖

    59

    积分

    禁止发言

    积分
    59
    发表于 2024-3-3 15:59:38 | 显示全部楼层
    感谢捧场, 放假了, 在家里没事干, 接下来再续一集, 任务切换原理, 直接叠加在一楼

    点评

    欢迎网友前来互动  发表于 2024-3-3 17:33
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-29 17:36 , Processed in 0.071707 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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