arm按键处理与qt程序
ARM开发软件使用教程

ARM开发软件使用教程
二、工程创建
安装完成后,打开ARM开发软件,点击“新建工程”按钮。
在弹出的
对话框中,选择工程类型和工程名称,并选择工程保存的目录。
点击“确定”按钮完成工程创建。
三、代码编写
四、编译调试
五、调试工具
ARM开发软件提供了强大的调试工具,包括调试器、仿真器等。
通过
调试工具可以实时监测程序的运行状态、寄存器的值、内存的使用情况等。
在调试过程中,可以使用调试工具进行断点设置、变量监视等操作,以辅
助调试工作。
六、调试技巧
ARM开发软件的调试过程中,可以使用一些技巧提高调试效率。
比如,使用断点进行程序的停留,通过查看寄存器的变化情况来分析程序的运行
状态。
还可以使用观察窗口实时监测变量的值,通过调试输出窗口打印调
试信息等。
七、其他功能
除了上述基本功能外,ARM开发软件还提供了其他一些功能,如性能
分析、代码优化等。
性能分析功能可以帮助开发者找出程序的性能瓶颈,
对代码进行优化改进。
代码优化功能可以将代码进行优化,提高程序的执
行效率。
总结:。
Windows平台交叉编译ArmLinux平台的QT5.7库

Windows平台交叉编译ArmLinux平台的QT5.7库1、准备交叉编译环境环境说明:Windows 7 64位此过程需要:(1)Qt库开源代码,我使⽤的是5.7.0版本;(2)Perl语⾔环境5.12版本以上;(3)Python语⾔环境 2.7 版本以上;(4)Windows平台上的MinGW开发⼯具集(内含本地编译器gcc、g++ 4.9以上版本,⽀持c++11);(5)Windows平台上的交叉编译器arm-linux-gnueabihf(gcc、g++4.9以上版本,⽀持c++11)。
1.1、下载Qt库源代码到Qt官⽹官⽹https://www.qt.io/download-open-source/#section-2下载qt-everywhere-opensource-src-5.7.0.zip或者qt-everywhere-opensource-src-5.7.0.tar.gz。
1.2、安装Perl到Perl官⽹https:///get.html下载ActivePerl 5.12以上版本,如ActivePerl-5.24.0.2400-MSWin32-x86-64int-300560.exe。
安装完成后将安装⽬录⾥的bin⽬录路径添加到windows环境变量的PATH中。
1.3、安装Python到Python官⽹ https:///downloads/下载Python2.7以上版本,如python-3.5.2.exe。
安装完成后将安装⽬录⾥的bin⽬录路径添加到windows环境变量的PATH中。
1.4、MinGW开发⼯具集MinGW⼯具集内含编译器⼯具gcc、g++等,需要此⼯具集来编译Qt的qmake等开发⼯具,因为qmake这些开发⼯具是在本地windows上运⾏的。
要求4.9以上版本的gcc、g++,4.8以上就已经⽀持c++11。
32位系统可以到https:///projects/mingw/下载mingw-get-setup.exe后进⾏在线安装;64位系统到https:///projects/mingw-w64/下载mingw-w64-install.exe后进⾏在线安装。
QT5静态编译工程(arm交叉编译)

QT5静态编译⼯程(arm交叉编译)1、⾸先,QT编译环境默认是动态库,要编译静态程序是不可能的,所以要下载QT源码,重新编译QT编译环境2、下载QT源码(5.13版本):http://download.qt.io/development_releases/qt/5.13/5.13.0-rc/single/qt-everywhere-src-5.13.0-rc.tar.xz3、编译QT前需先配置交叉编译器: 解压源码后,进⼊源码的qtbase/mkspecs/linux-arm-gnueabi-g++⽬录,编辑⾥⾯的qmake.conf⽂件: 将⽂件⾥的arm-linux-gnueabi-都改为你⽤的交叉编译器(带路径,如果不带路径则需设置好PATH变量)⽐如改为:arm-linux-gnueabihf-4、⽤静态⽅式编译并安装QT 在源码⽬录下执⾏如下命令: ./configure -v -prefix /home/wch/Qt-5-arm -static -release -opensource -confirm-license -xplatform linux-arm-gnueabi-g++ -no-accessibility -no-dbus -no-openssl -no-opengl -no-glib -no-iconv -no-xcb -no-pch -no-compile-examples -no-pkg-config -skip qtquickcontrols -skip qtquickcontrols2 -skip qtsensors -skip qtdoc -skip qtwayland make make install 其中/home/wch/QT-5-arm是安装⽬录,根据你的情况指定;-static是指定为静态编译;-xplatform linux-arm-gnueabi-g++是说明⽬标平台是arm,其它参数根据⾃⼰的情况⾃⾏修改,各参数的含义可以⽤./configure --help命令查看 经过上⾯三步,就在指定的/home/wch/QT-5-arm⽬录下⽣成的QT的编译环境,该环境的bin⽬录下有qmake程序。
基于Qt/Embedded的ARM—Linux应用程序研究

