完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
参考CORTEX-M0的ARM指令手册,有一个指令可能性MulsR0,R1,R0。
我不知道它是否有签名/无符号操作。 我尝试将符号char与常数相乘,比如(SigndIdchar * 40000和i总是错误的值)。 我尝试了(It32)SigndIdChar * 40000,这也给出了错误的值。 我发现,无论C公式(It32)还是(UIT32),编译器将其翻译为拇指指令MUL R0,R1。 谢谢 以上来自于百度翻译 以下为原文 ARM instruction manual referring Cortex-M0 says there is a single instruction possibility muls R0,R1,R0 I can't figure out if it's signed/unsigned operation. I try to multiply signed char with constant , like (signed_char * 40000 and I got always wrong value. I tried (int32)signed_char * 40000 and this also give wrong value I found that regardless of the C formula (int32) or (uint32) the compiler translates it to thumb instruction mul R0,R1 Thanks |
|
相关推荐
9个回答
|
|
这可能是一个编译器问题,你总是可以做内联ASM和
自己处理这个问题。 考虑归档一个案子(并把你发现的内容回帖给论坛) CyPress网站 “支持” “技术支持” “创建一个MyCase'” 问候,Dana。 以上来自于百度翻译 以下为原文 This may be a compiler problem, you could always do inline ASM and handle the issue yourself. Consider filing a CASE (and post back what you found out to bebefit the forum) - www.cypress.com “Support” “Technical Support” “Create a MyCase” Regards, Dana. |
|
|
|
你知道MUL指令的结果吗?签名还是未签名?
以上来自于百度翻译 以下为原文 Do You know about the result of mul instruction? Signed or unsigned? |
|
|
|
根据HTTP://FioCurn.Af.COM/Help/TopIC/COM.ARM.DOC.DUI0497 A/BabCFBDJ.HTML,Muls与带符号和无符号操作数一起工作。
根据HTTP//FICONTUR.ARM.COM/Help/TopIC/COM.ARM.DOC.DII0204F/CIHIHGJ.HTML,这也适用于MUL。(Mull和Muls只在如何更新标志)上有所不同。 我不确定在“(It32)SigndIdChar * 40000”中是否是结果或第一个操作数。如果是前者,则比乘法做签名(因为你有符号char)然后铸造。这可能导致错误的值(取决于字符中的内容)。 你能发布一个小例子,你得到错误的结果吗? 以上来自于百度翻译 以下为原文 According to http://infocenter.arm.com/help/topic/com.arm.doc.dui0497a/BABCFBDJ.html , muls works with signed and unsigned operands. According to http://infocenter.arm.com/help/topic/com.arm.doc.dui0204f/Cihihggj.html , this is true also for mul. (mul and muls differ only in how flags are updated). I'm not sure whether the cast in '(int32)signed_char * 40000' is for the result or the first operand. If its the former, than the multiplication is done signed (because you have a signed char) and then casted. This might result in wrong values (depending on what you have in the char). Can you post a small example where you get wrong results? |
|
|
|
函数在C中:空隙MOVALVE(It8%){ iT32 TMP;TMP=pDATACONFIG & GT SeroCurrRunTPWM((IT32))(%×(SelooMin MyOpenO*(1和lt;26)/ 100)& gt;& gt;26);
{SooLoMi-MixOp-常数 ServoMi-MyOpOpen*(1和lt;lt;26)/ 100=1006632960=0x3c00(6零)pDATAcCONFIG & & Service CurrrPrimeX-UTI16 为什么这个函数产生以下代码:LDR R1,L65 505 084B LDR R3,L65 + 4 4 506 0006,4843 MUL R0,R1 507。LVL49:508 0008 1B68 LDR R3,[R3] 509 000 08016 8016 ASR R0,R0,26 26 26 00C 9A8B LDRH R2,[R3,αi ],000 0E 111A子R1,R2,R0 我的百分比值是-100。程序集乘以(126×常数)并返回正输出。 以上来自于百度翻译 以下为原文 function in C: void MoveValve(int8 percent){ int32 tmp; tmp = pDataConfig->SerVoCurrentPWM - ((int32)(percent*(SERVO_MIN_OPEN*(1<<26)/100)) >> 26); } SERVO_MIN_OPEN - constant SERVO_MIN_OPEN*(1<<26)/100 = 1006632960 = 0x3C000000 (6 zero's) pDataConfig->SerVoCurrentPWM - uint16 why this function produce following code: ldr r1, .L65 505 0004 084B ldr r3, .L65+4 506 0006 4843 mul r0, r1 507 .LVL49: 508 0008 1B68 ldr r3, [r3] 509 000a 8016 asr r0, r0, #26 510 000c 9A8B ldrh r2, [r3, #28] 511 000e 111A sub r1, r2, r0 I pass percent value of -100 . assembly multiplies (126 * constant) and returns positive output. |
|
|
|
另一个问题:
1500*(1和lt;lt;26)/ 100=15 *(1和lt;26)=0x3c00 编译程序制作0x011EB851 以上来自于百度翻译 以下为原文 Another problem: 1500*(1<<26)/100= 15*(1<<26)=0x3C000000 compiler makes 0x011EB851 |
|
|
|
移位100或100左26位将超过31位(一个用于标志)你得到中间结果,所以你总是会得到一个错误的结果。使用Windows计算器,将其设置为“程序员模式”,将宽度设置为DWORD并开始计算。注意钻头图案。
如何摆脱这个?第一次尝试可以使用浮点数学。如果你想优化大小和速度,你就必须把你的计算安排成一些语句,并以没有溢出的方式对它们进行分组。 因为我怀疑换档的价值,以提高精度的结果也必须减少。 鲍勃 以上来自于百度翻译 以下为原文 Shifting 100 or -100 left by 26 positions will exceed the 31 bits (one is used for sign) you have got for the intermediate result, so you will ALWAYS get a wrong result. Use the windows calculator, set it to "Programmer's Mode", set the width to DWord and start calculating. Watch the bit patterns. How to get out of this? First try could be to use float math. If you'd lije to optimize size and speed you will have to arrange your calculation into some statements and group them in a way that no overflow may occure. As I suspect the value of shifting to improve the precision of the result must be reduced, too Bob |
|
|
|
|
|
|
|
不久前我发现了一件事。我有一些代码如下
UIT32值; 值=1和lt;lt;24; 价值是错误的。 需要的是 值=(UIT32)1和lt;lt;24; 不确定这是否会与海湾合作委员会现在的问题。 以上来自于百度翻译 以下为原文 One thing I found awhile ago. I had some code as following uint32 value; value = 1<< 24; and the value is wrong. needs to be value = (uint32)1 << 24; Not sure if that can be problem with GCC now. |
|
|
|
还要注意,有符号变量移位的结果是依赖于编译器的。SOIT可能无法返回您期望的值。
以上来自于百度翻译 以下为原文 Also note that the result of shifting of a signed variable is compiler dependent. So it may not return the value you expected. |
|
|
|
只有小组成员才能发言,加入小组>>
754个成员聚集在这个小组
加入小组2111 浏览 1 评论
1858 浏览 1 评论
3673 浏览 1 评论
请问可以直接使用来自FX2LP固件的端点向主机FIFO写入数据吗?
1792 浏览 6 评论
1540 浏览 1 评论
CY8C4025LQI在程序中调用函数,通过示波器观察SCL引脚波形,无法将pin0.4(SCL)下拉是什么原因导致?
578浏览 2评论
CYUSB3065焊接到USB3.0 TYPE-B口的焊接触点就无法使用是什么原因导致的?
431浏览 2评论
CX3连接Camera修改分辨率之后,播放器无法播出camera的画面怎么解决?
441浏览 2评论
391浏览 2评论
使用stm32+cyw43438 wifi驱动whd,WHD驱动固件加载失败的原因?
963浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 20:08 , Processed in 1.572037 second(s), Total 91, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号