1. 程式人生 > >u-boot下執行下載和執行程式“Helloworld”

u-boot下執行下載和執行程式“Helloworld”

        雖然自2012年9月開始就做嵌入式了,但感覺自己一直在打醬油,首先玩的loongson的平臺的片子(玩過的人都懂的),其次是公司招我進去的目標只是為了驗證公司做的硬體是沒問題的,整個方案基本就是按開發板做的,所以自己基本沒有什麼可以改,最多就是做幾個IIC的小晶片驅動,基本就是編譯下程式,看看資料對不對。

         時間就快過去一年了,嘗試著去面試了幾家公司,回來深受打擊:沒有做上層的經驗,說做底層,可是bootload都沒玩過,不清楚bootload的啟動流程,沒有分析過啟動程式碼,沒有除錯過記憶體晶片,沒有寫過裸機程式碼,只是知道核心下簡單驅動的框架,但沒做過音視訊驅動,沒有做過USB……

         出去面試一遭,才知道自己一年內打醬油打的多麼的徹底,所以痛定思痛,決定從0開始(做了一年的好處是,對概念性的東西不陌生),從最基本的uboot開始,用了幾天時間,看完了start.S,瞭解了大致的啟動流程,同時也對比了loongson的pmon啟動程式碼,其實發現流程都是差不多的。

         然後,就想在uboot下搭建裸機開發環境,首先從最基本的“helloworld”開始,

         開始的時候程式碼直接寫成:

         #include<stdlib.h>

        int main(int argc, char **argv)

       {

              printf("Helloworld!\n");

       }

       直接就是編譯錯誤,上網一查:原來uboot下沒有庫函式可用 所以不可以通過呼叫lib庫的標準printf函式實現列印輸出,但變相通過uboot本身實現的printf函式 利用函式指標進行printf函式呼叫,於是乎參考了網上的程式碼:

        void (*show)(char *, ...);

        int main(int argc, char **argv)

       {

                   show = 0x33f9303c;

                   show("Helloworld!\n");

       }

       雖說網上說“show = 0x33f9303c;”是通過檢視uboot的System.map得到的 各個版本可能不同,但並不是很明白,先不管,直接編譯

      hello.bin:hello.o
               arm-linux-ld -Ttext 0x30000000 hello.o -o hello.elf
               arm-linux-objcopy -O binary hello.elf hello.bin
               arm-linux-objdump -d hello.elf > hello.dls

hello.o:hello.c
               arm-linux-gcc -c hello.c -o hello.o

clean:
              rm hello.bin hello.o hello.elf hello.dls

             編完將生成的bin檔案放到tftp資料夾,在uboot下用tftp下載到0x30000000處(tftp 30000000 hello.bin),卻執行不起來,自己也不知道原因,在網上找了一陣,卻也只有那幾篇文章,也沒找出原因,於是糾結了幾天,今天去深圳灣騎行50公里回來,也許鍛煉出汗後會神清氣爽,看東西都比較精神,再上網繼續找原因,突然發現了原因:原來“show = xxxxxx;”中的xxxxxx是指uboot的System.map中的printf的地址,比如我的版本的地址是0x33f91708,OK,編譯下載,執行一切如常了。

              也許文內寫的東西很簡單,但是要是開始玩u-boot,且周圍沒有交流的人的情況下,這兩個細節還是要花時間去解決的:show的地址、arm-linux-ld -Ttext 0x30000000 hello.o -o hello.elf中的連結地址要和u-boot的中下載地址一致。

相關推薦

u-boot執行下載執行程式Helloworld

        雖然自2012年9月開始就做嵌入式了,但感覺自己一直在打醬油,首先玩的loongson的平臺的片子(玩過的人都懂的),其次是公司招我進去的目標只是為了驗證公司做的硬體是沒問題的,整個方案基本就是按開發板做的,所以自己基本沒有什麼可以改,最多就是做幾個IIC的

Linux環境如何編譯執行c程式

1 單個檔案的編譯和執行 建立main.c檔案,內容如下:  編譯: 執行: 2 多個檔案的編譯和執行建立sum.c檔案,內容如下: 建立main.c檔案,內容如下:   編譯:    生成可執行檔案,檔名為main: 執行程式:

navicat創建執行存儲過程

logs nav cnblogs log ica http 存儲過程 -1 png navicat下創建和執行存儲過程

Linux環境如何編譯執行c程序

文件的 ron 當前 cto directory 變量 沒有 執行文件 nbsp 1 單個文件的編譯和執行 創建main.c文件,內容如下: 編譯: 執行: 2 多個文件的編譯和執行創建sum.c文件,內容如下: 創建main.c文件,內容如下: 編譯:

10.執行執行緒池的區別,執行緒池有哪些,什麼情況使用

