Eco Page Manager Problem3

另外在eco_page_manager裡面也要做修改,原本的做法是eco_page_manager首先取得function在ECO_PAGE_ADDR的function address,接著去判斷這個function的page ID是不是在page table裡面,處理完之後就LCALL到那個特定的address。
如果原本的function有parameter的話,這邊就必須要做修改,在
MOV DPH,ECO_PAGE_ADDR
MOV DPL,ECO_PAGE_ADDR+01H
LCALL ?C?ICALL2
跳到user function之前,必須要
MOV SPI_CTRL,ECO_PAGE_SPI_CONN
MOV R0,#LOW (ECO_PAGE_REGISTER3)
MOV A,@R0
MOV R3,A
MOV R0,#LOW (ECO_PAGE_REGISTER2)
MOV A,@R0
MOV R2,A
MOV R0,#LOW (ECO_PAGE_REGISTER1)
MOV A,@R0
MOV R1,A
MOV R0,#LOW (ECO_PAGE_REGISTER5)
MOV A,@R0
MOV R5,A
1.把ECO_PAGE_SPI recover到spi_ctrl,因為eco_page.c要用到eeprom,所以在進來eco_page_manager之前要把spi mode去備份,等eco_page_manager做完事之後,在把spi mode調回user function原本的mode。
2.這邊只列出R3,R2,R1,R5四個Register的情況,不過應該是R1~R7七個Register都要處理,因為eco_page_manager要統一都可以處理各個function才行,我們不知道使用者and Keil C51 compiler會如何把parameter分配到哪幾個Register(應該說是有規則,但是我們要能處理每一個情況就必須要把在eco_page_manager裡都處理),在compile time階段,我們利用python把使用者的asm code做些修改,在這邊我們知道使用者的code,把parameter分配到哪裡,因此我們只要取代其中的R3,R2,R1,R5。進入eco_page_manager之後,我們勢必要把idata ECO_PAGE_REGISTER1~R7的value都放回register裡面,這樣跳進user function之後,會用到的就是會用到,不會用到的就沒差。










發表迴響