Dear Joseph ,
這幾天把 example中所有範例都測試過 , 所以程式範例都可以順利跑起來 , 也大致了解一下My_Main.c程式 .
但是有一個問題需要請教老師 , 就是當程式複製到SD卡 , 並放入 Pi3中上電後 , 剛開始跑的時候其時間都正常 ,
大約經過約10秒左右 , 時間會變快 . 例如LED 0.5sec閃爍一次 , 經過10sec後變快小於0.5sec閃爍 , 或是 UART傳輸
原本可以操作傳輸 , 經過10sec後就無法傳輸 . 是哪裡的設定需要再做調整修改 ?
Best regards
李修宇 ( Sam Li )
Arise Biotech Corp.
廣普生物科技(股)公司
23148 新北市新店區中正路四維巷2弄5號3樓
Tel : +886-2-8667-5441 ext : 130
Fax : +886-2-8667-1468
✉ Email : sam...@arisebio.com.tw
Web : www.arisebio.com.tw
cid:image0...@01CFD9AF.C8B1BF70
----------------------------------------
From: joseph chen [mailto:ifang....@gmail.com]
Sent: Tuesday, February 07, 2017 10:59 PM
To: SamLi
Subject: Re: ARM BootLoader 課程範例提問
Dear Sam
1) 針對第一個問題, 你可以看附件圖, 反組譯後你可以看得更清楚。
2) C call function 前, 原則上會改到的值,都要備份 (即push to stack)
更多細節你可以查看AAPCS
<http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pd
f> 的文件。不過通常你可以反組譯去看實習狀況,
因為AAPCS仍隨ARM架構不同而有不同。
3) reset Exception=> PC=0x0 ==> branch reset handler; 處理後返回下一個指令 ( PC=0x4 )
內置圖片 1
SamLi <sam...@arisebio.com.tw> 於 2017年2月6日 下午2:44 寫道:
Dear Josepn ,
2/4上課中的範例assembly1/ex7 , 其SP ( r13 ) 堆疊指標有不了解的地方 , 需要老師講解 . 謝謝 .
跑程式說明如下 :
第58行 , STMDB r13! , { r8 , r9 } , 此時將r8 & r9放入堆疊 , 所以r13指標為0x0FFFF8h
第59行 , BL call_by_asm , 此時將PC指標位址放入lr ( r14 = 0x0000007Ch ) , 在跳要到C程式位址 (
0x000000A8h ) .
此時指標在 “ int call_by_asm(int para1 , int para2 , int para3 , int para4 , int
para5 , int para6 ) { “ 位置 ,
執行此行 , 此時有改變暫存器 ( r0 ~ r14 )
a. 將lr ( r14 ) push 到堆疊 , sp ( r13 ) = 0x0FFFF4h . 因為呼叫函式 , 所以將指標push到堆
疊 , 可以理解 .
b. r12 = 5 , r14 = 6 為何會改變此2個值 ?
c. 應該有從堆疊中將r8 & r9 值pop出來 , 為何sp ( r13 ) = 0x0FFFF4h ?
在執行此行 “ return ( para1 + para2 + para3 + para4 + para5 + para6 ) “ , 先相
加para1~para6的值 = 21 , 並存入r0 = 21 .
在執行此行 “ } “ 從推疊pop回pc位址 ( 0x0000007Ch ) , 位置回到 “ BL My_Main “
==> 此時推疊指標sp ( r13 ) = 0x0FFFF8h .
在執行此行 “ BL My_Main “ , 此時將PC指標位址放入lr ( r14 = 0x00000080h ) , 在跳要到C程式位址 (
0x000000C8h ) .
此時指標在 “ void My_Main (void) { “ 位置 ,
執行此行 , 此時push 四個值進入堆疊 , 0x02h , 0x03h , 0x04h & 0x080h , sp ( r13 ) =
0x0FFFE8h , 為何會push四個值 ?
而不是只push lr ( r14 ) ?
在執行此行 “ result = call_to_asm ( 20 ,1 ,2 , 3 , 4 , 5 ) “ , 此時有改變暫存器 ( r0 ~
r14 )
a. r0 = 0x014h , r1 = 0x001h , r2 = 0x002h , r3 = 0x003h , lr ( r14 ) =
0x000000ECh
b. 堆疊也有2個值改變 , 0x0FFFE8h = 0x004h & 0x0FFFECh = 0x005h , 此時堆疊指標為 sp (
r13 ) = 0x0FFFE8h .
執行此行 “ LDMIA sp! , { r8 , r9 } “ , r8 = 0x004h , r9 = 0x005h , 堆疊指標變更為 sp (
r13 ) = 0x0FFFF0h .
==> 此時堆疊指標正確 ?
我嘗試將 C 程式最後一行 " while (1) {} " , 變更為 " return ( result ) ; " , 並將 " void
My_Main(void) " 改為 “ int My_Main (void) “
去執行 , 在最後執行完 " return ( result ) ; " , 確實sp ( r13 ) 回到最初值 0x100000h , 但是pc (
r15 ) 卻為 0x00000004h ??
Best regards
李修宇 ( Sam Li )
Arise Biotech Corp.
廣普生物科技(股)公司
23148 新北市新店區中正路四維巷2弄5號3樓
Tel : +886-2-8667-5441 ext : 130
Fax : +886-2-8667-1468
✉ Email : <mailto:sam...@arisebio.com.tw> sam...@arisebio.com.tw
Web : <http://www.arisebio.com.tw> www.arisebio.com.tw
cid:image0...@01CFD9AF.C8B1BF70
----------------------------------------