<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用uboot調(diào)試裸機(jī)C語(yǔ)言

          用uboot調(diào)試裸機(jī)C語(yǔ)言

          作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò) 收藏
          昨天用uboot1.4調(diào)試了一下基于s3c44b0的一個(gè)LED燈實(shí)驗(yàn),成功,紀(jì)錄下:

          最初的設(shè)想是想用uboot的loadb命令來(lái)調(diào)試自己移植的uboot,發(fā)現(xiàn)串口沒(méi)顯示,當(dāng)時(shí)就暈了 就不想再動(dòng)了,原因可想而知是各種各樣的,難~~~ 但再想想是不是思路有問(wèn)題,就打算寫個(gè)裸C來(lái)試下loadb命令。

          本文引用地址:http://www.ex-cimer.com/article/201611/323258.htm

          整個(gè)程序就是實(shí)現(xiàn)個(gè)流水燈(也就只有三個(gè)LED),就叫做led.c吧,編譯成led.o,再用arm-elf-objcopy成led.bin,通過(guò)串口,用uboot命令loadb 0x0c008000 用超級(jí)終端傳送一下,(很快,一下而過(guò))發(fā)現(xiàn)板子沒(méi)反應(yīng),(又暈了)只有找google了(還是推薦google,百度還是差點(diǎn))發(fā)現(xiàn)還要鏈接,那就arm-elf-ld -Ttext 0x0c008000 -nostdinc -o led.elf led.o(不是很懂為什么要加-nostdinc 然道是為了幫ld省事,不要去找stdinc??)。再次loadb 發(fā)現(xiàn)板上的燈還是沒(méi)動(dòng)靜()這可雜辦呢~~~

          再次使出google大法,再看看自己的led.c~~~~~(時(shí)間很長(zhǎng)

          終于找到了一點(diǎn)有用的:“對(duì)于裸機(jī)C程序,入口函數(shù)應(yīng)該放在文件最前面”

          然道我的燈不動(dòng)就是因?yàn)樵趀ntry()之前寫了一個(gè)delay()????

          那就試著改一下吧,所有其他函數(shù)都寫在entry()之后,再次arm-elf-gcc arm-elf-as arm-elf-ld arm-elf-objcopy~~(各種難啊~~)最后loadb 0x0c00800~~~~~~~

          終于是見到板上的LED如程序所寫一樣的動(dòng)起來(lái)了~~(激動(dòng)啊

          激動(dòng)之后再想想,覺(jué)的所謂的裸C程序,入口函數(shù)應(yīng)該在文件最前面 這一點(diǎn)甚是不懂啊,再次請(qǐng)教google大叔,哎,發(fā)現(xiàn)有關(guān)的太少了,看樣子是沒(méi)多少人研究這個(gè)了~~~

          突然想到arm-elf-readelf這個(gè)東西,還是用用吧,打開led.elf看看,于是在arm-elf-readelf -a led.elf作用下,顯示了一大堆,當(dāng)時(shí)就眼花了,怕了~~~

          還是慢慢來(lái)吧,一步一步來(lái),先arm-elf-readelf -h led.elf

          還是能看懂的,非常簡(jiǎn)單的幾個(gè)english word 再次arm-elf-readelf -s led.elf

          感覺(jué)自己要的東西出現(xiàn)了~~~~

          出現(xiàn)了類似表單的文本,不懂頭幾個(gè)單詞的意思()卻在下面發(fā)現(xiàn)了entry ~~

          還在同一行看到了0c008000 應(yīng)該是說(shuō)在0x0c008000這個(gè)地方有一個(gè)entry 哈哈,這個(gè)我懂啊,所謂的程序入口函數(shù)嘛,我的程序就是要在0x0c008000處開始運(yùn)行啊

          于是我再改回我原來(lái)的led.c,把delay()放在entry()前面,再次arm-elf-readelf -s led.elf,發(fā)現(xiàn)

          在0c00800 一行上對(duì)應(yīng)的是 .gcc2_compiled 而entry這一行對(duì)應(yīng)的地址卻是0c00802c

          哎,這才總算在猜測(cè)+測(cè)試中發(fā)現(xiàn)所謂的裸C程序入口函數(shù)為什么要放在最前面了(只是猜測(cè)沒(méi)人告訴我why)裸C程序里的函數(shù)放置地址是按函數(shù)實(shí)現(xiàn)的地址來(lái)放置的 就是說(shuō)在內(nèi)存中函數(shù)的放置地址順序與在文件中的實(shí)現(xiàn)順序是對(duì)應(yīng)的~~ 而非裸C程序,甚至只要加了個(gè)符號(hào)鏈接的話,在內(nèi)存中的執(zhí)行地址與程序文本中的實(shí)現(xiàn)地址是無(wú)關(guān)的~~

          ~~~由此牽扯出的一大堆問(wèn)題怕是難以一下解決的了,哎 難~~~

          路漫漫其修遠(yuǎn)兮~~~~~~~



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();