共2条
1/1 1 跳转至页
问
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不错啊。用的不好,不能埋怨工具。
在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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |