硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2289|回复: 17
收起左侧

[μCOS-III] UCOSIII浮点寄存器为什么会被存储多次?

[复制链接]

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2020-5-20 15:30:29 | 显示全部楼层 |阅读模式
偶然发现有些任务里面的局部变量又是会被莫名的被修改,修改后的数又总是跟浮点寄存器非常长的相似。
在内存窗口仿真才发现,浮点寄存器在任务堆栈里竟然有多个备份,少则2个,多则4、5次,下图中是某个任务的堆栈,可以看出浮点寄存器被保存了2次。
多个任务中都涉及到浮点运算,这些任务在创建的时候都添加了标记OS_OPT_TASK_SAVE_FP,浮点运算也没有遇见过异常的情况,
但个人感觉这个现象不太正常,请教硬汉哥,正常情况下任务堆栈里面的浮点寄存器是不是应该只有一份呢?
系统内核版本是V3.04.04。
QQ截图20200520152707.bmp
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-20 15:41:25 | 显示全部楼层
跟踪下,连续存储两次是个什么执行流程。上次还没有释放,又来了一次? 任务嵌套任务,重复创建?、
你用过应该还是Micrium早期没有开启Lazy Stacking特性的方案。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2020-5-20 15:44:27 | 显示全部楼层
eric2013 发表于 2020-5-20 15:41
跟踪下,连续存储两次是个什么执行流程。上次还没有释放,又来了一次? 任务嵌套任务,重复创建?

嗯,正在逐个跟踪查找,这种保存多次的情况肯定不对是吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-20 15:47:04 | 显示全部楼层
云琴箫龙 发表于 2020-5-20 15:44
嗯,正在逐个跟踪查找,这种保存多次的情况肯定不对是吧?

测试下新版,新方案:

基于V5,V6和V7的最新版uCOS-III V3.08.00程序模板,含MDK和IAR两个版本,支持uC/Probe(2020-03-19)
http://www.armbbs.cn/forum.php?m ... 6918&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2020-5-20 15:55:06 | 显示全部楼层
eric2013 发表于 2020-5-20 15:41
跟踪下,连续存储两次是个什么执行流程。上次还没有释放,又来了一次? 任务嵌套任务,重复创建?、
你用 ...

创建任务时保存了一次,任务运行起来后一调度就会又重新保存一次。
你之前修改的那个在高版本中开启FPU的内核代码把创建任务时保存浮点寄存器这一步删除了。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-20 15:57:53 | 显示全部楼层
云琴箫龙 发表于 2020-5-20 15:55
创建任务时保存了一次,任务运行起来后一调度就会又重新保存一次。
你之前修改的那个在高版本中开启FPU ...

不科学啊,创建一次,进入任务后不恢复的吗? 你现在依然用的很久以前的老方案?
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2020-5-20 16:14:56 | 显示全部楼层
eric2013 发表于 2020-5-20 15:57
不科学啊,创建一次,进入任务后不恢复的吗? 你现在依然用的很久以前的老方案?

版本是V3.04.04,是UCOSIII自带的老方案。去年按照你的方式修改了一回源码,当时没搞定。
刚才结合任务TCB看了一下,任务堆栈基地址是A,创建后多占指针指向了B,调度的时候指向了C,然后又恢复到了B。因为堆栈释放没有清零机制,可能是这个原因导致看着是保存了2次浮点寄存器。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2020-5-20 16:18:14 | 显示全部楼层
eric2013 发表于 2020-5-20 15:57
不科学啊,创建一次,进入任务后不恢复的吗? 你现在依然用的很久以前的老方案?

虽然内存里是有2份浮点寄存器,但是此时堆栈指向是在下面,所以可能是因为任务堆栈释放没有清零导致。但是那些拷贝4次到5次的任务怎么回事儿还有待查。
QQ截图20200520161557.bmp

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-20 16:23:42 | 显示全部楼层
云琴箫龙 发表于 2020-5-20 16:18
虽然内存里是有2份浮点寄存器,但是此时堆栈指向是在下面,所以可能是因为任务堆栈释放没有清零导致。但 ...

果断换我楼上的方案测测。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2020-5-20 16:43:00 | 显示全部楼层
eric2013 发表于 2020-5-20 16:23
果断换我楼上的方案测测。

痛定思痛,试试。
你程序说明MDK要用5.26以上版本,我刚才用5.18编译了一下,也没报错,应该没啥问题吧?
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2020-5-20 17:05:38 | 显示全部楼层
eric2013 发表于 2020-5-20 15:57
不科学啊,创建一次,进入任务后不恢复的吗? 你现在依然用的很久以前的老方案?

这个版本创建任务时就将浮点寄存器压栈,现在感觉确实没啥必要,还浪费不少空间。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2020-5-20 22:15:55 | 显示全部楼层
eric2013 发表于 2020-5-20 16:23
果断换我楼上的方案测测。

参考你的例程走了一波,可以正常运行,但发现一个不一样的现象。就是发现新版本的操作系统浮点寄存器入栈的顺序跟之前好像不同。原来那个是从S31~S0,连续不间断。新版这个好像先压S15~S0,然后又压了点儿别的东西,然后再压S31~S16。如下图。好像记得你在哪儿说过这个浮点寄存器正确的压栈顺序,捉摸不定,特来请教,哪种才是合理的顺序?

另外发现每个栈底它都固定写了32个固定的数,这有何用意呢?用来判断堆栈是否溢出?
这个版本释放的堆栈依然不自动清零,不参考TCB中的栈顶地址咋一看还真会认为浮点寄存器被压了很多次栈呢。
QQ截图20200520220643.png

回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2020-5-20 22:21:43 | 显示全部楼层
eric2013 发表于 2020-5-20 16:23
果断换我楼上的方案测测。

新系统实测跟我上次遇见的问题一样,只要使能了PFU,所有的任务都会自动保存浮点寄存器。
不像V3.04.04那个版本创建任务时还有个OS_OPT_TASK_SAVE_FP用来指示用不用保存浮点寄存器。
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
发表于 2020-5-21 10:01:26 | 显示全部楼层
云琴箫龙 发表于 2020-5-20 22:21
新系统实测跟我上次遇见的问题一样,只要使能了PFU,所有的任务都会自动保存浮点寄存器。
不像V3.04.04 ...

使能了FPU,浮点寄存器肯定是要自动保存的啊
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
发表于 2020-5-21 10:04:05 | 显示全部楼层
eric2013 发表于 2020-5-20 15:41
跟踪下,连续存储两次是个什么执行流程。上次还没有释放,又来了一次? 任务嵌套任务,重复创建?、
你用 ...

开启了lazy stacking功能的话,如果任务切换时上下文没有用到浮点运算,那么s0~s15就不会自动压栈,但是s16~s31还是压栈的吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-21 11:09:34 | 显示全部楼层
shibinjie 发表于 2020-5-21 10:04
开启了lazy stacking功能的话,如果任务切换时上下文没有用到浮点运算,那么s0~s15就不会自动压栈,但是s ...

在port文件里面做了处理,会检测当前运行这个任务是否使用了浮点,使用了会做入栈,没有用到,不入栈。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2020-5-21 14:35:33 | 显示全部楼层
shibinjie 发表于 2020-5-21 10:01
使能了FPU,浮点寄存器肯定是要自动保存的啊

3.04版本创建创建任务时只有添加了OS_OPT_TASK_SAVE_FP标记,它才会把浮点寄存器入栈。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 01:28 , Processed in 0.210570 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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