5348|11

36

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

请教下:STM32 有类似8051的原子操作指令吗? [复制链接]

8051有一条非常有用的,不可被中断的指令:JBC  vbit    xxxx  ( 注:若位变量vbit 为‘1’则清零后转移到地址xxxx处,此为原子操作,不会被系统中断)   Keil 也提供了对应的C版本函数,请教各位老师,STM32有对应的指令吗?

此帖出自stm32/stm8论坛

最新回复

本帖最后由 damiaa 于 2023-6-6 15:09 编辑 [attach]703372[/attach]不可能一条指令的中间中断的。 一定是程序的一条指令执行完后才中断的。中断时会保存程序的下一条指令到程序计算器,还回时执行这条指令。   原子操作其实是指用户不想中断打断的操作 比如用户编的一个全局变量的数组是“my name is wangyi”。 在主程序中判断时,中断中改变了。那会用到几条指令。 在这几条指令的中间主程序读到i am w的时候中断了。中断中改为“i am linger”。主程序中断返回就继续,读 到的就是 “i am winger“ 乱了。 这时候可以用关中断的方式保证这个操作为原子操作。 关中断 处理全局变量的数组 开中断   类似原子操作的指令  这些也只能用到极为特别的地方,比如标志的判断。 更广泛的应用可能还是要自己动手。       详情 回复 发表于 2023-6-6 14:41
点赞(1) 关注
个人签名在只有一把铁锤的人眼里,世界万物都是钉子!
 

回复
举报

662

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
楼主的中断指的是 interrupt 吗? JBC 指令也是会被中断的,楼主的不可被中断的指令是从那里看到的呢?
此帖出自stm32/stm8论坛
 
 

回复

6040

帖子

204

TA的资源

版主

板凳
 
楼上说的好像有道理,其实指令都是不能被中断的,都是等当前指令执行完之后才进入中断处理程序。
此帖出自stm32/stm8论坛

点评

你这样解释也是对的。  详情 回复 发表于 2015-10-5 08:54
 
 

回复

662

帖子

0

TA的资源

纯净的硅(初级)

4
 
lcofjp 发表于 2015-10-5 07:21
楼上说的好像有道理,其实指令都是不能被中断的,都是等当前指令执行完之后才进入中断处理程序。

你这样解释也是对的。
此帖出自stm32/stm8论坛
 
 
 

回复

155

帖子

1

TA的资源

一粒金砂(中级)

5
 
STM32中有个位带操作,类似51的位寻址。算是个原子操作
此帖出自stm32/stm8论坛
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

6
 
slotg 发表于 2015-10-5 01:44
楼主的中断指的是 interrupt 吗? JBC 指令也是会被中断的,楼主的不可被中断的指令是从那里看到的呢?

按文档给出的解释:执行JBC vbit,xx  指令可分以下几个微操作:
  1:判断位变量Vbit是否为“1”
  2:若为“1”则跳转到相对地址xx,并在执行xx处指令前保证不被系统中断...
  3:若为0,则顺序执行...
以上由系统设计保证,专用于多任务的指令....
此帖出自stm32/stm8论坛

点评

嗯, 依我的理解每一个指令应该都是在执行完之后才会有中断的反应而不是只有JBC指令。  详情 回复 发表于 2015-10-5 13:35
 
个人签名在只有一把铁锤的人眼里,世界万物都是钉子!
 
 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

7
 
liutogo 发表于 2015-10-5 11:14
STM32中有个位带操作,类似51的位寻址。算是个原子操作

谢谢指教,总觉得应该有更简单的方法才对,呵呵。
此帖出自stm32/stm8论坛
 
个人签名在只有一把铁锤的人眼里,世界万物都是钉子!
 
 

回复

662

帖子

0

TA的资源

纯净的硅(初级)

8
 
caojp2008 发表于 2015-10-5 13:23
按文档给出的解释:执行JBC vbit,xx  指令可分以下几个微操作:
  1:判断位变量Vbit是否为“1”
  2: ...

嗯, 依我的理解每一个指令应该都是在执行完之后才会有中断的反应而不是只有JBC指令。
此帖出自stm32/stm8论坛
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

9
 
本帖最后由 caojp2008 于 2015-10-5 13:56 编辑
slotg 发表于 2015-10-5 13:35
嗯, 依我的理解每一个指令应该都是在执行完之后才会有中断的反应而不是只有JBC指令。

JBC vbit ,xx 指令特殊处在于:若为“1”则清“0”后跳转至XX
我们可以假设没有这条指令的情形下:

JB vbit,  xx      ;若为“1”则跳转至xx
....
....
xx: CLR vbit     ;清标志
注意,在执行CLR vbit 清除此标志前,可能被系统中断,被中断后在中断进程中又有可能执行:JB vbit,xx
如果vbit标志表示的是某串口空闲标志,则2个进程将“同时”使用该串口。。。
所以:JBC vbit,xx 在多任务中是非常重要的一条指令,等效于操作系统中的互斥操作...
此帖出自stm32/stm8论坛

点评

了解了,一直没去留意这细节。  详情 回复 发表于 2015-10-5 17:05
 
个人签名在只有一把铁锤的人眼里,世界万物都是钉子!
 
 

回复

662

帖子

0

TA的资源

纯净的硅(初级)

10
 
caojp2008 发表于 2015-10-5 13:48
JBC vbit ,xx 指令特殊处在于:若为“1”则清“0”后跳转至XX
我们可以假设没有这条指令的情形下:

J ...

了解了,一直没去留意这细节。
此帖出自stm32/stm8论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

11
 
不要拿着书本看呆了
此帖出自stm32/stm8论坛
 
 
 

回复

6069

帖子

4

TA的资源

版主

12
 
本帖最后由 damiaa 于 2023-6-6 15:09 编辑

不可能一条指令的中间中断的。

一定是程序的一条指令执行完后才中断的。中断时会保存程序的下一条指令到程序计算器,还回时执行这条指令。

 

原子操作其实是指用户不想中断打断的操作

比如用户编的一个全局变量的数组是“my name is wangyi”。 在主程序中判断时,中断中改变了。那会用到几条指令。

在这几条指令的中间主程序读到i am w的时候中断了。中断中改为“i am linger”。主程序中断返回就继续,读

到的就是 “i am winger“ 乱了。

这时候可以用关中断的方式保证这个操作为原子操作。

关中断

处理全局变量的数组

开中断

 

类似原子操作的指令  这些也只能用到极为特别的地方,比如标志的判断。 更广泛的应用可能还是要自己动手。

 

 

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表