搜索
bottom↓
回复: 15

请教STM8S中断函数,内部静态变量和全局变量效率上区别?

[复制链接]

出0入0汤圆

发表于 2015-6-1 08:44:23 | 显示全部楼层 |阅读模式
就是说执行中断函数时,中断里有近10个静态变量需要操作,因为实时性很高,这影响中断时间,我想问的是里面的静态变量和全局的在执行效率有区别吗?主要是在刚刚进中断时压栈时间,是否是要压10个变量的栈,在全局和局部时有何区别,谢谢各位!

出0入0汤圆

发表于 2015-6-1 09:26:40 | 显示全部楼层
静态变量除了作用域 其它等效于全局变量

不过想stm8中断高效的话, 就不能用IAR了....IAR有蛋疼的虚拟寄存器要保护

出0入17汤圆

发表于 2015-6-1 09:29:00 | 显示全部楼层
静态变量是VIP,在RAM中有自己的一个长久位置,不需要去栈里搞个临时座位。
头像被屏蔽

出0入0汤圆

发表于 2015-6-1 09:55:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入17汤圆

发表于 2015-6-1 10:13:44 | 显示全部楼层
snoopyzz 发表于 2015-6-1 09:26
静态变量除了作用域 其它等效于全局变量

不过想stm8中断高效的话, 就不能用IAR了....IAR有蛋疼的虚拟寄存 ...

正常只要保存A,CC,PC等之类的寄存器就可以了,你说的虚拟寄存器是指什么?  

出0入0汤圆

发表于 2015-6-1 10:14:35 | 显示全部楼层
本帖最后由 xiaolong_ba 于 2015-6-1 10:26 编辑

静态变量是不放在栈的吧,是存放在静态存储区里。跟压不压栈没关系
内存一共分成三个区,静态区、堆区、栈区;外部变量和全局变量存放在静态区。局部变量存放在栈区;动态分配的内存存放在堆区;

出0入0汤圆

发表于 2015-6-1 10:26:41 | 显示全部楼层
本帖最后由 snoopyzz 于 2015-6-1 10:27 编辑
wicy001 发表于 2015-6-1 10:13
正常只要保存A,CC,PC等之类的寄存器就可以了,你说的虚拟寄存器是指什么?   ...


stvd+cosmic STM8硬件会保护 A X CC PC SP的, cosmic的局部变量是SP寻址, 没问题不影响中断时间,

但蛋疼的IAR自已给局部变量 设计了一套虚拟寄存器, 进中断如果用局部变量就得保护这些...各种蛋疼
=========
不过LZ说的 静态局部变量不在此限, 静态局部变量实质等效全局变量,只是编译阶段被限制了作用域

出0入17汤圆

发表于 2015-6-1 11:18:57 | 显示全部楼层
snoopyzz 发表于 2015-6-1 10:26
stvd+cosmic STM8硬件会保护 A X CC PC SP的, cosmic的局部变量是SP寻址, 没问题不影响中断时间,

但蛋疼 ...

学习了。还真是这样。 刚才粗略看了IAR手册, 我的理解IAR的虚拟寄存器功能应该和51的R区差不多。
我仿真了下,确实看到 中断进入后,先入栈, IRET之前,又出栈,它要不这么做,RAM有可能崩溃。



出0入0汤圆

 楼主| 发表于 2015-6-1 12:23:47 | 显示全部楼层
snoopyzz 发表于 2015-6-1 10:26
stvd+cosmic STM8硬件会保护 A X CC PC SP的, cosmic的局部变量是SP寻址, 没问题不影响中断时间,

但蛋疼 ...

谢谢层主的精细解答;
也谢谢各位;

我描述错了,原意是想指,这些变量需要调入CPU的内核寄存器,那么CPU原本寄存器的值首先被压栈,再调入这些变量计算,之前看过AVR里面都是这样的;但现在也解决了这是没有区别的;现在又有新问题,那个虚拟寄存器的保护,是不是使用STVD编译器就不会影响这个时间了呢,期待再次回复。

