打印

说说PIC HI-TECH C编译器的烂。

[复制链接]
9378|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hjh002|  楼主 | 2007-6-12 16:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用PIC的C和HT的C编译器都有几年了,以前听别人说HT的C编译器很烂,但是我用了这么久,也没见有什么问题。但是PIC的,用起来问题多多,总结起来有几点:
1、RAM不会自动分配页面,必须指定在哪个BANK,不然全部定义在BANK0。
2、没有指定地址的某些变量会有冲突现象,表现为运行时会产生不明原因的错误,但把某些变量指定地址或者弃掉重新定义后问题消失。
3、程序复杂一点时,会有BANK分页的错误,表现为某变量本来定义在BANK3,但运行时当操作此变量时,并没有转到BANK3操作。
4、一个子程序的程序量不能太大,大约是不能超过2000行(具体不是很清楚,2000行包括程序空行,注解,括弧等。)否则无法编译。

  上面第2和第3点常常会搞得人几乎发疯,因为你怎么找都找不到程序上的错误,但是运行起来却象见鬼一样出错。以上个人看法,欢迎拍砖。
   
沙发
hjh002|  楼主 | 2007-6-12 16:54 | 只看该作者

不知道是不是因为D版的原因?呵呵!!

使用特权

评论回复
板凳
soso| | 2007-6-13 07:17 | 只看该作者

PICC就是效率高点

   确实有你说的现象。你不指定的BANK都给你链接在Bank0.不支持代码链接的重定位,文件或者代码太长就麻烦了。

使用特权

评论回复
地板
hjh002|  楼主 | 2007-6-13 08:28 | 只看该作者

第4条其实不是编译器的错。

PIC单片机对子程序要求是必须放在页面开始的256字节内,如果一个子程序编译后超过256字节,就会出现问题。

使用特权

评论回复
5
xiong01| | 2007-6-14 17:56 | 只看该作者

你用是PICC16吧

一个子程序的程序量不能太大,不能大于2K否则就编译不过,可能和单片机结构有关,1BANK就2K。PICC18没有这方面的问题

使用特权

评论回复
6
yewuyi| | 2007-6-15 12:44 | 只看该作者

都说的些什么?

1、RAM不会自动分配页面,必须指定在哪个BANK,不然全部定义在BANK0。
能自动分配当然最好,多敲几个字母也不会死人。
2、没有指定地址的某些变量会有冲突现象,表现为运行时会产生不明原因的错误,但把某些变量指定地址或者弃掉重新定义后问题消失。
这问题还是从自己的程序找找原因把;
3、程序复杂一点时,会有BANK分页的错误,表现为某变量本来定义在BANK3,但运行时当操作此变量时,并没有转到BANK3操作。
这问题还是建议从自己的程序找找原因把;
2/3两条如果确定是PICC的问题,你可以联系MICROCHIP的工程师要求确认。
4、一个子程序的程序量不能太大,大约是不能超过2000行(具体不是很清楚,2000行包括程序空行,注解,括弧等。)否则无法编译。
我记得是代码量不能超过2K,不包括非代码行的把!你确定连注解都包括?
俺还真没写过2K的子程序。


eeproom 发表于 2007-6-13 07:17 PIC 单片机 ←返回版面    

3楼: PICC就是效率高点 

   确实有你说的现象。你不指定的BANK都给你链接在Bank0.不支持代码链接的重定位,文件或者代码太长就麻烦了。
  ::俺没用过可重定位,但记得PICC好象是支持可重定位的!

 hjh002 发表于 2007-6-13 08:28 PIC 单片机 ←返回版面    

4楼: 第4条其实不是编译器的错。 

PIC单片机对子程序要求是必须放在页面开始的256字节内,如果一个子程序编译后超过256字节,就会出现问题。

前256字节的说法是类如16C57C这样的早期型号,后来的型号基本上没听说是这样。


你可能用HOLTEK的东西多一些,说实话,俺还没感觉到别的哪个MCU的C可以象PICC这样快速上手,不是俺小视HOLTEK,HOLTEK的东西和PIC的东西完全不是一个档次,呵呵,俺也是有用HOLTEK的拉

使用特权

评论回复
7
hjh002|  楼主 | 2007-6-15 17:29 | 只看该作者

回yewuyi

我这里说的是PIC的HI-TECH C编译器,至于说快速上手和档次,不是我这个贴的讨论范围。上面说的问题确实是那个C编译器出现的问题,不知道其他用过这个编译器的人是不是也遇到过。

使用特权

评论回复
8
yewuyi| | 2007-6-15 17:47 | 只看该作者

呵呵,我也说的是PIC的HI-TECH C编译器……

1:没办法了,他就那样,俺们只能忍耐,但这不是什么致命问题,自己耐心一点了
2:你的2/3条可能是你程序原因的可能性更大一点,俺反正没碰到你说的问题,也没听说别人怎么说到这两个问题
3:子程序的地址限制只有早期的产品才有,而且通过跳转的方式也是可以扩展到全地址放置的拉,后期的产品这样的限制已经很少了,用C的话,你更加不用考虑这些问题拉,函数不能超过2K的限制是确定的,但一般也没必要写那么大的函数把?即使非要写那么大,也不是没有办法解决的。

