電腦上的thumb怎么打不開(kāi) 在main之前,IAR都做了啥?
在main之前,IAR都做了啥?最近要在Cortex-M3上寫(xiě)一個(gè)簡(jiǎn)單操作系統(tǒng),準(zhǔn)備建議使用IAR,替寫(xiě)好啟動(dòng)代碼,花了一些時(shí)間了解了IAR在main()以前到底在干什么事。t是需要系統(tǒng)復(fù)位時(shí),Cor
在main之前,IAR都做了啥?
最近要在Cortex-M3上寫(xiě)一個(gè)簡(jiǎn)單操作系統(tǒng),準(zhǔn)備建議使用IAR,替寫(xiě)好啟動(dòng)代碼,花了一些時(shí)間了解了IAR在main()以前到底在干什么事。t
是需要系統(tǒng)復(fù)位時(shí),Cortex-M3從代碼區(qū)偏移0x00000000處資源棧頂?shù)刂罚瑔为?dú)初始化設(shè)置MSP寄存器的值。t
接下來(lái)的事情從代碼區(qū)偏移0x00000004某些第一個(gè)指令的跳轉(zhuǎn)地址。這些地址,是CM3那些要求儲(chǔ)放自動(dòng)向量表的地方。t
這里是一個(gè)程序的啟動(dòng)區(qū)的反匯編:t
__vector_table:t
080040002600t
080040022000t
080040047E1Dt
080040060800t
這個(gè)程序是由IAP程序來(lái)正常啟動(dòng)的,IAP程序資源0x08004000處的MSP值(0x20002600),并設(shè)置中為MSP的值,即主堆棧比較大t
范圍是0x20000000~0x200025FF。接下來(lái)的IAP程序查看0x08004004處的Reset_Handler的地址t
(0x08007E1D),并跳轉(zhuǎn)Reset_Handler()先執(zhí)行。t
IAP在這里已經(jīng)是怎么模仿了Cortex-M3的復(fù)位序列,也就是說(shuō),在沒(méi)有IAP的系統(tǒng)上,CM3只有從0x08000000獲取MSP,從t
0x08000004聲望兌換第一條指令所處地址。而IAP就存在在0x08000000這個(gè)地址上,IAP的啟動(dòng),早就耗掉掉了這個(gè)復(fù)位序列,所以才t
IAP要啟動(dòng)時(shí)UserApp程序的時(shí)候,確實(shí)是全部我模仿Cortex-M3的復(fù)位序列的。t
下一步我們?nèi)タ纯磸?fù)位后第一句指令——Reset_Handler()函數(shù)里有什么。t
若我們使用的是ST公司標(biāo)準(zhǔn)外設(shè)庫(kù),那么也有了現(xiàn)成的Reset_Handler,當(dāng)然了他是弱定義——PUBWEAK,可以被我們覆寫(xiě)的小說(shuō)改編函數(shù)覆蓋。一般來(lái)說(shuō),我們?cè)谟玫娜荢T需要提供的Reset_Handler,在V3.4版本的庫(kù)中,這個(gè)可以在startup_stm32f10x_xx.s中找到這個(gè)函數(shù):t
PUBWEAKReset_Handlert
SECTION.text:CODE:REORDER(2)t
Reset_Handlert LDR R0,SystemInitt
BLXR0t
LDRR0,__iar_program_startt
BXR0t
的確ST還沒(méi)有做太多的事,他只調(diào)用了自家?guī)炜梢蕴峁┑腟ystemInit函數(shù)進(jìn)行系統(tǒng)時(shí)鐘、Flash讀取文件的初始化,并把大權(quán)送到了t
__iar_program_start這個(gè)IAR需要提供的“內(nèi)部函數(shù)”了,我們就跟緊這個(gè)__iar_program_start跳轉(zhuǎn),看看吧IAR做了什t
么,上面一段代碼的反匯編追加:t
Reset_Handler:t
__iar_section$$root:t
08007E1C4801LDRR0,[PC,#0x4]LDRR0,SystemInitt
08007E1E4780BLXR0BLXR0t
08007E204801LDRR0,[PC,#0x4]LDRR0,__iar_program_startt
08007E224700BXR0BXR0t
08007E246C69t
08007E260800t
08007E287D8Dt
08007E2A0800t
再細(xì)心的觀眾會(huì)突然發(fā)現(xiàn)地址是0x08007E1C,比我們查到的0x08007E1D差了1,這是ARM家族的遺留問(wèn)題,畢竟ARM處理器的指令至t
少是半字整個(gè)表格的(16位THUMB指令集內(nèi)個(gè)t
32位ARM指令集),因?yàn)镻C指針的LSB是常為0的,目的是十分充分依靠寄存器,ARM公司給PC的LSB了一個(gè)不重要的使命,那就是在先執(zhí)行分支跳轉(zhuǎn)時(shí),PCt
的LSB1,來(lái)表示在用THUMB模式,LSB0,表示使用ARM模式,但在2011版的Cortex-M3內(nèi)核上,只可以使用了THUMB-2指令集挑大梁,所t
以這一位要常保持1,因此我們查到的地址是0x08007E1D(C1100,D1101),放心好了,我們的CM3內(nèi)核會(huì)遺漏掉掉LSB(除非為0,那t
么會(huì)過(guò)多一個(gè)fault),使正確跳轉(zhuǎn)0x08007E1C。t
從0x08007E20處的打開(kāi)程序指令,我們這個(gè)可以算不出__iar_program_start所處的位置,就是當(dāng)前PC指針t
(0x08007E24),再加上4,即0x08007E28處的所朝的地址——0x08007D8D(0x08007D8C),我們跟緊著跳t
轉(zhuǎn),__iar_program_start果然在這里:t
__iar_program_start:t
08007D8CF000F88CBL__low_level_initt
08007D902800CMPR0,#0x0t
08007D92D001BEQ__iar_init$$donet
08007D94F7FFFFDEBL__iar_data_init2t
08007D982000MOVSR0,#0x0t
08007D9A F7FDFC49BLmaint
我們看見(jiàn)了IAR需要提供了__low_level_init這個(gè)函數(shù)并且了“底層”的初始化,盡快跟蹤,我們可以查到__low_level_init這個(gè)函數(shù)又發(fā)生了什么,又不是不是我們想象中的不可告人。t
__low_level_init:t
08007EA82001MOVSR0,#0x1t
08007EAA4770BXLRt
__low_level_init預(yù)料之外想象的很簡(jiǎn)單,只是因?yàn)橥鵕0寄存器中寫(xiě)入了1,就馬上先執(zhí)行
三星s5“thumbdata3是”什么文件?
三星S5手機(jī).thumbdata3-開(kāi)頭的文件和.thumbnails是安卓系統(tǒng)中相機(jī)和圖片的緩存文件,該文件好象會(huì)占用內(nèi)存。
解決方法:1、用數(shù)據(jù)線連接到電腦和手機(jī),選擇類型U盤(pán)模式(將手機(jī)充當(dāng)可移動(dòng)磁盤(pán))。以G盤(pán)為例,可以打開(kāi)可移動(dòng)磁盤(pán),刪除掉該目錄下的.thumbdata3-1763508120和.thumbdata3--19672902992、新建項(xiàng)文件.thumbdata3--1967290299和.thumbdata3-1763508120。這里有兩種方法。(1)會(huì)CMD的直接用CMD新建。(2)在電腦上找有后綴的文件,截圖兩個(gè)到可移動(dòng)磁盤(pán),各以此命名為.thumbdata3--1967290299和.thumbdata3-1763508120。3、右擊文件,再點(diǎn)屬性中改可讀可寫(xiě),提示框U盤(pán)。重啟手機(jī)即可。