卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

level1000到level2000介紹中文 橋牌BM2000Level 1 -A12怎么打?

橋牌BM2000Level 1 -A12怎么打?CA進(jìn)手后,先用SJ或ST掉將,保留張小將牌的橋路。在main之前,IAR都做了啥?最近要在Cortex-M3上寫一個(gè)最簡(jiǎn)單操作系統(tǒng),打算在用IAR,是

橋牌BM2000Level 1 -A12怎么打?

CA進(jìn)手后,先用SJ或ST掉將,保留張小將牌的橋路。

在main之前,IAR都做了啥?

最近要在Cortex-M3上寫一個(gè)最簡(jiǎn)單操作系統(tǒng),打算在用IAR,是為寫好起動(dòng)代碼,花了一些時(shí)間了解了IAR在main()以前到底在干什么事。t

必須系統(tǒng)復(fù)位時(shí),Cortex-M3從代碼區(qū)偏移0x00000000處某些棧頂?shù)刂?,用處系統(tǒng)初始化MSP寄存器的值。t

接下來(lái)從代碼區(qū)偏移0x00000004聲望兌換最先指令的跳轉(zhuǎn)地址。這些地址,是CM3沒有要求放置關(guān)閉向量表的地方。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。這一次IAP程序某些0x08004004處的Reset_Handler的地址t

(0x08007E1D),并跳轉(zhuǎn)Reset_Handler()先執(zhí)行。t

IAP在這里徹底是先模仿了Cortex-M3的復(fù)位序列,也就是說(shuō),在沒有IAP的系統(tǒng)上,CM3不能從0x08000000獲取MSP,從t

0x08000004獲取第一條指令所處地址。而IAP就存在在0x08000000這個(gè)地址上,IAP的啟動(dòng),巳經(jīng)會(huì)消耗掉了這個(gè)復(fù)位序列,所以才t

IAP要起動(dòng)UserApp程序的時(shí)候,確實(shí)是徹底我模仿Cortex-M3的復(fù)位序列的。t

接下來(lái)的我們看看吧復(fù)位后第一句指令——Reset_Handler()函數(shù)里有什么。t

若我們建議使用的是ST公司標(biāo)準(zhǔn)外設(shè)庫(kù),這樣的話也有了你自己做的Reset_Handler,只不過(guò)他是弱定義——PUBWEAK,也可以被我們寫回的暢銷小說(shuō)函數(shù)覆蓋。一般來(lái)說(shuō),我們?cè)谟玫囊彩荢T提供的Reset_Handler,在V3.4版本的庫(kù)中,也可以在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

現(xiàn)在看來(lái)ST還沒有做太大的事,他只全局函數(shù)了自家?guī)炜梢蕴峁┑腟ystemInit函數(shù)通過(guò)系統(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

體貼的觀眾會(huì)發(fā)現(xiàn)地址是0x08007E1C,比我們查到的0x08007E1D差了1,這是ARM家族的遺留問(wèn)題,畢竟ARM處理器的指令至t

少是半字整個(gè)表格的(16位THUMB指令集有.t

32位ARM指令集),因此PC指針的LSB是常為0的,是為利用好寄存器,ARM公司給PC的LSB了兩個(gè)最重要的使命,如果說(shuō)在先執(zhí)行分支跳轉(zhuǎn)時(shí),PCt

的LSB1,意思是不使用THUMB模式,LSB0,它表示不使用ARM模式,但在比較新的Cortex-M3內(nèi)核上,只不使用了THUMB-2指令集挑大梁,所t

以這一位要常保持1,因?yàn)槲覀儾榈降牡刂肥?x08007E1D(C1100,D1101),放心好了,我們的CM3內(nèi)核會(huì)選擇性的遺忘掉LSB(除非為0,那t

么會(huì)引起一個(gè)fault),進(jìn)而正確的自動(dòng)跳轉(zhuǎn)0x08007E1C。t

從0x08007E20處的讀取指令,我們是可以可以算出__iar_program_start所處的位置,那是當(dāng)前PC指針t

(0x08007E24),再加上4,即0x08007E28處的所對(duì)準(zhǔn)的地址——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

我們看見IAR能提供了__low_level_init這個(gè)函數(shù)通過(guò)了“底層”的初始化,盡快跟蹤監(jiān)視,我們可以不查到__low_level_init這個(gè)函數(shù)到底在做什么,也不是不是我們想象中的不可告人的秘密。t

__low_level_init:t

08007EA82001MOVSR0,#0x1t

08007EAA4770BXLRt

__low_level_init出乎想像的簡(jiǎn)單,僅僅往R0寄存器寫入到了1,就立刻負(fù)責(zé)執(zhí)行