3 ・ 3
维普资讯
基于 Q E bde A M—I u m edd的 R . x应用程序研 究 i n
可以对源 码 进 行 修 改 和 剪 裁 以适 应 自己特 定 的应 用 , 以 出现 了很 多 种 面 向嵌 入 式 应 用 的 Lnx 有 所 iu, R]nxU Lnx 还 有 目前 可 以支持 面 向 A M 核 的 1ju , C i , L u R Lnx操 作 系 统 A i x A M i x支 持 多种 iu M R Ln 。 R Ln u u
A M 芯片, R 带有大部分通用设备的驱动, 比如键盘、
鼠标 、S U B接 口等 , 开发者 只需专注 于开发 自己系统 特定 驱 动 , 即可使 整 个 系统正 常运行 , 大缩短 了开 大 发周 期 , 降低 了开发 的复杂度 。 3 Q/ m edd进 行应 用开发 的流 程 tE bde
线和 串口线相连, 最终在 主机上把应用程序编译成 A M格 式的二进制文件通过 网线或 串口传输到 目 R
标板 上运行 。 主机 与 目标 板 的连接 图如 图 2所 示。 开发环境 构 建 所 需 软 件 开 发 包 有 :nx内核 , lu i
l u 一2 4 2 一e s i x . . 1 l 一1—4—3 t ; R 交 叉 编 译 n m . rA a M
收 稿 日期 "06—0 —2 20 6 5
可从 网上下载。把这些软件包解压安装 , 在安装 时,
应配置两套开发环境, 一种是 A M 体系的, R 另一种 是 X 6体 系的 , 通过设 置 cngr 的参数 完成 。 8 这 of u i e后
作者简介 : 李佳林(90 6一)男 , 18 . , 在读硕士研究生 ; 主要研究方 向: 微机控制技术与应用。
Fedora9 下搭建Qt Creator的ARM开发环境并移植Qt4.6.3-books到mini2440

到/downloads-cn下载最新版的软件包,当前是:
1、用于 Linux/X11 32位 的 Qt Creator 2.0.0 二进制软件包Qt SDK for Linux/X11 32-bit** (371 MB)( /qtsdk/qt-sdk-linux-x86-opensource-2010.04.bin)
-no-opengl \
-no-cups \
-no-glib \
-no-xcursor -no-xfixes -no-xrandr -no-xrender \
-no-separate-debug-info \
-nomake examples -nomake tools -nomake docs \
# make
# make install
我下载的包解压后没有configure文件,需要运行autogen.sh后才能生成。
9、进入qt-everywhere-opensource-src-4.6.3-arm目录编译安装
首先先配置:
注:必须加上“-prefix /usr/local/Trolltech/QtEmbedded-4.6.3-arm ”参数, 不然安装后不在QtEmbedded-4.6.3-arm文件夹下,而是覆盖了QtEmbedded-4.6.3。
1234 dev lib opt sbin usr
Settings etc linuxrc proc sys var
bin home mnt root tmp www
5. 编译 PC 版:
进入pc目录
#./configure
# gmake
# gmake install
Windows平台交叉编译ArmLinux平台的QT5.7库

Windows平台交叉编译ArmLinux平台的QT5.7库我的环境:ubuntu14.04 64位1.下载Qt:上⽹搜索 qt-opensource-linux-x64-5.3.0.run下载有好多百度云盘qt-opensource--x64-5.6.1.run这个.run⽂件既包含了SDK也包含了IDE:QtCreator不⽤⾃⼰再编译好⼏个⼩时了2.安装Qt::1下载完⼀般在Download⽬录下$ cd ~/Downloads给⽂件运⾏权限$ chmod u+x qt-opensource-linux-x64-5.3.0.run运⾏./qt-opensource-linux-x64-5.6.1.run3.配置环境变量如果进⼊到QtCreator所在⽬录下是可以运⾏QtCreator的,但每次都这样会很⿇烦,可以将其加⼊到系统环境变量#vim /etc/profile 后⾯那个⽂件就是存放环境变量的,如果没有取得root权限这个⽂件是只读的,所以要想修改它就要先取得权限(我⽐较菜也⽐较懒直接先#su了,后⾯也不⽤#sudo xxx了)在⽂件中添加1 2 3 4export QTDIR=/opt/Qt5.3.0/Tools/QtCreatorexport PATH=$QTDIR/bin:$PATHexport MANPATH=$QTDIR/man:$MANPATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH其中/opt/Qt5.3.0是我的Qt的安装⽬录$ source /etc/profile 使修改的环境变量⽣效运⾏1# /opt/Qt5.3.0/Tools/QtCreator/bin/qtcreator电脑的qt creator已经安装好了,下⾯配置交叉编译环境参考友善之臂⼿册安装交叉编译⼯具Step1:1$ tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz -C /注意: C 后⾯有个空格,并且 C 是⼤写的,它是英⽂单词“ Change”的第⼀个字母,在此是改变⽬录的意思。
arm qt编译步骤

