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

[复制链接]
2387|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 | 显示全部楼层
先帮着顶起了一下的啊
 楼主| 科技猎人 发表于 2014-2-12 16:04 | 显示全部楼层
香水橙 发表于 2014-2-12 15:32
既然已经说了“只能在特权模式下才能执行成功”,那么在非特权模式下就不能保证执行成功,这怎么能是BUG? ...

我理解的非特权模式下操作就应该是相当于nop或产生用法fault,但现在的情况是开始是可以,用一会儿就出关中断起效开中断不起效了,中断不能响应我也就无法再有其他操作了。。。
airwill 发表于 2014-2-12 16:17 | 显示全部楼层
一种不严谨的说法. 不严谨的特权保护.
看来 CM3 的保护机制并不严格, 说不定还有其他的指令或功能也有类似情况.
拿起书本 发表于 2014-2-12 17:13 | 显示全部楼层
也许这只是一种 CM3 不能认定的特权吧,关注中。
 楼主| 科技猎人 发表于 2014-2-13 08:44 | 显示全部楼层
用什么方式或途径才能得到官方解释呢?
outstanding 发表于 2014-2-13 12:16 | 显示全部楼层
问 版主 哈哈
xiaobo0234 发表于 2014-2-13 12:33 | 显示全部楼层
写个邮件问一下ST官方?
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

粉丝
快速回复 在线客服 返回列表 返回顶部