打印

PICC指令的工作周期跟汇编的不一致

[复制链接]
2841|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用汇编指令,4MHz晶振的时候,指令周期基本都是1us,比如说INCF R0, 1。
而picc使用R0++;这里的R0是int型。指令周期却有2us.这是为什么呢?
程序中设定一个40us的高频脉冲,和三个定时器中断,结果高平脉冲会受到中断的影响,每种中断每次响应都会将高平脉冲的高电平或者低电平时间加长到100us。这该如何解决。 图中密集部分是高频脉冲,缺口为100us断点部分,我们可以看到3ms,10ms,5ms的时候存在缺口,而这恰好是我设定的3个中断时间。
沙发
yewuyi| | 2011-4-19 13:46 | 只看该作者
使用ASM的时候,变量只能字符型,也就是单字节操作,从代码看就是一条指令,4M振荡时即为1US

当使用C语言时,因为你定义的变量为整型,也就是两个字节,对应的机器指令肯定就大于等于两条了,如果是两条无跳转指令,则正好就是2US啦。

你自己没有正确理解而已。

使用特权

评论回复
板凳
weimao228|  楼主 | 2011-4-20 08:10 | 只看该作者
使用ASM的时候,变量只能字符型,也就是单字节操作,从代码看就是一条指令,4M振荡时即为1US

当使用C语言时,因为你定义的变量为整型,也就是两个字节,对应的机器指令肯定就大于等于两条了,如果是两条无跳转指令 ...
yewuyi 发表于 2011-4-19 13:46
听了老师的话,我去查看了下.as的编译文件,发现单单int k=0;可以有7条指令如:
;shine00.c: 29: int k=0;
movlw low(0)
bcf status, 5 ;RP0=0, select bank0
bcf status, 6 ;RP1=0, select bank0
movwf ([email=DELAY2@k]DELAY2@k[/email])
movlw high(0)
movwf (([email=DELAY2@k))+1]DELAY2@k))+1[/email]
写int k=0;k++;就有14条指令。所以有20us的脉冲。我真是糊涂,是第一次看到c语言的指令的编译汇编形式,呵呵

使用特权

评论回复
地板
XIEYUANBIN| | 2011-4-20 08:27 | 只看该作者
事实上这和编译器也有很大的关系,你用CHAR型变量,R++不一定就能得到一个指令周期的汇编指令.编译出来会很复杂.

使用特权

评论回复
5
weimao228|  楼主 | 2011-4-20 13:26 | 只看该作者
这样,使用MPLAB的进行编译,要设置些什么呢? 4# XIEYUANBIN

使用特权

评论回复
6
yewuyi| | 2011-4-21 09:32 | 只看该作者
设置优化等级

使用特权

评论回复
7
XIEYUANBIN| | 2011-4-21 16:22 | 只看该作者
5# weimao228

1,购买正版的编译器
2,将优化等级设置到最高9级

使用特权

评论回复
8
weimao228|  楼主 | 2011-4-22 12:50 | 只看该作者
picc编译太麻烦了,还是汇编的比较容易理解。但是picc有它的优点,真是两难舍,采用嵌入式汇编吧。

使用特权

评论回复
9
yewuyi| | 2011-4-22 13:53 | 只看该作者
picc编译太麻烦了,还是汇编的比较容易理解。但是picc有它的优点,真是两难舍,采用嵌入式汇编吧。
weimao228 发表于 2011-4-22 12:50



没发现有什么麻烦,主要是你还不熟悉吧

使用特权

评论回复
10
谈的元| | 2011-4-22 23:14 | 只看该作者
PICC已经相当智能了

使用特权

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

本版积分规则

0

主题

60

帖子

1

粉丝