出0入0汤圆

发表于 2015-6-1 12:24:35 | 显示全部楼层
wicy001 发表于 2015-6-1 11:18
学习了。还真是这样。 刚才粗略看了IAR手册, 我的理解IAR的虚拟寄存器功能应该和51的R区差不多。
我仿真 ...

cosmic编译器没有虚拟寄存器一说...其实STM8就不需要所谓的虚拟寄存器

这完全是IAR不想适应芯片, 而是想让芯片适应自己的编译器产生的怪胎...

IAR有20%的stm8指令从来不用, SP寻址做局部变量本来是很好的事, IAR也不用, 搞个奇葩出来

出0入17汤圆

发表于 2015-6-1 14:03:13 | 显示全部楼层
snoopyzz 发表于 2015-6-1 12:24
cosmic编译器没有虚拟寄存器一说...其实STM8就不需要所谓的虚拟寄存器

这完全是IAR不想适应芯片, 而是想 ...

我试了下,
在函数里定义了一个变量char a=0;调试a++,IAR将变量a,放在虚拟寄存器中;
在变量a前加volatile后,IAR将变量a放在堆栈上。

char a的情况
  1. LD A,?b8
  2. ADD A, #?b1
  3. LD ?b8,A
复制代码


volatile char a的情况
  1. LD A, (?b1,SP)
  2. ADD A, #?b1
  3. LD (?b1,SP),A
复制代码


我对stm8的指令不熟,简单看了下手册,LD A,?b8,与 LD A, (?b1,SP)的执行效率是一样的。

出0入0汤圆

发表于 2015-6-1 14:24:01 | 显示全部楼层
wicy001 发表于 2015-6-1 14:03
我试了下,
在函数里定义了一个变量char a=0;调试a++,IAR将变量a,放在虚拟寄存器中;
在变量a前加vola ...

这还不够喷的吗?
一条指令就完成的事, 被拆成了3条

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入17汤圆

发表于 2015-6-1 15:05:19 | 显示全部楼层
本帖最后由 wicy001 于 2015-6-1 15:06 编辑
snoopyzz 发表于 2015-6-1 14:24
这还不够喷的吗?
一条指令就完成的事, 被拆成了3条


你这是什么编译器? stvd吗?  a++翻译成INC比较好一些。

IAR手册里说:“A virtual register is a static memory location in the fastest memory used for storing variables and temporary values”
刚才,我的意思是, 对于LD指令,弄个虚拟寄存器,访问速度没有什么提升。

现在想想,如果运算复杂的话,使用虚拟寄存器会有一定的效果,毕竟它是RAM的最头上几个字节,除非stm8的指令对于256寻址,与大于256字节的寻址都是一个效率。
  

出0入0汤圆

发表于 2015-6-1 15:10:19 | 显示全部楼层
学习了,很好的讨论

出0入0汤圆

发表于 2015-6-1 15:29:22 | 显示全部楼层
本帖最后由 snoopyzz 于 2015-6-1 15:30 编辑
wicy001 发表于 2015-6-1 15:05
你这是什么编译器? stvd吗?  a++翻译成INC比较好一些。

IAR手册里说:“A virtual register is a sta ...


你猜对了, STM8开始 0页寻址和64K内非0页寻址效率相同, 只要流水线空闲

我这当然是STVD+COSMIC, 所以说IAR不懂STM8, 我测试过看了生成的汇编后就秒删了...说它是渣渣不为过, 还不如BBS里高手个人开发的STM8编译器,那个我测试都比IAR强

出0入17汤圆

发表于 2015-6-1 16:34:12 | 显示全部楼层
snoopyzz 发表于 2015-6-1 15:29
你猜对了, STM8开始 0页寻址和64K内非0页寻址效率相同, 只要流水线空闲

我这当然是STVD+COSMIC, 所以说I ...

原来如此。 这次可真长知识了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 15:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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