小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

針對(duì)小容量單片機(jī)程序優(yōu)化方式--乘除法篇

 西北望msm66g9f 2018-05-30

目前單片機(jī)的市場(chǎng)競(jìng)爭(zhēng)很激烈,許多應(yīng)用出于性價(jià)比的考慮,選擇使用程序存儲(chǔ)空間較?。ㄈ?K,2K)的小資源8位MCU芯片進(jìn)行開發(fā)。一般情況下,這類MCU沒有硬件乘法、除法指令,在程序必須使用乘除法運(yùn)算時(shí),如果單純依靠編譯器調(diào)用內(nèi)部函數(shù)庫(kù)來實(shí)現(xiàn),常常會(huì)有代碼量偏大、執(zhí)行效率偏低的缺點(diǎn)。


上海晟矽微電子推出的MC30、MC32系列MCU,采用了RISC架構(gòu),在小資源8位MCU領(lǐng)域有廣大的用戶群和廣泛的應(yīng)用,本文就以晟矽微電的這兩個(gè)系列產(chǎn)品的指令集為例,結(jié)合匯編與C編譯平臺(tái),給大家介紹一種即省時(shí)又節(jié)約資源的乘除法算法。

 

乘法篇

單片機(jī)中的乘法是二進(jìn)制的乘法,也就是把乘數(shù)的各個(gè)位與被乘數(shù)相乘,然后再相加得出,因?yàn)槌藬?shù)和被乘數(shù)都是二進(jìn)制,所以實(shí)際編程時(shí)每一步的乘法可以用移位實(shí)現(xiàn)。

 

例如:乘數(shù)R3=01101101,被乘數(shù)R4=11000101,乘積R1R0。步驟如下

1、清空乘積R1R0;

2、乘數(shù)的第0位是1,那被乘數(shù)R4需要乘上二進(jìn)制數(shù)1,也就是左移0位,加到R1R0里;

3、乘數(shù)的第1位是0,忽略;

4、乘數(shù)的第2位是1,那被乘數(shù)R4需要乘上二進(jìn)制數(shù)100,也就是左移2位,加到R1R0里;

5、乘數(shù)的第3位是1,那被乘數(shù)R4需要乘上二進(jìn)制數(shù)1000,也就是左移3位,加到R1R0里;

6、乘數(shù)的第4位是0,忽略;

7、乘數(shù)的第5位是1,那被乘數(shù)R4需要乘上二進(jìn)制數(shù)100000,也就是左移5位,加到R1R0里;

8、乘數(shù)的第6位是1,那被乘數(shù)R4需要乘上二進(jìn)制數(shù)1000000,也就是左移6位,加到R1R0里;

9、乘數(shù)的第7位是0,忽略;

10、這時(shí)候R1R0里的值就是最后的乘積,至此算法完成。

以上例子運(yùn)算結(jié)果:

R1R0 = R3 * R4= (R4<><><><2)+r4 =="">

實(shí)際運(yùn)算流程圖見圖1.1。


圖1.1  匯編乘法運(yùn)算流程圖


在實(shí)際的程序設(shè)計(jì)過程中,程序優(yōu)化有兩個(gè)目標(biāo),提高程序運(yùn)行效率,和減少代碼量。我們來看下本文提供的匯編算法和普通C語言編程的效率和代碼量對(duì)比。


表1.1是程序運(yùn)行效率的對(duì)比數(shù)據(jù)(可能會(huì)有小的偏差),很明顯匯編編譯出來的運(yùn)行時(shí)間要比C語言減少很多。



匯編(時(shí)鐘周期)
C語言(時(shí)鐘周期)
8*8位乘法
79-87
184-190
16*8位乘法
201-210
362-388
16*16位乘法
234-379
396-468

表1.1  乘法運(yùn)算時(shí)鐘周期對(duì)比表


表1.2是程序代碼量的對(duì)比數(shù)據(jù)(可能會(huì)有小的偏差),匯編占用的程序空間也要比C語言小很多。



匯編(Byte)
C語言(Byte)
8*8位乘法
15
34
16*8位乘法
19
96
16*16位乘法
31
96

