发新帖我要提问
12
返回列表
打印

请教 C51 如何才能接近A51

[复制链接]
楼主: Periodic
手机看帖
扫描二维码
随时随地手机跟帖
21
刘前辈| | 2012-2-25 15:51 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 刘前辈 于 2012-2-25 15:52 编辑

任何芯片的C编译器都有把直接寻址和间接寻址独立看待,并不是说只有指针间接寻址才能移植;若论效率,直接寻址方式最高,最能接近汇编语言。——除非是数组等构造类型访问。



、、

使用特权

评论回复
22
highgear| | 2012-2-26 10:23 | 只看该作者
刘公公又在胡说了,不懂就不要装懂。多用几种编译器,几种cpu 就会明白楼主的问题绝对是 keil c 的优化问题。论代码的优化,keil c 比起 TI, AD 等大厂商的编译器来说效率差得太远,看那些编译出的代码,手工汇编也不过如此了。

使用特权

评论回复
23
highgear| | 2012-2-26 10:43 | 只看该作者
举个例子,就是刘公公最得意的那个 结构复制:
#define N 1
struct A { char x[N]; } a, b;  
a = b;

这么简单的一个东西, keil c 居然用了一大堆代码。而 visual C++, TI code composer, AD Visual DSP++的编译器都产生非常精简的代码。把 N 改为不同的值,后三种编译器都产生了极其精简的代码,而且是最精简的代码。直接地址这种问题在visual C++, TI code composer, AD Visual DSP++根本就不是问题。

使用特权

评论回复
24
Periodic|  楼主 | 2012-2-26 13:41 | 只看该作者
又来了一位  大牛  :handshake

data unsigned char   Tab_1[8]  _at_ 0x0A;

还有一个问题 如何固定 数组的 开始地址啊?

*** WARNING L4: DATA SPACE MEMORY OVERLAP
    FROM:    000AH
    TO:      0011H
*** WARNING L4: DATA SPACE MEMORY OVERLAP
    FROM:    000BH
    TO:      0011H
*** WARNING L4: DATA SPACE MEMORY OVERLAP
    FROM:    000CH
    TO:      0011H
*** WARNING L4: DATA SPACE MEMORY OVERLAP
    FROM:    000DH
    TO:      0011H
*** WARNING L4: DATA SPACE MEMORY OVERLAP
    FROM:    000EH
    TO:      0011H
*** WARNING L4: DATA SPACE MEMORY OVERLAP
    FROM:    000FH
    TO:      0011H
Program Size: data=25.0 xdata=0 code=48
- 0 Error(s), 6 Warning(s).

使用特权

评论回复
25
Periodic|  楼主 | 2012-2-26 13:44 | 只看该作者
本帖最后由 Periodic 于 2012-2-26 14:09 编辑

unsigned char   Tab_1[8] ;
data  unsigned char   D_08H    _at_ 0x08;
#define pD_08H              ((volatile unsigned char *)0x08)


    49:     *pD_08H=Tab_1[D_09H];
C:0x0015    7410     MOV      A,#Tab_1(0x10)
C:0x0017    2509     ADD      A,D_09H(0x09)
C:0x0019    F8       MOV      R0,A
C:0x001A    E6       MOV      A,@R0
C:0x001B    7808     MOV      R0,#D_08H(0x08)
C:0x001D    F6       MOV      @R0,A

使用特权

评论回复
26
Periodic|  楼主 | 2012-2-26 14:09 | 只看该作者
MOV                08H,#0BH                ;//地址#0BH
        MOV                A,#0AH                        
        ADD                A,09H                        
        MOV                R0,A                        
        MOV                A,@R0                        
        MOV                R0,08H                       
        MOVX                        @R0,A                                    ;0BH=#0AH+09H

使用特权

评论回复
27
Periodic|  楼主 | 2012-2-26 14:12 | 只看该作者
unsigned char   Tab_1[8] ;
                #define pD_08H              ((volatile unsigned char *)0x08)       

        D_08H=0x0B;  //R1_0
                *pD_08H=Tab_1[D_09H];

使用特权

评论回复
28
Periodic|  楼主 | 2012-2-26 14:16 | 只看该作者
本帖最后由 Periodic 于 2012-2-26 14:18 编辑