在使用ARM架构上编译Qt应用程序的过程中,你需要使用交叉编译工具链,该工具链能够生成适用于ARM处理器的可执行文件。
以下是通用的ARM架构上Qt 应用程序的编译步骤。
请注意,具体的步骤可能会因为Qt和工具链的版本而有所不同,因此请参考你使用的具体版本的Qt和工具链的文档。
步骤:1. 安装交叉编译工具链:首先,你需要安装适用于ARM架构的交叉编译工具链。
这个工具链包括编译器、链接器等工具,用于生成ARM平台上的可执行文件。
工具链的获取和安装方法取决于你的目标平台,你可能需要从交叉编译工具链的官方网站或者嵌入式 Linux 发行版的软件包管理器中获取。
2. 获取Qt源代码:你可以从Qt的官方网站上下载Qt的源代码。
确保下载的是适用于你目标ARM平台的版本。
3. 配置Qt编译环境:解压下载的Qt源代码,并进入源代码目录。
然后运行configure脚本,配置Qt编译环境。
在这一步,你需要指定交叉编译工具链的路径,并设置一些其他选项,如目标设备的架构和操作系统等。
请根据实际情况替换<device>和/path/to/cross-compiler。
4. 编译Qt:运行make命令,开始编译Qt。
这个过程可能会花费一段时间,具体取决于你的机器性能和编译选项。
5. 安装Qt:编译成功后,运行make install命令,将Qt安装到指定目录。
6. 编译你的Qt应用程序:现在你已经成功编译并安装了Qt库,接下来你可以使用交叉编译工具链来编译你的Qt应用程序。
这里的your_project.pro是你的Qt项目文件。
请注意,这些步骤是一个通用的概述,具体的步骤和参数可能会根据你的环境和需求而有所不同。
确保查阅Qt文档和交叉编译工具链的文档以获取更详细的信息。
qtcreator单步调试嵌入式arm程序的方法