使用特权

评论回复
9
tdh03z| | 2007-6-15 20:11 | 只看该作者

第2,3条确实遇到过

特别是第3条,好像还遇到过几次,郁闷。
呵呵,但还是支持PICC

使用特权

评论回复
10
yewuyi| | 2007-6-16 08:19 | 只看该作者

既然如此,那么请问

2、没有指定地址的某些变量会有冲突现象,表现为运行时会产生不明原因的错误,但把某些变量指定地址或者弃掉重新定义后问题消失。


::是哪些变量会出现你说的问题,可能的话,不妨把程序帖上来让大家看看


3、程序复杂一点时,会有BANK分页的错误,表现为某变量本来定义在BANK3,但运行时当操作此变量时,并没有转到BANK3操作。


请详细说明

使用特权

评论回复
11
电子尘埃| | 2007-6-18 08:52 | 只看该作者

我是菜鸟搞不灵清,我记得好几次都遇上过第3条.

我是菜鸟搞不灵清,我记得好几次都遇上过第3条.尽然改改编译选项就正常了,郁闷.

使用特权

评论回复
12
电子尘埃| | 2007-6-18 08:53 | 只看该作者

但是除了PICC的,还有其它更好的吗?

我以前都是用8.50**版,

使用特权

评论回复
13
hjh002|  楼主 | 2007-6-18 10:47 | 只看该作者

第三条的错误现象图解

使用特权

评论回复
14
hjh002|  楼主 | 2007-6-18 11:03 | 只看该作者

定义

从这个图片可以看到,按键“key_l”定义为RD1,但是大家看上面的运行时的图片,当检测这个按键时,状态寄存器STATUS还在BANK3,其实此时按的是按键“key_s”

使用特权

评论回复
15
yewuyi| | 2007-6-18 12:30 | 只看该作者

TO hjh002

请仔细分析你自己的程序把……

哎,把按键程序写成这样,也真是惨不忍睹了……

使用特权

评论回复
16
hjh002|  楼主 | 2007-6-18 13:35 | 只看该作者

那你说说我的程序哪里有错误。

只要把“set_menu()”子程序的调用换个位置,你说这是什么问题?

使用特权

评论回复
17
hjh002|  楼主 | 2007-6-18 13:39 | 只看该作者

只要把“set_menu()”子程序的调用换个位置问题消失!

像这样:
// 按键操作
//--------------------
void     key_operate(void)
{
    if (!key_s )
    {
        delay_key++;
        if (delay_key>=220 && !key_s_down)
        {
            key_s_down=1;
        }
    }
        
    if (!key_l)    // [<] 键
    {
        delay_key++;
        if (delay_key>=220)
            key_l_down=1;
    }
        
    if (!key_r)    // [>] 键
    {
        delay_key++;
        if (delay_key>=220)
            key_r_down=1;
    }
    
    set_menu();
    
    if (key_s && key_l && key_r)    //三键同时松开
    {
        delay_key=0;
        key_ever = 0;
                
        key_s_down=0;
        key_l_down=0;
        key_r_down=0;
    }
}

使用特权

评论回复
18
hjh002|  楼主 | 2007-6-18 13:53 | 只看该作者

这是更详细的汇编代码图

上面清晰的显示,在读IO口的时候竟然还在BANK3。

使用特权

评论回复
19
yewuyi| | 2007-6-18 15:34 | 只看该作者

自己耐心一点查把

靠别人不如靠自己,你的这个问题基本上不可能是PICC的问题,还是自己多开动脑筋把,我是不可能花费大把时间去看你这程序的拉,你不妨联系你的代理商的FAE帮助你解决这个问题.

针对你帖出的部分程序,俺对你的程序提出几点建议:
1:一般不要直接操作IO口,尽量使用缓冲RAM,这是提高程序健壮性必不可少的方法,推而广之,对MCU的很硬件资源都应该使用缓冲积存器的方法操作,好处请慢慢体会把。
2:你那个按键程序实在是惨不忍睹,呵呵,好好思考一下如何解决?
3:你的程序中是否开了中断,请问在按键操作时如果发生了中断,并且运行到了断点会出什么事情?
4:很多人使用PIC,经常说遇到好多想不清楚的怪事情,在分析不清楚的时候,往往归结到编译器不好,仿真软件不好,芯片不好等等几大问题上,但绝多数都是自己写程序时候中断/MCU硬件特性/分析问题的方法不当等等造成的,这些问题,靠别人是没有用的,斑竹不是没事情做,天天在这救死扶伤的,其实,俺最近忙的要命,都是抽空上来转一圈……

使用特权

评论回复
20
hjh002|  楼主 | 2007-6-18 16:39 | 只看该作者

我并不是让你帮我看程序

就是想告诉你,这个编译器会出问题。
你说我那个按键惨不忍睹,呵呵,我这样处理是本着简单有效的原则,我不知道你说的惨不忍睹在哪里,请直接指出来好了。我的程序是开了定时中断的,请问在按键操作时如果发生了中断,并且运行到了断点会出什么事情?没有不该发生的事情发生。

使用特权

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

本版积分规则

13

主题

120

帖子

0

粉丝