国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

ARM入門筆記(2)

發布時間:2010-8-26 17:23    發布者:絕對好文
關鍵詞: ARM入門筆記
第二章 我的第一個實驗 ――將程序執行到C文件的main函數

二.實驗目的

運用ADS編寫一個小程序,使程序能夠從起始的匯編代碼運行到C程序的main()函數(這也可稱作非常簡單的起動代碼),并通過仿真器連接目標板,最終能夠在AT91SAM7S64里正確運行。

三.實驗程序和參數設置

1>連接器的選項設置

選項設置如圖2-1所示。因為在AT91SAM7S64中FLASH存儲器的地址是以0x0開始,而SRAM的地址是以0x00200000開始,所以我將下圖中的RO Base和RW Base分別設置成了0x0和0x00200000。其它設置請參考有關書籍。
            

圖2-1. 選項設置圖

2>啟動代碼

ARM應用系統中,芯片復位后,在進入C語言的main()函數前,都要執行一段啟動代碼。該代碼一般都是用匯編語言編寫,用來完成系統運行環境和應用程序的初始化,詳情請參考有關書籍。由于本實驗的目的很簡單,就是想讓程序復位后,進入main()函數,所以有些初始化代碼盡量精簡,留下了下述代碼。另外,__main是C語言的內部庫函數,可以在進入用戶main()之前完成內部RAM的初始化工作,類似KeilC51中的startup.a51。當執行完__main這段代碼后,再跳轉到main()函數。

AREA init,CODE,READONLY
CODE32
Mode_USR  EQU  0x10 ;CPSR中各種處理器模式對應的控制位
I_Bit   EQU  0x80 ;CPSR中的中斷禁止位
F_Bit   EQU  0x40
USR_Stack  EQU  0x00203000 ;定義RAM的最高地址,無重映射
ENTRY
                B           InitReset        ; 0x00 Reset handler
undefvec         B           undefvec        ; 0x04 Undefined Instruction
swivec           B           swivec          ; 0x08 Software Interrupt
pabtvec          B           pabtvec          ; 0x0C Prefetch Abort
dabtvec          B           dabtvec          ; 0x10 Data Abort
rsvdvec          B           rsvdvec          ; 0x14 reserved
irqvec           B   irqvec   ; 0x18 IRQ
fiqvec      B   fiqvec        ; 0x1c FIQ
InitReset
MSR CPSR_c,#Mode_USR | I_Bit | F_Bit ;改成用戶模式且禁止IRQ和FIQ中斷
LDR SP,=USR_Stack
IMPORT  __main                  
b         __main  ;跳轉到__main執行,它位于C運行時庫中                                
END
3>C語言主函數
在C語言主函數中做了一個死循環,如下述所示。
int main(void)
{
  while (1);
}

四.出現的問題與解決方法

當完成上述操作后,先用軟件仿真,很快達到了目的,但將程序通過仿真器在目標板運行時出現了下述問題。

1> 當執行單步運行時,PC一直停留在0x0處,而且Debug Log窗口中顯示“RDI Warning 00148: Can't set point”。
原因是仿真器在ROM中設置的斷點數是有限的,且單步運行時內部還要占用斷點。可以使用“Option->Config Processor”打開“Processor Properties-ARM7TDMI”窗口,且按照下圖設置以關斷相的斷點。


圖2-2

2> 裝載的代碼與實踐程序不一樣

原因是由于程序沒有裝載到AT91SAM7S64的FLASH ROM里,在調試器中顯示的是FLASH ROM中原先就有的程序。因為在連接器的選項設置中,將RO Base和Image entry point指向了0地址,而在AT91SAM7S64的這段空間為FLASH ROM區,而仿真器不能直接將代碼下載到FLASH ROM里。用仿真器只能將代碼下載到AT91SAM7S64的內部SRAM里進行調試,必須將ARM Linker->Output->Simple image->RO Base和Image entry point的0,改成SRAM的地址0x002000000。

3>在軟件仿真的情況下,執行“B __main”指令,能使程序跳到C文件的main函數,但用硬件仿真時,還沒執行到main函數時就進入了異常中斷。

原因是執行“B __main”指令后,程序先跳到__main庫函數的入口,再進行一些初始化操作,最后再跳入用戶的main函數。但在初始化過程中,由于堆棧或其它原因造成程序出錯。有兩種方法可以解決這個問題。第一:將“B __main”指令直接改成“B main”,使程序不進行初始化而直接跳入用戶的main()函數。第二:合理初始化堆棧。由于考慮到剛接觸ARM和將問題簡單化,我選擇了第一種方法。

五.總結

1> 在用仿真器時,必須將程序下載到AT91SAM7S64的內部SRAM中,而不是Flash ROM。

2> 從匯編代碼進入C文件函數時,可以直接使用C語言中的標號(可參考書中混合編程部分),如執行“B main”則直接跳到C語言的main()函數入口。

3> 在起動代碼中,可以調用__main()庫函數進行存儲器的初始化,也可以自己編寫更有效的代碼進行初始化,在初始化后就可以使用“B __main”指令直接跳轉到C的main()函數。
本文地址:http://m.qingdxww.cn/thread-23766-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
長話短說 發表于 2010-9-4 11:25:56
謝了
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产国产人免费视频成69大陆 | 肉与灵电视剧在线观看 | 自拍偷拍网址 | 欧美国产精品不卡在线观看 | 久久99精品综合国产首页 | 一级做a爱片特黄在线观看 一级做a爱片就在线看 | 国产偷v国产偷v亚洲高清 | 久久经典视频 | 视频一区二区三区蜜桃麻豆 | www.欧美精品 | 精品一区二区三区的国产在线观看 | 欧美精品v国产精品v日韩精品 | 四虎永久在线精品波多野结衣 | 在线观看91精品国产hd | 在线播放免费播放av片 | 亚洲三级在线免费观看 | 日韩欧美日本 | 呦女网址www呦女 | 国产麻豆免费视频 | 午夜精品一区二区三区在线观看 | 69av导航 | 四虎在线观看免费视频 | 美女网站免费福利视频 | 榴莲草莓向日葵黄瓜丝瓜污 | 狠狠狠色丁香婷婷综合久久俺 | 国产逼逼| 四虎激情影院 | 黄色日b视频| 亚洲最大看欧美片网站 | 羞羞免费观看网站 | 99国产在线视频 | 国产欧美日韩不卡 | 在线成人免费视频 | 99精品视频在线在线视频观看 | 色花堂国产精品原创第一页 | 国产色婷婷免费视频 | 黑人巨大15p | 在线视频这里只有精品 | 日日射日日操 | 久久婷婷大香萑太香蕉a | 在线精品视频成人网 |