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

[复制链接]
3988|9
 楼主| weimao228 发表于 2011-4-19 11:13 | 显示全部楼层 |阅读模式
使用汇编指令,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++不一定就能得到一个指令周期的汇编指令.编译出来会很复杂.
 楼主| weimao228 发表于 2011-4-20 13:26 | 显示全部楼层
这样,使用MPLAB的进行编译,要设置些什么呢? 4# XIEYUANBIN
yewuyi 发表于 2011-4-21 09:32 | 显示全部楼层
设置优化等级
XIEYUANBIN 发表于 2011-4-21 16:22 | 显示全部楼层
5# weimao228

1,购买正版的编译器
2,将优化等级设置到最高9级
 楼主| weimao228 发表于 2011-4-22 12:50 | 显示全部楼层
picc编译太麻烦了,还是汇编的比较容易理解。但是picc有它的优点,真是两难舍,采用嵌入式汇编吧。
yewuyi 发表于 2011-4-22 13:53 | 显示全部楼层
picc编译太麻烦了,还是汇编的比较容易理解。但是picc有它的优点,真是两难舍,采用嵌入式汇编吧。
weimao228 发表于 2011-4-22 12:50



没发现有什么麻烦,主要是你还不熟悉吧
谈的元 发表于 2011-4-22 23:14 | 显示全部楼层
PICC已经相当智能了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

60

帖子

1

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