① qt嵌入式環境環境搭建,編譯出來的嵌入式庫放哪兒PC里還是開發板上
親,
您最初的想來法是正確的自,x86平台的庫放在電腦上即可。
而通過arm-linux-交叉編譯工具鏈編譯過的庫,是需要放在
開發板的文件系統裡面的,通用的做法一般是放在/lib或者/usr/lib
目錄裡面即可。或者也可放在其他目錄中,但是需要配置一下LD_LIBRARY_PATH
環境變數。例如放在/home/qtlib目錄中,由於這個不是系統默認的動態庫目錄,
需要設置環境變數LD_LIBRARY_PATH,在/etc/profile下面添加:
export LD_LIBRARY_PATH=/home/qtlib:$LD_LIBRARY_PATH
這是我以前移植qt寫的文檔,希望能有所幫助
http://hi..com/bolin_tron/item/b806c5194cebce0fe75c3669
Enjoy!
② ARMv8 Linux內核錯誤處理過程分析怎麼解決
1.1 Linux內核異常處理相關文件
Linux內核中,異常處理主要由兩個文件完成,entry.S和traps.c,當然還有一些其它異常處理函數分布於fault.c, memory.c等等。entry.S包含異常的入口、進入異常處理C函數前的壓棧、退出C函數前的出棧、一些fork函數相關的處理代碼(暫不分析)、任務切換匯編處理過程(cpu_switch_to函數,暫不分析)。traps.c主要包含異常處理C函數。
本文主要分析entry.S,對於traps.c作簡要介紹。
1.2 執行kernel_entry之前的棧
1.3 執行kernel_entry時的棧
1.4 執行kernel_exit 時的棧
1.5 entry.s代碼分析
/*
* Low-level exception handling code
*
* Copyright (C) 2012 ARM Ltd.
* Authors: Catalin Marinas <[email protected]>
* Will Deacon <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/init.h>
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/asm-offsets.h>
#include <asm/errno.h>
#include <asm/thread_info.h>
#include <asm/unistd.h>
#include <asm/unistd32.h>
/*
* Bad Abort numbers
*-----------------
*/
#define BAD_SYNC 0
#define BAD_IRQ 1
#define BAD_FIQ 2
#define BAD_ERROR 3
//根據該結構體內容
/*
struct pt_regs {
union {
struct user_pt_regs user_regs;//結構體user_pt_regs和結構體pt_regs內容一樣
struct { //共用體存儲31個通用寄存器,外加sp,pc,pstate三個特殊寄存器
//該結構體用於異常處理的壓棧彈棧操作
u64 regs[31];
u64 sp;
u64 pc;
u64 pstate;
};
};
u64 orig_x0;
u64 syscallno;
};
*/
//S_FRAME_SIZE定義在asm-offsets.c中,DEFINE(S_FRAME_SIZE,sizeof(struct pt_regs));
//即結構體pt_regs的大小,結構體pt_regs的定義見上面
//S_LR定義:DEFINE(S_LR,offsetof(struct pt_regs, regs[30]));
//即31號寄存器在結構體pt_regs中的偏移量
//閱讀以下內容請參考圖1 和圖2
.macro kernel_entry, el, regsize = 64
sub sp, sp, #S_FRAME_SIZE - S_LR // room for LR, SP, SPSR, ELR,見圖2中sp'指向的位置
.if \regsize == 32
mov w0, w0 // zero upper 32 bits of x0
.endif
/*
*.macro push, xreg1, xreg2 //壓棧兩個寄存器
*stp \xreg1, \xreg2, [sp, #-16]! //注意!!!push指令也改變sp的值!!!
*.endm
*/
push x28, x29 //進行壓棧操作,push也是一個宏定義,因為ARMv8沒有push指令,用stp代替
push x26, x27
push x24, x25
push x22, x23
push x20, x21
push x18, x19
push x16, x17
push x14, x15
push x12, x13
push x10, x11
push x8, x9
push x6, x7
push x4, x5
push x2, x3
push x0, x1 //此時sp指向位置見圖2中sp''
.if \el == 0 //如果異常級是el0,把el0的sp棧指針給x21寄存器
mrs x21, sp_el0
.else
add x21, sp, #S_FRAME_SIZE //如果異常級不是el0,把sp指針指向的地方加上pt_regs大小後的地址放入x21,
//即指向沒進入kernel_entry函數錢的sp指向的位置,見圖2中x21指向的地址
.endif
mrs x22, elr_el1 //把el1的lr寄存器給x22
mrs x23, spsr_el1 //把spsr給x23
stp lr, x21, [sp, #S_LR] //把lr,x21寄存器存入sp+S_LR指向的地方
stp x22, x23, [sp, #S_PC] //把lr,存入sp+s_PC指向的位置,用於異常返回
/*
* Set syscallno to -1 by default (overridden later if real syscall).
*/
.if \el == 0
mvn x21, xzr
str x21, [sp, #S_SYSCALLNO]
.endif
/*
* Registers that may be useful after this macro is invoked:
*
* x21 - aborted SP
* x22 - aborted PC
* x23 - aborted PSTATE
*/
.endm
.macro kernel_exit, el, ret = 0
//把此時sp(即圖2中sp'')+S_PC位置處開始的16位元組內容分別給x21,x22
//即把棧中存的x21和x22內容取出來
ldp x21, x22, [sp, #S_PC] // load ELR, SPSR
.if \el == 0
ldr x23, [sp, #S_SP] // load return stack pointer,取出
.endif
.if \ret
ldr x1, [sp, #S_X1] // preserve x0 (syscall return),如果ret=1,則保存x0,用於系統調用,暫不分析
add sp, sp, S_X2
.else
pop x0, x1 //如果ret=0,彈出x0,x1
.endif
pop x2, x3 // load the rest of the registers
pop x4, x5
pop x6, x7
pop x8, x9
msr elr_el1, x21 // set up the return data,把前面彈出的x21,x22分別賦值給elr_el1,spsr_el1
msr spsr_el1, x22
.if \el == 0
msr sp_el0, x23
.endif
pop x10, x11
pop x12, x13
pop x14, x15
pop x16, x17
pop x18, x19
pop x20, x21
pop x22, x23
pop x24, x25
pop x26, x27
pop x28, x29
ldr lr, [sp], #S_FRAME_SIZE - S_LR // load LR and restore SP,把lr彈出
eret // return to kernel,異常返回,該指令會把lr給pc,完成跳轉
.endm
.macro get_thread_info, rd
mov \rd, sp
and \rd, \rd, #~((1 << 13) - 1) // top of 8K stack
.endm
/*
* These are the registers used in the syscall handler, and allow us to
* have in theory up to 7 arguments to a function - x0 to x6.
*
* x7 is reserved for the system call number in 32-bit mode.
*/
sc_nr .req x25 // number of system calls
scno .req x26 // syscall number
stbl .req x27 // syscall table pointer
tsk .req x28 // current thread_info
/*
* Interrupt handling.
*/
.macro irq_handler
ldr x1, handle_arch_irq
mov x0, sp
blr x1
.endm
.text
/*
* Exception vectors.
*/
.macro ventry label //這里是2^7對齊,即對齊到內存地址的0x80
.align 7
b \label
.endm
.align 11
/* ENTRY也是一個宏,定義在include/linkage.h中
* #ifndef ENTRY
* #define ENTRY(name) \
* .globl name; \
* ALIGN; \
* name:
* #endif
③ 如何在Windows下構建ARM Linux QT開發環境
在PC上,需要得到兩個版本的Qt,分別是:Qt-4.5.2和QtEmbedded-4.5.2-arm。前者包括了QtDesigner等基本工具,用於在PC上對程序的開發調試,使能確保程序放到板子上之前就符合設計的要求;然後用後者的庫將調試好的程序編譯成能在arm-linux平台上運行的程序。
Qt-4.5.2用從網上下載到的qt-x11-opensource-src-4.5.2.tar.gz編譯後安裝得到;QtEmbedded-4.5.2-arm用qt-embedded-linux-opensource-src-4.5.2.tar.gz編譯後安裝得到,Qt-embedded-linux-opensource-src-4.5.2.tar.gz還可以編譯成QtEmbedded-4.5.2-X86,但不需要。在編譯qt-embedded-linux-opensource-src-4.5.2.tar.gz之前,必須准備好arm-linux-gcc交叉編譯工具,用的是arm-linux-gcc-3.4.1。
所以先要准備好的軟體包有:
Pc的操作系統是:LINUX-ubuntu8.04。
下面是具體編譯安裝過程:
1、Qt-4.5.2的獲得將qt-x11-opensource-src-4.5.2.tar.gz復制到目錄:/home/chh/Project/qt,
2、然後解壓:
#tarzxvfqt-x11-opensource-src-4.5.2.tar.gz
得到一個新目錄:qt-x11-opensource-src-4.5.2
cd進入這個目錄,准備開始編譯。
3、在終端中這樣操作:
#./configure–qvfb//編譯配置,此過程大概歷時幾分鍾;#make//正式編譯,過程漫長枯啟正,大概2個多小時;旁孫#cdtools/qvfb//進入此目錄,准備對它進行編譯#make//編譯,幾分鍾#cd../..//回到qt-x11-opensource-src-4.5.2主目錄,准備安裝#makeinstall//安裝,十幾分鍾吧;
4、此步必須以root身份完成,否則無法建立目錄
5、可以在/usr/local/下看到一個Trolltech目錄,進入該目錄發現Qt-4.5.2目錄已經出現,進入裡面的bin目錄,Designer等沒悔工具已經可以使用了。
6、編譯過程相當費時,所以可以直接拷貝已經編譯過的源碼,直接makeinstall。
7、至此,Qt-4.5.2的安裝已經順利完成。
QtEmbedded-4.5.2-arm的獲得
在編譯安裝qt-embedded-linux-opensource-src-4.5.2之前,必須先配置好arm-linux-gcc,將arm-linux-gcc-3.4.1.tar.bz2解壓到目錄:/usr/local下,此時local下出現一個名為arm的目錄,然後配置好環境變數:在/etc/profile添加一句:exportPATH=$PATH:/usr/local/arm/3.4.1/bin,保存後#source/etc/profile一下,讓它即時生效。否則下面的編譯過程會提示找不到arm-linux-gcc命令。現在可以開始編譯了:
將qt-embedded-linux-opensource-src-4.5.2.tar.gz復制到目錄:/home/chh/Project/qt,然後解壓:#tarzxvfqt-embedded-linux-opensource-src.tar.gz,得到新目錄qt-embedded-linux-opensource-src-4.5.2。
進入qt-embedded-linux-opensource-src-4.5.2目錄,首先進行configure。這里的參數很重要,必不可少的是-embeddedarm,所以最簡單的配置信息可以這樣:
./configure-embeddedarm
然後回車,就開始configure了,參數設置和參考文章一樣,裁減了很多,減少了編譯時間:
./configure-release-shared-fast-no-largefile-qt-sql-sqlite-no-qt3support-no-xmlpatterns-no-mmx-no-3dnow-no-sse-no-sse2-no-svg-no-webkit-qt-zlib-qt-gif-qt-libtiff-qt-libpng-qt-libmng-qt-libjpeg-makelibs-xplatformqws/linux-arm-g++-nomaketools-nomakeexamples-nomakedocs-nomakedemo-no-nis-no-cups-no-iconv-no-dbus-no-openssl-embeddedarm-little-endian-qt-freetype-depths16,18-qt-gfx-linuxfb-no-gfx-transformed-no-gfx-multiscreen-no-gfx-vnc-no-gfx-qvfb-qt-kbd-usb-no-glib
之後就可以編譯了,#make,漫長等待後再#makeinstall。Makeinstall還是需要root許可權。
完成後,在/usr/local/Trolltech下多了一個目錄:QtEmbedded-4.5.2-arm。
④ arm-linux交叉編譯器的路徑設置問題,怎麼辦
編輯 /etc/bashrc
在最後面加上
set PATH='/arm/2.95.3/bin/':$PATH
export PATH
然後重新登錄一下,
echo $PATH
你就可以看到 /arm/2.95.3/bin/: 在最前面
打開
/mnt/hgfs/arm--fft/linux develop/vivi/vivi 下的 Makefile
查找裡面的 ARCH ?=
把它改專為屬 ARCH ?= arm
COROSS_COMPILE ?= arm-linux-
注意: "arm-linux-" 後面沒有空格哦
你再 make 一下,應該就可以啦
⑤ 用arm-linux-gcc編譯openmotif時候,執行make後提示:makestrs.c:51:21: fatal error: X11/Xos.h:
要學會看英升拆文,已經提示你了,X11/Xos.h這個文件或者文件歲巧名不存在,檢查這個文件或吵雀棗者你的MAKEFLIE的配置
⑥ 如何在ARM Linux下使用多點觸摸屏
我在3.2內核下做的,配合Xorg 1.2.4,Xinput2,Qt5.2.1。
首先,驅動程序probe的時候要聲明成多點觸摸的:
input_set_abs_params(input, ABS_X, 0, pdata->x_res - 1, 0, 0);
input_set_abs_params(input, ABS_Y, 0, pdata->y_res - 1, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_X,
0, pdata->x_res - 1, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_Y,
0, pdata->y_res - 1, 0, 0);
error = input_mt_init_slots(input, MAX_SUPPORT_POINTS);
pdata是board-[mach].c裡面定義的platform data,如果是3.8以上的內核,你可以用device tree。
其次,提交觸摸數據的時候,要提交成多點的:
for (i = 0; i < MAX_SUPPORT_POINTS; i++)
{
type = posdata.touch[i].xh >> 6;
if (type == TOUCH_EVENT_RESERVED)
continue;
x = ((posdata.touch[i].xh << 8) | (posdata.touch[i].xl)) & 0x0fff;
y = ((posdata.touch[i].yh << 8) | (posdata.touch[i].yl)) & 0x0fff;
id = (posdata.touch[i].yh >> 4) & 0x0f;
down = (type != TOUCH_EVENT_UP);
input_mt_slot(tsdata->input, id);
input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down);
if (!down)
continue;
input_report_abs(tsdata->input, ABS_MT_POSITION_X, x);
input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y);
}
input_mt_report_pointer_emulation(tsdata->input, true);
input_sync(tsdata->input);
然後,Buildroot做根文件系統的時候要選上Target packages > Libraries > Hardware handling > mtdev和Target packages > Graphic libraries and applications (graphic/text) > X.org X Window System > X11R7 Drivers > xf86-input-evdev,網上有很多文章說如何讓X支持多點觸摸的,那都是過去式了,現在的X和xf86-input-evdev都支持多點觸摸。
最後,編譯Qt開發包的時候要加上-xinput2選項,在qtbase/examples/touch里能找到觸摸屏的樣例代碼。
⑦ Linux系統上用QT編寫ARM9繼電器控製程序的問題。 想寫個QT界面程序到arm板子上,通過界面的按鈕來控制繼電
以下是單片機實踐團為您解答:
1)既然你已經在windows下面搞qt了,轉到linux下面就沒啥編程問題了,都一樣的只是環境搭建有一點點不一樣。
2)windows下面直接用的qtsdk for windows的吧,其實是人家直接給你做好的環境,建議自己用everywhelesource自己編譯了解整個框架的結構,搞清楚windows下面如何顯示的問題就差不多清楚了。
3)啰嗦的說,windows下面你雖然能夠編譯你的代碼看到運行界面,不過我猜你沒有深入了解這個框架不是mfc他如何調用windows的顯示的,其實在linux下面道理也是一樣的。
4)下面說說要怎麼弄,主要是環境搭建,用你板子的交叉編譯器編譯qt源碼就是那個everywhelesource了,這個主要要搞清楚那個configure,進入目錄運行他生成makefile,記得configure後面要帶參數,很多的比如你的交叉編譯器。你可以用--help來看這些參數的詳細說明。這些你要找點專業的文章來看看,英文好點可以直接上官方網站看的,很詳細。
5)編譯好這個之後其實你就可以直接把windows下面的代碼拿來再次編譯就行了,不過有一點你控制繼電器的話還要你板子的gpio驅動,也就是控制引腳的,一般板子的驅動都有的。
6)如果你要模擬的話還要編譯x11版本的qt,這個主要是要得到那個虛擬顯存,用於調試用的,不用直接搞到板子上看效果,這個是x86版本提供的快捷方式,一般都用的,嗯很多的,看一些文章吧,畢竟我只能給你說個大綱蓋的。
7)再說個你這就零分,不然給你多說點,看著煩。不明白在hi我吧。