打印
[STM32F1]

发现一个M3内核BUG,不知道别人遇到过没?

[复制链接]
2009|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
科技猎人|  楼主 | 2014-2-12 14:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
资料中说:在armcc编译器中,__enable_irq();__enable_fault_irq();__disable_irq();__disable_fault_irq();为内在函数,且只能在特权模式下才能执行成功。但我实际测试时发现在用户模式也能正确执行,但在频繁开关全局中断时,会有关掉后不再打开的情况发生。但是在 特权模式下很长时间频繁开关全局中断也没出现此情况。我用的芯片型号是STM32F103CBT6-GH21090-CHN321和GD32F103CBT6-D-DP3179-DH1328。

我只在手头现有的5片芯片上发现都是这种情况,不知道M3内核是否有这个BUG,还是我那里搞错了。。。
沙发
aozima| | 2014-2-12 14:41 | 只看该作者
有这事?关注。
期待进一步测试。

使用特权

评论回复
板凳
香水橙| | 2014-2-12 15:32 | 只看该作者
既然已经说了“只能在特权模式下才能执行成功”,那么在非特权模式下就不能保证执行成功,这怎么能是BUG?应该是你理解错了。

使用特权

评论回复
地板
firstblood| | 2014-2-12 15:54 | 只看该作者
先帮着顶起了一下的啊

使用特权

评论回复
5
科技猎人|  楼主 | 2014-2-12 16:04 | 只看该作者
香水橙 发表于 2014-2-12 15:32
既然已经说了“只能在特权模式下才能执行成功”,那么在非特权模式下就不能保证执行成功,这怎么能是BUG? ...

我理解的非特权模式下操作就应该是相当于nop或产生用法fault,但现在的情况是开始是可以,用一会儿就出关中断起效开中断不起效了,中断不能响应我也就无法再有其他操作了。。。

使用特权

评论回复
6
airwill| | 2014-2-12 16:17 | 只看该作者
一种不严谨的说法. 不严谨的特权保护.
看来 CM3 的保护机制并不严格, 说不定还有其他的指令或功能也有类似情况.

使用特权

评论回复
7
拿起书本| | 2014-2-12 17:13 | 只看该作者
也许这只是一种 CM3 不能认定的特权吧,关注中。

使用特权

评论回复
8
科技猎人|  楼主 | 2014-2-13 08:44 | 只看该作者
用什么方式或途径才能得到官方解释呢?

使用特权

评论回复
9
outstanding| | 2014-2-13 12:16 | 只看该作者
问 版主 哈哈

使用特权

评论回复
10
xiaobo0234| | 2014-2-13 12:33 | 只看该作者
写个邮件问一下ST官方?

使用特权

评论回复
11
lenglx| | 2014-2-13 14:20 | 只看该作者
资料中说:在armcc编译器中,__enable_irq();__enable_fault_irq();__disable_irq();__disable_fault_irq();为内在函数,且只能在特权模式下才能执行成功。但我实际测试时发现在用户模式也能正确执行,但在频繁开关全局中断时,会有关掉后不再打开的情况发生。但是在 特权模式下很长时间频繁开关全局中断也没出现此情况。我用的芯片型号是STM32F103CBT6-GH21090-CHN321和GD32F103CBT6-D-DP3179-DH1328


正确执行的意思是: 确实PRIMASK的值改变了? 还是只是这个代码执行了而已?

__enable_irq() 对应的汇编代码是 : CPSIE I
这是个特权级的指令,如果在用户态执行,将被忽略(不起作用)

CPS<effect><q> <iflags>
where:
<effect> Specifies the effect required on PRIMASK and FAULTMASK. This is one of:
IE Interrupt Enable. This sets the specified bits to 0.
ID Interrupt Disable. This sets the specified bits to 1.
<q> See Standard assembler syntax fields on page A7-207. A CPS instruction must be
unconditional.
<iflags> Is a sequence of one or more of the following, specifying which masks are affected:
i PRIMASK. Raises the execution priority to 0 when set to 1. This is a 1-bit
register, that supports privileged access only.
f FAULTMASK. Raises the execution priority to -1 (the same as HardFault)
when it is set to 1.
Operation
EncodingSpecificOperations();
if CurrentModeIsPrivileged() then
if enable then
if affectPRI then PRIMASK<0> = ‘0’;
if affectFAULT then FAULTMASK<0> = ‘0’;
if disable then
if affectPRI then PRIMASK<0> = ‘1’;
if affectFAULT && ExecutionPriority() > -1 then FAULTMASK<0> = ‘1’;
Exceptions
None.
Notes
Privilege Any unprivileged code attempt to write the masks is ignored.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

192

帖子

8

粉丝