表1.2  乘法運(yùn)算ROM空間使用情況對(duì)比表


綜上兩點(diǎn),本文介紹的乘法算法各方面使用情況都要比C編譯好很多。如果大家在使用過程中,原有的程序不能滿足應(yīng)用需求,例如遇到程序空間不夠或者運(yùn)行時(shí)間太久等問題,都可以按照以上方式進(jìn)行優(yōu)化。

匯編語言最接近機(jī)器語言的。在匯編語言中可以直接操作寄存器,調(diào)整指令執(zhí)行順序。由于匯編語言直接面對(duì)硬件平臺(tái),而不同的硬件平臺(tái)的指令集及指令周期均有較大差異,這樣會(huì)對(duì)程序的移植和維護(hù)造成一定的不便,所以我們針對(duì)精簡(jiǎn)指令集做了乘法運(yùn)算的例程,便于大家的移植和理解。



除法篇

單片機(jī)中的除法也是二進(jìn)制的除法,和現(xiàn)實(shí)中數(shù)學(xué)的除法類似,是從被除數(shù)的高位開始,按位對(duì)除數(shù)進(jìn)行相處取余的運(yùn)算,得出的余數(shù)再和之后的被除數(shù)一起再進(jìn)行新的相除取余的運(yùn)算,直到除不盡為止,因?yàn)閱纹瑱C(jī)中的除法是二進(jìn)制的,每個(gè)步驟除出來的商最大只有1,所以我們實(shí)際編程時(shí)可以把每一步的除法看作減法運(yùn)算。

 

例如:被除數(shù)R3R4=1100110001101101,除數(shù)R5=11000101,商R1R0,余數(shù)R2。步驟如下

1、清空商R1R0,余數(shù)R2;

2、被除數(shù)放開最高位,第15位,為1,1比除數(shù)小,商為0,余數(shù)R2為1;

3、上一步余數(shù)并上被除數(shù)次高位,第14位,得11,11仍然比除數(shù)小,商為0,余數(shù)R2為11

4、直到放開第8位后,得11001100,比除數(shù)大,商得1,余數(shù)R2為111;

5、上一步余數(shù)并上被除數(shù)第7位,得1110,沒有除數(shù)大,商為0,余數(shù)R2為1110;

6、上一步余數(shù)并上被除數(shù)第6位,得11101,沒有除數(shù)大,商為0,余數(shù)R2為11101;

7、按照以上步驟,直到放開了被除數(shù)得第3位,得11101101,比除數(shù)大,商為1,余數(shù)R2為101000;

8、上一步余數(shù)并上被除數(shù)第2位,得1010001,沒有除數(shù)大,商為0,余數(shù)R2為1010001;

9、上一步余數(shù)并上被除數(shù)第1位,得10100010,沒有除數(shù)大,商為0,余數(shù)R2為10100010;

10、上一步余數(shù)并上被除數(shù)第0位,得101000101,比除數(shù)大,商為1,余數(shù)R2為10000000;

11、然后把以上所有步驟中得商從左至右依次排列就是最后的商100001001,余數(shù)為最后算得的余數(shù)10000000。

以上例子運(yùn)算結(jié)果   R1R0 = R3R4 / R5 = 100001001

                 R2 = R3R4 % R5 = 10000000

實(shí)際運(yùn)算流程圖見圖2.1。


圖2.1  匯編除法運(yùn)算流程圖

 

除法運(yùn)算的效率,代碼量見以下表格


表1.1是程序運(yùn)行效率和代碼量的對(duì)比數(shù)據(jù)(可能會(huì)有小的偏差),很明顯本文提供的匯編算法要優(yōu)化的很多。


16/8位除法
匯編
C語言
時(shí)鐘周期
287-321
740-804
使用空間(Byte)
35
142

表2.1  除法運(yùn)算時(shí)鐘周期對(duì)比表


所以對(duì)于除法運(yùn)算,本文提供的方法也是相對(duì)較優(yōu)的。


以下是針對(duì)精簡(jiǎn)指令集做的除法運(yùn)算,16/8位的例程,便于大家的移植和理解。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多