一:執行緒和執行緒池的區別 (1)new Thread 的弊端       a. 每次new Thread時,新建物件效能差。       b. 執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭,可能佔用過多系統資源導致宕機或oom。       c. 缺乏更多功能

64位 linux作業系統如何編譯執行32位原始碼

解決辦法:  1、執行命令: yum whatprovides libstdc++.so.6   然後會提示哪個安裝包有這個庫檔案如下:   [[email protected] ~]# yum whatprovides libstdc++.so.6  Loaded plugins: aliases

Linux環境原始碼編譯執行常用的兩個命令:pkg-configldconfig

        最近一段時間在研究linux伺服器叢集的相關知識,打算基於corosync和pacemaker來搭建一個linux高可用叢集, 通過編譯原始碼包來了解其依賴的動態庫,在編譯的過程中遇到一些問題,總結一些,供大家以後參考(很通用哦):        我們

C# winform刪除執行退出程式方法

退出C# WinForm程式有很多方法,如: this.Close(); Application.Exit(); Application.ExitThread(); System.Environment.Exit(0); 區別在於: 1.this.C

使用u-boot的tftp下載功能燒寫程式到Nand Flash ——韋東山嵌入式Linux學習筆記09

本文實驗環境: 1. windows 7(64bit) 2. JZ2440(V2) (2)啟動軟體tftpd32,選擇要下載的程式所在的目錄 (3)假設下載檔案leds.bin,在u-boot的命令列,輸入 tftp 30000000 le

怎麼樣下載執行GitHub上的程式碼呢?

從昨天開始就想著從GitHub上下載一個開源的Vue的實戰專案,希望能從中學習更多的Vue的實用內容,結果搞了半天好不容易下載了,不知道怎麼弄。然而,今天終於成功了,激動地我趕緊來記錄一下。如何從GitHub上下載自己需要的專案:1.首先,你要有一個自己的GitHub(htt

Java 8併發教程:執行執行程式

歡迎來到我的Java 8併發教程的第一部分。 本指南教你用Java 8進行併發程式設計 ,並具有易於理解的程式碼示例。 這是涵蓋Java併發API的一系列教程的第一部分。在接下來的15分鐘內,您將學習如何通過執行緒,任務和執行器服務並行執行程式碼。 第1部分:執行緒和執行者

u-boot網路驅動程式的修改

Eth.c工作之前的初始化 static struct eth_device *eth_devices, *eth_current; Eth.c中有個eth_devices需要外部呼叫函式eth_re

linux如何編譯執行C語言

1、linux系統下 C程式編譯: gcc -Wall -g -o testDefunctProcess testDefunctProcess.c -Wall 代表編譯器在編譯過程中會輸出警告資訊(Warning),比如有些變數你並沒有使用,指標指向的型別有誤,mai

渣渣的deepwalk之旅——win10deepwalk配置執行

渣渣的deepwalk之旅 剛開始學習網路表示學習,看完《Deepwalk Online learning of social representations》後,打算去github上下載原始碼並自己測試,實現deepwalk演算法,結果就開始漫長的修正bug

u-boot延時程序失效的bug調試

val boot 結果 dump pre spa quest pri 默認 最近在工作中的一個項目中,大概是將兩塊板卡相連(一塊STM32跑裸機程序,另一塊AM335x跑Linux系統),但是發現在u-boot有時無法啟動成功,需要通過一個GPIO的狀態來判斷,具體來說就是

守護執行執行緒常用方法

執行緒的守護的使用,形式與程序基本相同 from threading import Thread import time def task(): print("子執行緒 開始工作") time.sleep(2) print("子執行緒 結束工作") t1 = Thread(

執行緒-day-08多執行執行緒併發工具總結

目錄 多執行緒和執行緒併發工具總結 執行緒基礎、執行緒之間的共享協作 基礎概念 Java執行緒 執行緒常用方法和執行緒狀態 共享執行緒 執行緒間協作 執行緒併發工具類 Fork-Join分而治之、工作密取 Fork-Join標準正規化 Fork-Joi

u-boot-2009 tftp下載核心及nfs系統

核心版本:3.0.35: setenv ipaddr 200.200.4.234 setenv serverip 200.200.4.233 setenv bootcmd_tftp tftpboot 0x10800000 uImage-myimx6a9 setenv bootargs

《Android開發藝術探索》學習筆記之Android的執行執行緒池

一、概述 1、主執行緒與子執行緒 主執行緒 又叫UI執行緒 主要作用是執行四大元件以及處理它們和使用者的互動,主要用來處理和介面相關的事情 子執行緒 執行耗時任務,比如網路請求、I/O操作等

Spring Boot的第一個應用程式

簡單的一個功能:瀏覽器傳送hello請求,伺服器收到請求並進行處理,響應helloworld字串 1:建立一個maven工程(jar) 2:匯入springboot相關的依賴 <parent> <groupId>org.springfram