我想用C还原   26楼的 汇编  请问刘前辈  如何解决红色 部分的 问题啊


我分析的是 把一个数组 送到 外部数据地址  地址#0BH   其实是P0口  用这种方法写P0口

还有如何固定 数组的 固定地址  0X0AH      (MOV                A,#0AH    )

使用特权

评论回复
29
highgear| | 2012-2-27 00:17 | 只看该作者
楼上的老兄,如果你想使用直接地址,建议你用汇编;如果使用 c ,若没有特殊的情况,那么就忘了自己操作直接地址吧,那不仅没有多少意义,而且有害。

使用特权

评论回复
30
highgear| | 2012-2-27 00:32 | 只看该作者
再来说说直接地址。
直接寻址方式并不是永远最高,这与 cpu 密切相关。拿 51 去推测其他 cpu 会得出错误的结论,如同那 keil c 下的 int 去推论所有 compiler 的 int 都是  16-bit 一样。 例如 AD blackfin 虽然是 16 bit cpu, 但数据空间是 32-bit, 即直接地址是 32 bit. 此时,主楼那种通过 inc 来间接寻址反而效率更高,因为指令更短。

使用特权

评论回复
31
ayb_ice| | 2012-2-27 08:36 | 只看该作者
LZ还是在程序结构上优化下工夫吧,这种优化简单,C不行的话,用汇编代替也太容易了
LZ的测试程序主要是连续的直接寻址,KEIL聪明,自动转化为间接寻址了,在执行周期,代码长度不变的情况下,优化了中断延时,是明智的,但可能与LZ的期望不同

使用特权

评论回复
32
Cortex-M0| | 2012-2-27 18:06 | 只看该作者
LZ想在C51中得到和心目中一模一样的汇编结果,最简单的方法就是在C51中嵌入A51汇编,结果永远等于你的期待值~~~  :lol

使用特权

评论回复
33
刘前辈| | 2012-2-28 12:36 | 只看该作者
本帖最后由 刘前辈 于 2012-2-28 16:37 编辑
#22 highgear
…… 论代码的优化,keil c 比起 TI, AD 等大厂商的编译器来说效率差得太远,看那些编译出的代码,手工汇编也不过如此了。
****************************************************************
…………
举个例子,就是刘公公最得意的那个 结构复制:
#define N 1
struct A { char x[N]; } a, b;  
a = b;

这么简单的一个东西, keil c 居然用了一大堆代码。而 visual C++, TI code composer, AD Visual DSP++的编译器都产生非常精简的代码。


所长老爷子比较有意思:TI, AD 等大厂商的编译器是8位CPU的吗?是8051的吗?能用于8051  C语言吗?不搭界的事扯个什么劲?我用86汇编,结构拷贝使用一条串传输语句就完成了,比你TI,AD 等大厂商的编译器效率高多啦。比较起来,你那TI,AD 编译器根本就是老牛破车啊。

这种比较,有意思么? “比较是在对等的平台上进行的。”老所长最好去从事幼儿教育工作,在幼儿的智力平台上,心理上可以多有成就感。那时您再也不用和这个那个比较了。绝对是“天下第一”的老爷子。
   
    再仔细看看 a = b;  结构拷贝KEIL C51到底用了多少代码,一大堆?别逗了,我数了一下,不到20字节!——拷贝255 / 65535 字节都差不多20字节。

      哈哈……,玩了一辈子软件,不知道什么叫通用库函数?然后把KEIL C51 大贬一通,显得自己比德国人 Keil 高明;结果又留下一堆笑柄。

         嘻嘻……好好数数,看看究竟是德国人高明,还是中国的老爷子不懂装懂。


、、

使用特权

评论回复
34
highgear| | 2012-2-28 22:16 | 只看该作者
刘公公啊, 一个字节的结构复制所使用的 20 个字节只是调用前的准备工作,没有包括调用 memcpy 的一堆代码。简单的一个字节的复制,你哭天抢地的要用结构复制来做,以证明自己“第一”,“填补空白”, 如果这不是keil c 的优化问题,那么一定就是你刘公公的脑袋问题。

使用特权

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

本版积分规则