UCOS局部变量任务切换时的保存问题
假设有A1,到A30个变量,这30个变量都是有用的,但是这30个变量都是局部变量,比如有式子MAX=A1+A2+...+A30;我看了下堆栈跟寄存器,他不是基本上只保存R...
假设有A1,到A30个变量,这30个变量都是有用的,但是这30个变量都是局部变量, 比如有式子MAX=A1+A2+...+A30; 我看了下堆栈跟寄存器,他不是基本上只保存R0到R15跟CPRS等,他翻译成汇编后肯定是先把两个相加得到结果再去跟第三个相加, 然后比如我现在切换任务了,那切换后回来,后面这些A的数值字还在吗? 如果还在,那他是通过哪一步保存的,帮忙说些嘛,谢谢啦
问题提问结束,是我对软硬件不够了解造成的 ,我以为这是硬件干的,呵呵,结果是软件干的,软件在进入一个程序时,会先申请对应变量空间,同时SP指针移动,然后任务切换时,这个空间并不释放 展开
问题提问结束,是我对软硬件不够了解造成的 ,我以为这是硬件干的,呵呵,结果是软件干的,软件在进入一个程序时,会先申请对应变量空间,同时SP指针移动,然后任务切换时,这个空间并不释放 展开
5个回答
展开全部
加法运算应当也是在任务中或者在中断中,任务切换当然是执行完成后再切换,加法在切换前就执行了。如果是中断,会有进入中断的标志给OS,加法也就是在中断中执行完了。所以没必要保存A的数值,因为不可能在加法进行过程中进行任务切换。
更多追问追答
追问
程序转换为汇编的话(示意性)应该是
MAX=A1+A2;
MAX+=A3,
MAX+=A4;
....
等等这样的啊,假设,在第二步,中断来了,那不是后面的都没处理吗?
追答
第一,如果在任务中响应另一个任务,任务执行后才执行下一个优先级的任务,或用堆栈响应优先级的任务,数值不会有变化。
第二,如果在任务或中断中响应一个中断,进入中断时会保存当前的寄存器,退出后再继续执行加法,对数值不会有影响
展开全部
我看了汇编部分的,我的理解如下:
1)对于导入寄存器部分的,特别是通用寄存器部分的。这一部分直接入栈就可以了,是数据断点。
2) 对于局部变量非常大,比如128个,这样通用寄存器不够,肯定要涉及到RAM区的数据,我没有找到解决的源码。如果能解决,估计是编译过程的临界问题。不释放内存空间。
你找到源码了,我们可以一起讨论。
1)对于导入寄存器部分的,特别是通用寄存器部分的。这一部分直接入栈就可以了,是数据断点。
2) 对于局部变量非常大,比如128个,这样通用寄存器不够,肯定要涉及到RAM区的数据,我没有找到解决的源码。如果能解决,估计是编译过程的临界问题。不释放内存空间。
你找到源码了,我们可以一起讨论。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
临时变量是保存在任务堆栈中的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
以下均为个人想法,如有异议还请不吝赐教:
系统中存在任务A和任务B,假设系统在运行任务A。
任务A的C函数中的局部变量要么被优化成寄存器,要么直接在任务堆栈中被分配;
第一种情况:局部变量被优化成寄存器。那么在任务切换时(A-->B),寄存器会被入栈,也就是说A的局部变量被保存至任务堆栈中去了。
第二种情况:直接在任务堆栈中分配,那么任务切换时(A-->B),局部变量仍然存在于当前任务的堆栈中。
因此无论是哪种情况A的局部变量的值都会存在于A的堆栈中,数据不会丢失。当然如果堆栈空间不够存储这么多的局部变量的话,程序应该会跑飞,无法正常执行的。
系统中存在任务A和任务B,假设系统在运行任务A。
任务A的C函数中的局部变量要么被优化成寄存器,要么直接在任务堆栈中被分配;
第一种情况:局部变量被优化成寄存器。那么在任务切换时(A-->B),寄存器会被入栈,也就是说A的局部变量被保存至任务堆栈中去了。
第二种情况:直接在任务堆栈中分配,那么任务切换时(A-->B),局部变量仍然存在于当前任务的堆栈中。
因此无论是哪种情况A的局部变量的值都会存在于A的堆栈中,数据不会丢失。当然如果堆栈空间不够存储这么多的局部变量的话,程序应该会跑飞,无法正常执行的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询