打印

keil c51子函数里用的dptr,怎么再上级就保存了?

[复制链接]
3847|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linqing171|  楼主 | 2010-4-22 16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中断函数,对实时性要求很高,里面调用了一个函数。
这个函数在中断处理完了后调用的,时间不做要求,里面用到了DPTR和B。

可是C51无论什么优先级,是否inline,还要color register, 以及是否手工插入 _push_   _pop_ ,还要using....

结果都是一个,在进入中断函数的时候,压栈DPTR和B,进入子函数后直接mov dpl,xxx

谁有没有个好的办法屏蔽?

相关帖子

沙发
ayb_ice| | 2010-4-22 17:11 | 只看该作者
你都在中断调用了函数,KEIL还能说什么,这种情况下KEIl肯定认为你使用了全部寄存器,当然要压栈了,否则可能出错,把函数直接展开在中断中。

使用特权

评论回复
板凳
john_light| | 2010-4-22 17:24 | 只看该作者
时间不做要求的话,在中断里设个标志。

那个函数放在主程序里。

使用特权

评论回复
地板
ejack| | 2010-4-22 18:30 | 只看该作者
LZ说了中断函数本身的实时性要求很高,而这个功能模块只要中断完成后实现就行、时间不做要求,所以觉得3L的方法靠谱。

使用特权

评论回复
5
冷漠| | 2010-4-23 09:27 | 只看该作者
本帖最后由 冷漠 于 2010-4-23 09:47 编辑

很简单的事。把中断程序写在另一个模块,用汇编语言写,自己愿意怎么屏蔽都行。然后放在项目里和C主函数一起编译、连接即可。
给你个框架,当然我这里用的是串口中断4,    CSEG  AT  0023h;  自己按要求作相应修改即可:
例如  text2.asm

NAME        TEXT2
?PR?ssio?TEXT2    SEGMENT   CODE
        PUBLIC        ssio
CSEG        AT        00023H
        LJMP        ssio

; void  ssio(void)  interrupt 4  using 1

        RSEG  ?PR?ssio?TEXT2
        USING        1
ssio:
      ;填写自己的汇编程序语句        

       ACALL    (  你的C函数 )
        RETI         
        END

如果C中断函数过于复杂,只要把C中断函数编译结果化为汇编文件test2.src,然后自己修改即可。

使用特权

评论回复
6
冷漠| | 2010-4-23 11:34 | 只看该作者
本帖最后由 冷漠 于 2010-4-23 11:45 编辑

2楼深刻。
如果在中断函数里调用外部函数,那么中断函数一旦触发,就需要开辟现场保护区,保护被中断的CPU现场。——不单单是保护dptr和B。与LZ外部函数是否用到dptr、B寄存器无关。这种保护并不会造成程序运行结果错误,为何要屏蔽?——保护就保护吧,反正还要恢复的。

这是按照“系统调用陷入机制”来做的,尽管你不是系统调用,但是C51按标准做,一切简单标准化了。

使用特权

评论回复
7
linqing171|  楼主 | 2010-4-24 07:31 | 只看该作者
先说下我的实际情况,
1 数据包内速度要求特别快,也就是我说的收到数据中断到应答之间不能超过9条汇编语句,其中包括地址等简单的协议判断。
2 数据包收完后,可以稍等处理,但是我的主循环是20ms的,等的也太长了。。。。。

回2楼老大,我用的keil c51 9.0, 在所有的优化情况下,如果没有用到dptr,dptr都不会压栈。
按照3L的说法,实际上不是太符合,因为在标志位处理完之前,为了数据完整性,不能开中断。 因为我的数据的特点是非固定性突发,我只能缓冲一次突发的。 一个突发数据包内,要求相应很快。
所以折中了一下,很多年没有做过汇编了,虽然以前做过很多k的汇编,还是喜欢用C,5楼是本来的打算。后来又想到了一个思路,跟大家分享。

两个中断函数,把我说的那个带dptr的函数放定时器中断里面去,收数据包的这个函数,收完数据包后,不再调用带dptr的函数,而是关自己中断,直接触发定时器中断。在接口上,给客户实现最快速度的同时,也保证了数据的完整性。

使用特权

评论回复
8
linqing171|  楼主 | 2010-4-24 07:32 | 只看该作者
我说的数据完整性,就是,接收到了上位客户机器的数据,并且应答了,就一定要处理不能被覆盖掉。

使用特权

评论回复
9
ayb_ice| | 2010-4-24 08:45 | 只看该作者
"1 数据包内速度要求特别快,也就是我说的收到数据中断到应答之间不能超过9条汇编语句,其中包括地址等简单的协议判断"
以上要求不是开玩笑吧,理论上51的中断延时都可能不止这个条件,根本就不可能实现,9条指令多长时间(9~18US),串口发个数据多少时间。。。

