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-config和ldconfig
最近一段時間在研究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之旅——win10下deepwalk配置和執行
渣渣的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