有人能告诉我ATmega8(或类似的8位proc。)如何实现数学运算,如寄存器逻辑上的减法,加法,除法,乘法?
我在哪里可以了解此操作的速度? (我知道除法和浮点运算很慢但是需要多少时间(多少微秒)?
答案 0 :(得分:1)
website或manual中包含每个汇编指令的周期数。但这些只对字节进行操作并进行整数运算。
各种C类型的实际数学指令在AVR Libc中编码为汇编指令,您可以下载和检查。当avr-gcc编译器遇到某些操作时,无论是整数还是浮点,编译器都会插入这些函数。您需要自己为所有机器指令添加循环。
答案 1 :(得分:0)
如果我的内存很好用 ATMega8 没有 FPU 所以所有浮动操作都是在8位或16位整数上编码的,所以即使是简单的操作也会占用一些说明而不是单一的。例如,添加a,b
:
提取add
的指数和尾数
这涉及很少的复制和转移/掩码操作
将一个尾数移到公共指数
少数轮班掩码操作
添加mantissas
一个adc
,几次sin,cos,sqrt,...
正确的结果指数
分支和少量转移/掩码操作
编码结果
这涉及很少的复制和转移/掩码操作
正如您所看到的,您有很多简单添加的说明。浮动值的位宽越大,所需的指令就越多。因此花车的速度要慢很多倍......
现在想象像for(SurveyProperty S_P : survey.getsurveypropertylist){
S_P.setSurvey(survey);
}
这样的东西都涉及到一些n次多项式或二分搜索等的近似,其中一些是在浮点值上完成的,速度下降得更多。