这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ADS ADS优化的一个趣味.

共2条 1/1 1 跳转至

ADS ADS优化的一个趣味.

院士
2006-09-17 18:14:16     打赏
ADS ADS优化的一个趣味.



关键词: 优化     一个     趣味    

院士
2006-12-22 22:43:00     打赏
2楼
问 C++程序,unsigned long X=0x1020;
ADS,Thrumb模式下,是这样编译的:mov r1,#0x81 ,lsl r1,r1,#5 ,机器码是:2181,0149,共4个字节,如果将值改为 0x1021,则直接取值了,反倒只有2字节机器码.我的优化设置是 for space
为何0x1020就不能直接取值呢?
1: ARM指令对立即数的编码是有规则的 2: 添加一些趣味关于联合的使用
typedef union _un_l2cval {
    u_long    lVal;
    u_char    cVal[4];
}un_l2cval;
keil和IAR中lVal的改变cVal也改变
ADS中好像不是这么回事
上次移植一个程序的时候改变了lval,cval变化不是我想象的那种,没办法,单独计算lval,赋值cval
大家可以测试一下,可能我自己搞错了, 3: ADS我对其编译机制了解不深只是当作一种编译工具凑合用,大家有体会的多说说
对keil一直印象不好,franklin的内核吧,主要是以前做51的时候感觉实在太差
打个比方,做一个稍微大点的51程序,比如60K左右的,编译出来的问题就多了,主要是其寄存器分配的机制不好,大大增加了开发时间,一个60k的51程序,用keil得花一个月,IAR可能就是一个礼拜,KeilARM没用过,还是喜欢IAR多点 4: to chARMerf长的丑,不是你的错
但老跑出来吓人,就是你不对了 5: to chARMerf水平差,不是你的错
但埋怨keil,就是你不对了
6: 恩,chinasunfa对一半错一半1:俺长的蛮俊的,是俺们那山圪塔里面最俊的一个
2:俺水平是不高,要学的很多,最近也在深思这个问题,可能是这些年忙着技术换银子,重视解决问题而忽略了问题的来源,忽略了基础理论,太浮躁了,继续改进吧, 7: chARMerf 的这个联合是不会有问题的,肯定是你搞错了我用了很多这样的联合没有问题的. 8: chang_hs请看wr_ptr.cVal[0] =*(volatile uint16  *)(TCP_ADDR|((I2CHIP_BASE + RX_PTR_BASE + RX_PTR_SIZE * s)<<1));
wr_ptr.cVal[1] =*(volatile uint16  *)(TCP_ADDR|((I2CHIP_BASE + RX_PTR_BASE + RX_PTR_SIZE * s+1)<<1));
wr_ptr.cVal[2] =*(volatile uint16  *)(TCP_ADDR|((I2CHIP_BASE + RX_PTR_BASE + RX_PTR_SIZE * s+2)<<1));
wr_ptr.cVal[3] =*(volatile uint16  *)(TCP_ADDR|((I2CHIP_BASE + RX_PTR_BASE + RX_PTR_SIZE * s+3)<<1));

    //wr_ptr.cVal[1] = *(RX_WR_PTR(s) + 1*2);
    //wr_ptr.cVal[2] = *(RX_WR_PTR(s) + 2*2);
    //wr_ptr.cVal[3] = *(RX_WR_PTR(s) + 3*2);
-----》在此处时wr_ptr.lVal是否已经变化,实际上不是,
俺就干脆算了赋值解决
wr_ptr.lVal=wr_ptr.cVal[3]+wr_ptr.cVal[2]*0x100+wr_ptr.cVal[1]*0x10000+wr_ptr.cVal[0]*0x1000000;
--------注:
typedef union  _un_l2cval {
    uint32    lVal;
    uint8    cVal[4];
}un_l2cval;
9: 以上代码是在ADS中编写当时非常纳闷,时间急,所以自己计算算了,我也认为一个C编译器不至于在联合都处理不好,问题还是出在自己身上可能性大,chang_hs有空看一下这个代码过程,先谢谢哈, 10: 同样的问题read_data(s, recv_ptr, buf, len);    // Copy TCP receibed data

    rd_ptr.lVal =rd_ptr.lVal+ len;
    ptr=rd_ptr.lVal;
    rd_ptr.cVal[0]=   ptr/0x1000000;
    ptr=ptr%0x1000000;
    rd_ptr.cVal[1]=   ptr/0x10000;
    ptr=ptr%0x10000;
    rd_ptr.cVal[2]=   ptr/0x100;
    ptr=ptr%0x100;
    rd_ptr.cVal[3]=ptr;
//     PrintF_Information(rd_ptr.cVal[0]);
//     PrintF_Information(rd_ptr.cVal[1]);
//     PrintF_Information(rd_ptr.cVal[2]);
//     PrintF_Information(rd_ptr.cVal[3]);
-----------此处在未计算的时候将cval变量传到串口检测过,不对,所以还是计算获取
----可能我使用上犯了幼稚错误,chang_hs若有时间,请予以指出,非常感谢 11: 是不是优化的问题,因为ADS很多变量是存储在寄存器里面的你的程序里面是不是有报警?从上面的代码看应该不会有问题,但估计你的程序里面还有其他致命的错误,否则不会这样的,还有ADS的启动代码也不知道你用对了没有 12: KEIL不错啊。用的不好,不能埋怨工具。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]