dadian 发表于 2020-8-10 09:21:56

ucos保存现场和裸机中断是否一样?

最近学习ucos的内容,其中的核心就是任务切换过程中的上下文现场的保存,当发生任务切换时保存和当前任务有关的寄存器,
有点不理解的是如果不跑操作系统,正常裸机程序,设计了串口或定时器等中断,在发生中断时保存的现场寄存器种类和数量是否和ucos中发生任务切换时的一样?

JIANGJIAYU 发表于 2020-8-10 10:47:18

本帖最后由 JIANGJIAYU 于 2020-8-10 11:11 编辑

关注此问题,我也想知道
我还想知道,保护/恢复现场是怎么做到的,就那十几个寄存器吗?如果 局部和全局有好几十个变量怎么办?它是怎么记录与恢复的{:mad:}

liyang121316 发表于 2020-8-10 10:59:53

有很多相似之处,不过裸机中断是单片机自带机制进行压栈上下文切换(这个可以理解为与生俱来),而ucos是在C代码中模拟中断上下文切换的行为(这个可以理解为人为的),工作类似但是执行效率不一样(类比生物这块就是反射弧的长度和路径及所用时间不一样)

dadian 发表于 2020-8-10 11:00:35

JIANGJIAYU 发表于 2020-8-10 10:47
关注此问题,我也想知道
我还想知道,保护/恢复现场是怎么做大的,就那十几个寄存器吗?我局部和全局有好几 ...

我理解局部变量或者函数参数等都是存到Rx寄存器里的,所以保存的时候都包含了,不知道对不对。

wye11083 发表于 2020-8-10 11:46:47

liyang121316 发表于 2020-8-10 10:59
有很多相似之处,不过裸机中断是单片机自带机制进行压栈上下文切换(这个可以理解为与生俱来),而ucos是在 ...

区分cpu。另外,根据架构不同,果机进中断是不需要压完的,比如riscv,arm之类只要把约定的caller saved保存一下就ok了,任务切换还需要把其余的也保存一遍。即,任务切换根据架构一般需要多保存十几个寄存器。

wye11083 发表于 2020-8-10 11:47:59

JIANGJIAYU 发表于 2020-8-10 10:47
关注此问题,我也想知道
我还想知道,保护/恢复现场是怎么做到的,就那十几个寄存器吗?如果 局部和全局 ...

局部和全局变量是程序自己管理的。cpu和任务调度只负责任务相关的寄存器,不负责程序自己的全局变量。

qwe2231695 发表于 2020-8-10 12:25:21

1. 全局变量是专用的RAM区域存储, 任务切换不影响.
2 . 任务函数内的局部变量存放在任务堆栈, 切换任务要进行切换保存,设定任务堆栈大小时,需要考虑:所有可能被堆栈调用的函数及其函数的嵌套层数,相关局部变量的大小,堆栈还需存入CPU寄存器,如果处理器有浮点数单元FPU寄存器的话还需存入FPU寄存器。

10xjzheng 发表于 2020-8-10 16:56:09

JIANGJIAYU 发表于 2020-8-10 10:47
关注此问题,我也想知道
我还想知道,保护/恢复现场是怎么做到的,就那十几个寄存器吗?如果 局部和全局 ...

对的,就那十几个寄存器。
如果寄存器太多的话,其实是存放在堆栈里面。

10xjzheng 发表于 2020-8-10 17:00:50

对于STM32来说是一样的,上下文切换是通过触发异常来实现的,跟触发中断是一样的。这个过程CPU会在硬件层面主动入栈几个寄存器,对于中断,编译器会检测中断中是否需要更多的寄存器,如果需要会在中断服务函数之前再将其他寄存器入栈,上下文切换,OS软件将剩下的寄存器全部入栈。

JIANGJIAYU 发表于 2020-8-11 10:55:50

10xjzheng 发表于 2020-8-10 16:56
对的,就那十几个寄存器。
如果寄存器太多的话,其实是存放在堆栈里面。 ...

每个任务都要设置一个私有的堆栈,把寄存器的数据都放在里面,,,,那么任务里面的临时变量也都会放到里面吗?这就挺神奇了的

xjtyOnly51 发表于 2020-8-12 10:39:23

任务{:biggrin:}专用的数据结构
页: [1]
查看完整版本: ucos保存现场和裸机中断是否一样?