搜索
bottom↓
回复: 19

PICC 16 v9.70 pro发现BUG,郁闷

[复制链接]

出0入0汤圆

发表于 2010-7-30 18:51:21 | 显示全部楼层 |阅读模式
有个习惯,新的C环境我都会测一下对于数据运算的支持,最怕的是类型隐式转换,这次第一个测试就出了问题,
PIC16F887, PICC16 v9.70(用的是坛里的破解)
void main(void)
{
        unsigned int a,b;
        a=258;
        a -=256;
        b=a>>1;
        while(b);
}

仿真结果如下:

(原文件名:test.JPG)

a -= 256, 结果应当是2,但窗口中出现了0xff02!
有几点都不妥当:
1. clrf 0x3. 这条指令应该不妥吧? 据说操作status得不到预期结果
2.a-=256汇编出来的结果 btfss 0x3,0 这是有什么根据呢? 就是前面clrf 0x3结果正确, 但我只减256,没要求减C啊?

另外, a-=257是不会有错的,因为它编译出来如下:
;a -= 257;
  07EF    3001     MOVLW 0x1
  07F0    02F2     SUBWF 0x72, F
  07F1    1C03     BTFSS 0x3, 0
  07F2    03F3     DECF 0x73, F
  07F3    02F3     SUBWF 0x73, F

好像这个问题是编译器太聪明了,但是也没优化成直接赋值

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-7-30 19:06:31 | 显示全部楼层
lz 是什么设置断点的?
PIC只有一个硬件断点.软件断点是什么设置?

出0入0汤圆

 楼主| 发表于 2010-7-30 19:14:51 | 显示全部楼层
双击就有断点了啊
大家可以看看是不是有这个问题.

出0入0汤圆

发表于 2010-7-30 19:33:47 | 显示全部楼层
回复【2楼】zhuyi
双击就有断点了啊
大家可以看看是不是有这个问题.
-----------------------------------------------------------------------

可能是软件仿真的时候可以设置多达999个断点吧.明天试一下.
谢谢!

出0入0汤圆

发表于 2010-7-30 19:53:56 | 显示全部楼层
无意义的代码测试,全部优化都算正常,要想这样试编译器就关闭优化,加上volatile!

出0入0汤圆

发表于 2010-7-30 20:06:53 | 显示全部楼层
我也感觉9.70PRO破解不如9.60PL3的好

出0入0汤圆

发表于 2010-7-30 20:44:06 | 显示全部楼层
picc 我只对8.05放心。

出0入0汤圆

发表于 2010-7-30 20:52:44 | 显示全部楼层
同意楼上。

出0入0汤圆

发表于 2010-7-30 21:06:57 | 显示全部楼层
一个都不放心莫名其妙的优化,只有用安装时不用破解的(Lite Mode)的才算能用

出0入0汤圆

发表于 2010-8-4 08:49:54 | 显示全部楼层
以前用PICC8.05 一般测试选芯片PIC16C56 建一个500字节常量数组, 再写点代码, 十有八九会出错

出0入0汤圆

发表于 2010-8-4 10:52:29 | 显示全部楼层
因为对C编译器的不放心,所以我现在基本上用汇编写。

出0入0汤圆

发表于 2010-8-4 10:55:34 | 显示全部楼层
“clrf 0x3. 这条指令应该不妥吧? 据说操作status得不到预期结果”
什么叫得不到预期的效果??我一直习惯就用CLRF STATUS来指向BANK0,没有什么不妥的啊~~而且datasheet上也是推荐这样写。

对于你说的“据说操作status得不到预期结果”,我看了一下datasheet,里面确实提到了“如果一条影响Z、DC或C位的指令以STAUS作为目标寄存器,则不能写这三个状态位……将STATUS作为目标寄存器的指令可能无法得到预期的效果”,请注意,不是操作STATUS得不到预期结果,而是其作为目标寄存器并且希望改变DC/C/Z这三个位的时候,这三个位不会变。
而且后面有个例子也说明了“CLRF STATUS会清零高3位,并将Z位置1。这样STATUS的值将为000uu1uu(其中u=不变)”。所以,一般在程序的最开始加上一句CLRF STATUS是为了确保当前使用内存指向BANK0。

出0入0汤圆

发表于 2010-8-4 23:44:13 | 显示全部楼层
"但我只减256,没要求减C啊?"
————你声明的a是无符号整型变量,就是两个字节的,在涉及两个字节操作的时候,都为了使两个字节不发生错误,当然需要用到借位标志位了。

并且不建议使用破解版的,我用MPLAB 8.50自带的for PIC10/12/16 MCUs (Lite Mode)V9.70,就没有你的问题。但BTFSS 0x3, 0这个是必须有的,因为你是两个字节的操作。而你用的单片机是8位的。


(原文件名:QQ截图未命名.gif)

出0入0汤圆

发表于 2010-8-6 08:53:05 | 显示全部楼层
MPLAB IDE v8.53  最新版的是什么编译器;
是不是也是9.70

出0入0汤圆

发表于 2010-8-6 09:24:05 | 显示全部楼层
void main(void)
{
unsigned int a,b;
a=258;
a=a-256;
b=a>>1;
while(b);
}
改为这样就可以

出0入0汤圆

 楼主| 发表于 2010-8-6 09:24:33 | 显示全部楼层
回复【11楼】micropower 流浪的飘云
-----------------------------------------------------------------------

呵呵,我预期的效果是认为 clrf 0x3 它应该清掉C(现在看来它的目的不是这样,可能只是切换BANK而已), 因为后面没做可以改变C标记的操作就直接进行 BTFSS 0X3,0 了这条指令,那你认为它是判断谁的借位呢?
所以我得出的结论是for PIC10/12/16 MCUs (PRO Mode)V9.70(和谐版)不妥(感觉有点太聪明了), 其实45天版得出的也是这个结果,如果不优化太高等级就不会出错

出0入0汤圆

发表于 2010-9-14 13:03:36 | 显示全部楼层
我一直用picc9.50p12 和 IAR的EWPICv2.31, 几年下来一直都挺好,没有发现问题,这之前的PICC版本发现过一些问题包括picc8.05

出0入0汤圆

发表于 2010-9-14 13:09:55 | 显示全部楼层
不是吧,如果真是这样,这BUG真是太过分了。

出0入0汤圆

发表于 2010-9-14 13:18:51 | 显示全部楼层
用汇编的飘过,当初学PIC没用C真是明知之举。

出0入0汤圆

发表于 2010-9-14 14:44:16 | 显示全部楼层
V9.70和_谐或45天试用的编译出来就不能用,但重装选择Lite就编译出来能用的但程序很大
现在看了这个帖子下载了V9.71a发现选择Lite编译出来都不能用了,还好试了下45天试用版倒好用了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-20 06:24

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

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