Fwd: Re: ARM BootLoader 課程範例提問

38 views
Skip to first unread message

joseph chen

unread,
Feb 27, 2017, 12:16:59 AM2/27/17
to IT_Project
---------- 轉寄的郵件 ----------
寄件者:"joseph chen" <ifang....@gmail.com>
日期:2017年2月27日 下午1:16
主旨:Fwd: Re: ARM BootLoader 課程範例提問
收件者:"陳義方" <jos...@ittraining.com.tw>
副本:

---------- 轉寄的郵件 ----------
寄件者:"joseph chen" <ifang....@gmail.com>
日期:2017年2月27日 下午1:11
主旨:Re: ARM BootLoader 課程範例提問
收件者:"SamLi" <sam...@arisebio.com.tw>
副本:


 dear sam,  

1) 
    #Disables dynamic cpufreq driver
   add  this line "force_turbo=1"  to config.txt 

    you can google DVFS to get more information
 
2) I do not encounter  the situation as you described ( the attached is the binary code I just tried, and it is ok for me)
   




SamLi <sam...@arisebio.com.tw> 於 2017年2月21日 上午10:38 寫道:
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
----------------------------------------







armuart_int.bin
Reply all
Reply to author
Forward
0 new messages