………………
bcf STATUS,5 ;page selector point to page 0
bcf STATUS,6
retlw 0
;****************************************************************
ORG 0x7FF ;reset vector
goto main
;****************************************************************
END
上例中將PAGE 1、2、3的前半部優先放置第二階副程式,而且此副程式只由同一PAGE中的第一階副程式所呼叫使用;若其它PAGE也有第一階副程式需用到此第二階副程式,那就把有此需要的第一階副程式搬來同一PAGE吧。如此用心良苦有以下幾個好處:1、第一階副程式可直接call第二階副程式,不用改變PAGE的控制,2、第二階副程式執行結束時只需retlw,也不用改變PAGE的控制,3、PAGE的管理單純,不易出錯,4、整個程式碼可減少bcf SATUS,5、bcf STATUS,6、bsf STATUS,5、bsf STATUS,6的數量;當主程式也有必要直接呼叫此第二階副程式時,可以有兩種做法,第一種做法可以保持程式PAGE管理的一致性,就是為主程式另外設計一個第一階副程式,來間接呼叫這個第二階副程式,這會增加5個(若這個第二階副程式在PAGE 3則需再加2個)指令及其執行時間,第二個做法就是破壞原則,由主程式直接呼叫,但在call指令的前後需加上PAGE控制,這種做法有其缺點,就是當此第二階副程式被移到別的PAGE時,主程式內所有為呼叫該第二階副程式所做之PAGE控制,全需因應修改,而且呼叫的次數愈多,PAGE控制也跟著多,修改起來也更費事且易出錯;兩種做法各有其利弊,何者適用則全由閣下視情況自行判斷選擇了。
程式組譯(assemble)完一定要開啟listing檔(副檔名.lst),看看有無跨PAGE的現象,有的話就要調整該PAGE內一部分的副程式到別的PAGE,同時被搬動過的副程式的"頭"及"尾"也需因應修改,同時要注意的是,是否把相對應的第二階副程式也一齊搬動;另外要看看副程式(第一階或第二階)之進入點,有沒有落於每個PAGE的前半部(即Address的bit 8為0的區域),沒有的話也要調整以消除此現象,不然會造成呼叫不到的bug。
現在將以上程式PAGE安排原則總結如下:
一、PAGE 0的前半部先放第一階副程式的"頭"(若空間足夠也可放整個副程式),"頭"負責把PAGE控制轉到該副程式的"身體"所座落之PAGE。
二、接下來放置主程式,主程式需全部置於PAGE 0內。
三、第一階副程式的"身體"可置於任一PAGE內,該副程式的"尾"負責把PAGE控制轉回PAGE 0。
四、第二階副程式與呼叫它的第一階副程式放在同一PAGE內。
五、呼叫第二階副程式不用改變PAGE控制(例外:主程式的呼叫);第二階副程式的"尾"也不用改變PAGE控制。
六、所有的副程式,不管是第一階或第二階,其進入點皆需位於每一PAGE的前半部。
如此安排後,對副程式的呼叫均不需處理PAGE控制,此控制是由副程式的"頭"及"尾"處理掉了;而主、副程式當中的goto指令就可安心使用,不虞會GOTO到錯誤的PAGE上。
以上安排是不是會讓您安心撰寫程式而不用擔心PAGE的控制呢?如果您發現到更好的方法也請不吝指教,謝謝
上一页 [1] [2]
本文关键字:暂无联系方式PIC单片机,单片机-工控设备 - PIC单片机