廈門網(wǎng)站建設(shè)哪家公司好實(shí)時(shí)熱榜
1. 建立交叉編譯鏈接環(huán)境
? ? ? 官網(wǎng)下載的SDK包中就有交叉工具鏈,米爾提供的這個(gè) SDK 中除了包含各種源代碼外還提供了必要的交叉工具鏈,可以直接用于編譯應(yīng)用程序等。
? ? ? 用戶可以直接使用次交叉編譯工具鏈來建立一個(gè)獨(dú)立的開發(fā)環(huán)境,可單獨(dú)編譯 Bootloade
r,Kernel 或者編譯自己的應(yīng)用程序。我們這一節(jié)重點(diǎn)是編譯應(yīng)用程序。?
? ? 1.1 建立虛擬機(jī)環(huán)境
? 當(dāng)然,前提是先安裝虛擬機(jī),我們開發(fā)環(huán)境配置在ubuntu18.04虛擬機(jī)下。?
?1.2. 下載并安裝SDK
官網(wǎng)鏈接:?MYIR
源碼暫不提供 ,應(yīng)該是需要單獨(dú)申請(qǐng),沒關(guān)系,并不影響我們應(yīng)用程序開發(fā)。?
建立工具鏈目錄,并解壓,完成后:?
1.3 環(huán)境配置
開發(fā)包里寫好了env.sh腳本,可以完成環(huán)境配置:?
#!/bin/shexport PATH=$PATH:/home/hy/jd9x/tool/gcc_linaro/gcc-arm-none-eabi-7.3.1/bin:/home/hy/jd9x/tool/gcc_linaro/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-elf/bin:/home/hy/jd9x/tool/gcc_linaro/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export PREFIX=aarch64-linux-gnu-
export AS=aarch64-linux-gnu-as
export LD=aarch64-linux-gnu-ld
export CC=aarch64-linux-gnu-gcc
export AR=aarch64-linux-gnu-ar
export NM=aarch64-linux-gnu-nm
export STRIP=aarch64-linux-gnu-strip
export OBJCOPY=aarch64-linux-gnu-objcopy
export OBJDUMP=aarch64-linux-gnu-objdump
主要也是配置各種路徑參數(shù)。
2. 測試下環(huán)境安裝情況:?
~/jd9x$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/home/hy/jd9x/tool/gcc_linaro/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/7.3.1/lto-wrapper
Target: aarch64-linux-gnu
Configured with: '/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/snapshots/gcc.git~linaro-7.3-2018.05/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/aarch64-linux-gnu/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 7.3.1 20180425 [linaro-7.3-2018.05 revision d29120a424ecfbc167ef90065c0eeb7f91977701] (Linaro GCC 7.3-2018.05)
看起來應(yīng)該沒什么問題了。?
3. Hello World小應(yīng)用,編譯下載,運(yùn)行
3.1 編輯makefile
TARGET = $(notdir $(CURDIR))
objs := $(patsubst %c, %o, $(shell ls *.c))
$(TARGET)_app:$(objs)$(CC) -o $@ $^
%.o:%.c$(CC) -c -o $@ $<
clean:rm -f $(TARGET)_app *.all *.o${CC} -I . -c helloWorld.
稍稍解釋下:?
Makefile 有其自身的一套規(guī)則。
target ... : prerequisites ...
command?
其中:?
??target 可以是一個(gè) object file(目標(biāo)文件),也可以是一個(gè)執(zhí)行文件,還可以是一個(gè)
標(biāo)簽(label)。
?prerequisites 就是要生成那個(gè) target 所需要的文件或是目標(biāo)。
?command 也就是 make 需要執(zhí)行的命令。
?所以,上面的make文件的內(nèi)容解析:?
?$(notdir $(path)): 表示把 path 目錄去掉路徑名,只留當(dāng)前目錄名,比如當(dāng)
前 Makefile 目錄為/home/wujl/key_led,執(zhí)行為就變?yōu)?TARGET = key_led
?$(patsubst pattern, replacement,text) :用 replacement 替換 text 中符合
格式"pattern" 的字符,如$(patsubst %c, %o, $(shell ls *.c)),表示先列出
當(dāng)前目錄后綴為.c 的文件,然后換成后綴為.o
?CC:C 編譯器的名稱
?CXX: C++編譯器的名稱
?clean: 是一個(gè)約定的目標(biāo)
3.2 編輯應(yīng)用代碼:?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/* print helloworld */
int main(int argc, char **argv)
{printf("j9x, hello world \n");return 0;
}
3.3? ?在項(xiàng)目目錄下,編譯:?
生成可執(zhí)行的應(yīng)用程序helloWorld_app
3.4 目標(biāo)機(jī)執(zhí)行
此時(shí),可以用filezilla把上述可執(zhí)行文件copy到目標(biāo)機(jī)目錄下:
?
轉(zhuǎn)移至secureCRT調(diào)試頁面,執(zhí)行剛剛copy過來的可執(zhí)行文件:?
root@myd-jd9x:~/app# ls
helloWorld_app
root@myd-jd9x:~/app# ./helloWorld_app
-sh: ./helloWorld_app: Permission denied
root@myd-jd9x:~/app# cd ../
root@myd-jd9x:~# chmod 777 app -R
root@myd-jd9x:~# cd app
root@myd-jd9x:~/app# ./helloWorld_app
j9x, hello world
root@myd-jd9x:~/app#
中間遇到讀寫權(quán)限問題,用chmod命令設(shè)置下。?
4. 資源調(diào)用-配置點(diǎn)燈
4.1 環(huán)境測試
linux下,一切皆是文件,外設(shè)也是。?
操作 LED 的目錄為/sys/class/leds
root@myd-jd9x:~/app# cd /sys/class/leds
root@myd-jd9x:/sys/class/leds# ls
debug mmc0:: mmc1:: mmc2:: run
root@myd-jd9x:/sys/class/leds#
?測試debug燈不同狀態(tài)
讀取,熄滅,點(diǎn)亮,觸發(fā)模式:
root@myd-jd9x:/sys/class/leds# cat ./debug/brightness
0root@myd-jd9x:/sys/class/leds# echo 0 > ./debug/brightness
root@myd-jd9x:/sys/class/leds# echo 1 > ./debug/brightness
root@myd-jd9x:/sys/class/leds# echo timer > ./debug/trigger
root@myd-jd9x:/sys/class/leds# echo heartbeat > ./debug/trigger
?4.2 編寫應(yīng)用程序
功能: 根據(jù)輸入?yún)?shù)來配置debug按不同模式來工作
off: 關(guān)閉
mode0: timer
mode1: heartbeat
代碼:?
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/* ./key_led /dev/input/event0 noblock */
int main(int argc, char **argv)
{int fd,bg_fd;int err, len, i;unsigned char flag;unsigned int data[1];char *bg = "/sys/class/leds/debug/trigger";struct input_event event;
if(argc>2){
printf("argv must in 0-2. \n");
return -1;
}
if(!strcmp(argv[1],"mode0")){
printf("blink mode 0. \n");
system("echo timer > /sys/class/leds/debug/trigger");
return 0;
}
if(!strcmp(argv[1],"mode1")){
printf("blink mode 1. \n");
system("echo heartbeat > /sys/class/leds/debug/trigger");
return 0;
}if(!strcmp(argv[1],"off")){
printf("blink mode off. \n");
system("echo 0 > /sys/class/leds/debug/brightness");
return 0;
}
else{
printf("blink set error. \n");
}
編譯測試:?
root@myd-jd9x:~/app# ./ledBlink_test off
blink mode off.
root@myd-jd9x:~/app# ./ledBlink_test mode0
blink mode 0.
root@myd-jd9x:~/app# ./ledBlink_test mode1
blink mode 1.
結(jié)果OK。?