使用特权

评论回复
10
冷漠| | 2010-4-24 09:53 | 只看该作者
本帖最后由 冷漠 于 2010-4-24 10:31 编辑

51类型单片机,12M晶振,串口9600 bps,发送一个字节大概是1ms,也就是1,000us。
很高级的能够自动发出响应(不影响CPU工作)的智能通信控制器,响应时间大概是1、2个比特之内,如若仍是9600 bps,自动响应时间为100us左右。当然智能通信控制器的传输比特率至少是64Kbps的(同步传输技术)。

所以,LZ在如此慢的通信速率(异步通信最快算它62.5k)上要求如此快的响应速度,时间全耽误在信息传输路上了。快递公司动作再快,没有飞机航班也没用,只能坐火车了。

我们经常遇到客户这类莫名其妙的不合理要求,没什么办法,谁让我们拿了别人项目钱。没事,都习惯应付了,其实客户也是没事瞎说,他不瞎说点技术要求,领导面前显得不作为。

我前几天交付客户的通信软件,响应时间100ms以上,但是我标称10ms之内。.....并且说出来是“经客户要求,多次改进....”等等等等吹嘘一通,结果,客户“非常满意”,痛痛快快给了我们20W,并且以后继续合作。(客户只能用人的反应速度粗略测量检验一下,100ms,人反映得过来么?反正测试时客户的手没我的程序响应快。)

使用特权

评论回复
11
linjing| | 2010-4-24 16:00 | 只看该作者
针对2楼的说法,补充一下,Keil C51有个优化选项,可以对全局的寄存器使用情况进行优化

使用特权

评论回复
12
linjing| | 2010-4-24 16:07 | 只看该作者
针对LZ的问题,
正确的做法应该在中断程序中设置标志,或者写事件队列,退出中断后在主程序中检测处理,既然中断的实时要求高,就不应该在中断里做太多事情

使用特权

评论回复
13
linjing| | 2010-4-24 16:09 | 只看该作者
编译程序有责任保护中断程序中使用到的寄存器,无论如何,你确实用了DPTR,编译程序就不可能不闻不问,
如果你确实不想中断程序自动保存DPTR,要么不要使用DPTR,要么自己手工汇编写中断ISR,没得其他办法

使用特权

评论回复
14
ejack| | 2010-4-24 20:06 | 只看该作者
本帖最后由 ejack 于 2010-4-24 20:07 编辑

LZ好像没说过是串口通讯吧……
如果是板上SPI通讯,中断处理可能确实很紧凑

使用特权

评论回复
15
linqing171|  楼主 | 2010-4-25 13:56 | 只看该作者

去掉客户的名字

本帖最后由 linqing171 于 2010-4-25 14:41 编辑

好了澄清一下,C8051F的硬件SMBUS时序,软件模拟EEPROM协议,是从I2c。
当SMBUS收到片地址+RW的时候的中断也就是第8个时钟的时候,到我应答这个地址也就是第9个时钟之前,给的时间是1秒除以100k,也就是十多个us吧。 9条汇编指令只是实际测试的大概,包括双周期和单周期的,具体理论时间如果我说出来也是忽悠。
每个单片机实现的硬件i2c都不一样,有的能自动处理应答,软件的压力就小一些,以前用过两款单片机这个地方都是给i2c控制器设置上匹配地址,它自动应答的,应答后才给中断。其他也是接收数据之前就把i2c控制器都知道下个字节发不发应答,中断函数压力不大。
一个数据包收到后,处理时间按照SMBUS的要求最少会有9.2us,最多没有规定,但是还是要尽量的快,主程序的循环是几十毫米级别的,明显不能放主循环里。

客户比我们懂技术的多,不存在忽悠的可能性。供应商的所有方案技术什么的,都一清二楚,只所以他们不做是因为利润低。对于细节测试特别严格,如果忽悠被发现,索赔一次我们这种小公司就关门了,羡慕10楼的客户。

另外回13楼的,看我7楼的回复,确实是纯C,实现了第一个ISR不保存DPTR。

因为7楼的方法我也第一次用,大家给看看有没有隐患。

使用特权

评论回复
16
ejack| | 2010-4-25 17:32 | 只看该作者
LZ解释清楚需求以后,就好理解多了。
7L的方法我认为也是一种解决的办法……如果LZ不想更改主函数的结构。
但是LZ所述的主循环20ms的确不太合理。

使用特权

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

本版积分规则

53

主题

2875

帖子

15

粉丝