硬汉嵌入式论坛

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

[μCOS-III] ucos3.05.01 官方fpu一直进入hardfault

[复制链接]

57

主题

908

回帖

1079

积分

至尊会员

积分
1079
发表于 2015-10-16 14:01:56 | 显示全部楼层 |阅读模式
http://micrium.com/download/micr ... -tcpip-wifi-no-src/

官方的一开fpu就进入hardfault,不开正常。看程序的逻辑里面fpu也都push pop,结构还搞得挺好的。
还判断了函数是否用到了fpu的寄存器,没用就不push。 搞不懂,写出来难得就不测试一下吗??

请高人给改改。

用armfly的发现改了之后fpu能用,不开反而不能用。头大。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-10-16 14:32:49 | 显示全部楼层
好的,有时间我测试下新版本。
回复

使用道具 举报

57

主题

908

回帖

1079

积分

至尊会员

积分
1079
 楼主| 发表于 2015-10-16 14:49:59 | 显示全部楼层
lz神速。   我又测试了 用的iar7.4   ucos3.05.01   port用的amfly的3.01.2,就是 *--p_stk = (CPU_STK)0xFFFFFFFDUL;                            /* xPSR 这个。开了FPU没用问题, 不开FPU切换就进入hardfault。。。。       官方的粗暴版本是不开正常,开了hardfault。。。。




另外看到一个帖子,应该是版主的:


我敢说你没有研究过M4内核,UCOS-III的这个代码错误太多了,完全不符M4内核的FPU,我写的案只
有任务使用了浮点寄存器(也就是做了浮点运算)才需要将其入栈,没有使用浮点寄存器的
任务不需要进行入栈。很方便,参数标志都省了。


分享CM4看数心得吧。
CM4内核有个叫lazy stacking的特性,目的是减少没必要的浮点寄存器入栈和出栈时间。该特性默认是使能的,所以不需要关注如何开启。
内核进入中断时,如果曾经使用过FPU指令,就会将EXC_RETURN的bit4清零(通过LR访问);否则bit4为1。如果EXC_RETURN的bit4清零的状态下,内核会自动入栈S0-S15,FPSCR;当然还有另外8个基础寄存器。

所以,我们的任务切换代码仅需要检测LR的bit4,如果该位为零,就保存剩下的S16-S31即可;如果该位为1,则根本无需保存,因为该线程未曾使用过FPU。

这个知识点说出来如此简单!

不过micrium官方移植是没有考虑这点,它只是粗暴的保存和恢复所有FPU寄存器,用起来不会有错误发生,不过没有利用lazy stacking特性,效率很低!

以上心得总结供大家参考!
回复

使用道具 举报

57

主题

908

回帖

1079

积分

至尊会员

积分
1079
 楼主| 发表于 2015-10-25 19:22:25 | 显示全部楼层
顶一下 。  版主。搞定没有???
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-10-26 08:25:00 | 显示全部楼层

回 roguebear 的帖子

roguebear:顶一下 。  版主。搞定没有??? (2015-10-25 19:22) 
还没有时间去测试,待我有时间了立马去测试。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-13 05:02 , Processed in 0.282533 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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