qtcreator单步调试嵌入式arm程序的方法前言该方法配置步骤为:(1)安装gdb-multiarch。
(2)在qtcreator中配置gdb-multiarch。
(3)启动板子上的gdbserver。
(4)将qtcreator连接到板子上的gdbserver,启动单步调试。
1.安装gdb-multiarch使用“sudo apt-get install gdb-multiarch”命令安装gdb-multiarch。
安装完如图1所示。
图12.在qtcreator中配置gdb-multiarch在qtcreator中添加gdb-multiarch步骤如下。
在[工具]-[选项]中,在[Debuggers]页面中,添加gdb-multiarch,如图2和图3所示。
图2图3在[构建套件(kit)]页面中,添加gdb-multiarch对应的调试器,如图4所示。
图43.在板子上启动gdbserver将要调试的程序拷贝到板子上,如图5所示。
图5用如下指令,启动gdbserver。
gdbserver 172.24.119.123:8888 /tmp/only_only_test172.24.119.123是虚拟机的IP地址。
8888是选取的一个通信端口。
/tmp/only_only_test是板子上要调试的程序。
如图6所示。
图64.qtcreator连接gdbserver单步调试首先,确保虚拟机与板子能互相ping通,如图7所示。
图7然后,在虚拟机的qtcreator中,用Debug模式编译程序,如图8所示。
图8在虚拟机中的qtcreator中,点击[调试]-[开始调试]-[Attach to Running Debug Server...]。
参考图9进行设置。
图9设置中:✧本地执行档:虚拟机中待调试程序的存在位置。
✧Override server channel: IP地址为板子IP地址,端口号为gdbserver启动时指定的端口号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、使用定时器来实现自定义按键的读取/home/sprife/../example/tutorial/t13实现使用定时器来完成外部输入设备(按键)的操作。
Gameboard.h文件内容如下:#ifndef GAMEBOARD_H#define GAMEBOARD_H#include <QWidget>#include <QTimer>#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <QDebug>#include <errno.h>#include "lcdrange.h"#define BUTTONS_DEV "/dev/buttons"QT_BEGIN_NAMESPACEclass QLCDNumber;QT_END_NAMESPACEclass CannonField;class GameBoard : public QWidget{Q_OBJECTpublic:GameBoard(QWidget *parent = 0);protected slots:void fire();void hit();void missed();void newGame();void getButtonKey();private:QLCDNumber *hits;QLCDNumber *shotsLeft;CannonField *cannonField;QTimer *getKey;int buttons_fd;LCDRange *angle;LCDRange *force;};#endifGameboard.cpp文件内容如下:#include <QApplication>#include <QFont>#include <QGridLayout>#include <QHBoxLayout>#include <QLCDNumber>#include <QLabel>#include <QPushButton>#include <QVBoxLayout>#include "cannonfield.h"#include "gameboard.h"#include "lcdrange.h"GameBoard::GameBoard(QWidget *parent): QWidget(parent){if((buttons_fd=::open(BUTTONS_DEV,O_RDWR))<0){qDebug()<<"Error opening "<<BUTTONS_DEV<<"buttons device."; }else{qDebug()<<"Open"<<BUTTONS_DEV<<"successful.";}……getKey = new QTimer(this);connect(getKey,SIGNAL(timeout()),this,SLOT(getButtonKey()));……newGame();}……void GameBoard::getButtonKey(){int value;int key_value;fd_set rds;int ret;FD_ZERO(&rds);FD_SET(buttons_fd, &rds);ret = select(buttons_fd + 1, &rds, NULL, NULL, NULL);if (ret < 0) {qDebug("select");exit(0);}if (ret == 0) {qDebug("Timeout.\n");} else if (FD_ISSET(buttons_fd, &rds)) {ret = read(buttons_fd, &key_value, sizeof(key_value));if (ret != sizeof(key_value)) {if (errno != EAGAIN)qDebug("read buttons\n");} else {//qDebug("You pressed buttons %d\n", key_value);switch(key_value){case 1:value = angle->value();value = value+1;angle->setValue(value);break;case 2:value = angle->value();value = value-1;angle->setValue(value);break;case 3:value = force->value();value = value+1;force->setValue(value);break;case 4:value = force->value();value = value-1;force->setValue(value);break;case 5:fire();}}}}该程序运行时需要加载buttons的驱动程序,其设备文件名应当为/dev/buttons2、使用多线程机制来实现输入/输出/home/sprife/../example/tutorial/t13_thread项目实现的是使用多线程方法来完成外部输入设备(按键)的操作,其中的renderthread.h与renderthread.cpp文件实现类输入设备(按键)操作的实时监控,当有按键被按下时使用emit sendkey(key_value)来发送信号。
具体代码如下:#include <QtGui>#include <math.h>#include "renderthread.h"int buttons_fd;RenderThread::RenderThread(QObject *parent): QThread(parent){//buttons device openif((buttons_fd=::open(DEV_BUTTONS, O_RDWR))<0){qDebug()<<"Error opening "<<DEV_BUTTONS<<"BUTTONS device.";}elseqDebug()<<"Open"<<DEV_BUTTONS<<"successfull.";}RenderThread::~RenderThread(){close(buttons_fd);}void RenderThread::run(){int ret;int key_value;forever {fd_set rds;FD_ZERO(&rds);FD_SET(buttons_fd, &rds);ret = select(buttons_fd + 1, &rds, NULL, NULL, NULL);if (ret < 0) {perror("select");exit(1);}if (ret == 0) {printf("Timeout.\n");} else if (FD_ISSET(buttons_fd, &rds)) {ret = read(buttons_fd, &key_value, sizeof key_value);if (ret != sizeof key_value) {if (errno != EAGAIN)perror("read buttons\n");continue;}}emit sendKey(key_value);}}在主线程中通过启动该线程,并将该线程的触发的信号与相应的槽进行连接,完成对按键操作的相应,具体代码在gameboard.cpp文件中,文件的具体内容如下:GameBoard::GameBoard(QWidget *parent): QWidget(parent){......connect(&thread, SIGNAL(sendKey(int)),this, SLOT(readKey(int)));thread.start();……newGame();}……void GameBoard::readKey(int key_value ){if (cannonField->gameOver() || cannonField->isShooting())return;int value;switch(key_value){case 1:value = angle->value();value = value+1;angle->setValue(value);break;case 2:value = angle->value();value = value-1;angle->setValue(value);break;case 3:value = force->value();value = value+1;force->setValue(value);break;case 4:value = force->value();value = value-1;force->setValue(value);break;case 5:fire();}}程序的运行需要在程序运行前加载按钮的驱动程序,该驱动程序代码如下:#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/poll.h>#include <asm/irq.h>#include <linux/interrupt.h>#include <linux/irq.h>#include <asm/uaccess.h>#include <asm/arch/regs-gpio.h>#include <asm/hardware.h>#define DEVICE_NAME "buttons"#define BUTTON_MAJOR 232struct button_irq_desc {int irq;int pin;int pin_setting;int number;char *name;};#if 1static struct button_irq_desc button_irqs [] = {{IRQ_EINT3, S3C2410_GPF3, S3C2410_GPF3_EINT3, 0, "KEY1"}, /* K1 */{IRQ_EINT11, S3C2410_GPG3, S3C2410_GPG3_EINT11, 1, "KEY2"}, /* K5 */{IRQ_EINT9, S3C2410_GPG1, S3C2410_GPG1_EINT9, 2, "KEY3"}, /* K4 */{IRQ_EINT5, S3C2410_GPF5, S3C2410_GPF5_EINT5, 3, "KEY4"}, /* K3 */{IRQ_EINT12, S3C2410_GPG4, S3C2410_GPG4_EINT12, 4, "KEY5"}, /* K2 */};#endifstatic DECLARE_WAIT_QUEUE_HEAD(button_waitq);static irqreturn_t buttons_interrupt(int irq, void *dev_id){struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;int up = s3c2410_gpio_getpin(button_irqs->pin);if (up)key_values[button_irqs->number] = (button_irqs->number +1);elsekey_values[button_irqs->number] = (button_irqs->number +1) + 0x80;//save num labelkey_values[5] = button_irqs->number;ev_press = 1;if(up)//modify by lyjwake_up_interruptible(&button_waitq);return IRQ_RETVAL(IRQ_HANDLED);}static int qq2440_buttons_open(struct inode *inode, struct file *file){int i;int err;for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) { s3c2410_gpio_cfgpin(button_irqs[i].pin,button_irqs[i].pin_setting);err = request_irq(button_irqs[i].irq, buttons_interrupt, NULL,button_irqs[i].name, (void *)&button_irqs[i]);set_irq_type(button_irqs[i].irq, IRQT_BOTHEDGE);if (err)break;}if (err) {i--;for (; i >= 0; i--) {disable_irq(button_irqs[i].irq);free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);}return -EBUSY;}return 0;}static int qq2440_buttons_close(struct inode *inode, struct file *file) {int i;for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) { disable_irq(button_irqs[i].irq);free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);}return 0;}static int qq2440_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp){unsigned long err;int i =0;if (!ev_press) {if (filp->f_flags & O_NONBLOCK)return -EAGAIN;elsewait_event_interruptible(button_waitq, ev_press);}ev_press = 0;err = copy_to_user(buff, (const void *)&(key_values[key_values[5]]), min(sizeof(key_values), count));//modify by lyjmemset((void *)key_values, 0, sizeof(key_values));return err ? -EFAULT : min(sizeof(key_values), count);}static unsigned int qq2440_buttons_poll(struct file *file,struct poll_table_struct *wait){unsigned int mask = 0;poll_wait(file, &button_waitq, wait);if (ev_press)mask |= POLLIN | POLLRDNORM;return mask;}static struct file_operations qq2440_buttons_fops = {.owner = THIS_MODULE,.open = qq2440_buttons_open,.release = qq2440_buttons_close,.read = qq2440_buttons_read,.poll = qq2440_buttons_poll,};static int __init qq2440_buttons_init(void){int ret;ret = register_chrdev(BUTTON_MAJOR, DEVICE_NAME,&qq2440_buttons_fops);if (ret < 0) {printk(DEVICE_NAME " can't register major number\n");return ret;}printk(DEVICE_NAME " initialized\n");return 0;}static void __exit qq2440_buttons_exit(void){unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);}module_init(qq2440_buttons_init);module_exit(qq2440_buttons_exit);MODULE_AUTHOR("");MODULE_DESCRIPTION("S3C2410/S3C2440 BUTTON Driver");MODULE_LICENSE("GPL");在使用该QT程序是应当先加载按钮的驱动程序,加载的设备文件名应当为/dev/buttons。