嵌入系统开发注意事项

一. NFS
1. 关闭iptable, 否则从开发板上无法访问host上的NFS内容.
/etc/init.d/iptables stop
2. 编辑/etc/exports
增加需要export的选项,如:
/demo3                   *(rw,sync)
3. 启动nfs服务
/etc/init.d/nfs restart
ubuntu下为:
sudo /etc/init.d/nfs-kernel-server restart

二. tftp
1. atftpd
需要的话,安装一个tftpd, 如: atftpd.
ubuntu可能需要自己安装.
2. 使用xinetd
tftp是要inetd来控制的.
如果你使用的是Fedora系统,那么不用自己安装xinetd了.
如果是ubuntu系统, 就需要自己安装xinetd了.
3. 配置/etc/xinetd.conf
里面可能包含
defaults
{
        instances               = 60
        log_type                = SYSLOG authpriv
        log_on_success          = HOST PID
        log_on_failure          = HOST
        cps                     = 25 30
}
includedir /etc/xinetd.d

再查看/etc/xinetd.d, 下面可能包含了
[root@localhost ]# ls /etc/xinetd.d
chargen      cups-lpd  daytime-udp  echo-udp  gssftp  krb5-telnet  ktalk  tftp  time-udp
chargen-udp  daytime   echo         eklogin   klogin  kshell       rsync  time

看到tftp,查看它/etc/xinetd.d/tftp
service tftp
{
        disable = no
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = /tftpboot
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

其中/usr/sbin/in.tftpd -> /usr/sbin/atftpd是个符号联接.
3. /tftpboot
mkdir /tftpboot
chmod 777 /tftpboot
4. 启动xinetd服务
/etc/init.d/xinetd restart

三. NFS启动脚本简例
/sbin/ifconfig lo 127.0.0.1 up
/sbin/ifconfig eth0 192.168.1.100 netmask 255.255.255.0
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo
/sbin/route add default gw 192.168.1.1

mount -t proc none /proc
mount -t ramfs none /tmp
echo nameserver 168.95.1.1 > /tmp/resolv.conf
cd  /tmp
mkdir demo3
mount -t nfs -o nolock 192.168.1.66:/demo3 /tmp/demo3
cd bin
./sqlite test.db

四. memory查看
1. meminfo查看
先保证proc已经mount
# cat /proc/meminfo
        total:    used:    free:  shared: buffers:  cached:
Mem:  44523520 26906624 17616896        0   282624   311296
Swap:        0        0        0
MemTotal:        43480 kB
MemFree:         17204 kB
MemShared:           0 kB
Buffers:           276 kB
Active:            360 kB
Inactive:          220 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:        43480 kB
LowFree:         17204 kB
SwapTotal:           0 kB
SwapFree:            0 kB
2. top查看
Mem: 28276K used, 15204K free, 0K shrd, 436K buff, 384K cached
Load average: 0.26, 0.15, 0.05    (State: S=sleeping R=running, W=waiting)

  PID USER     STATUS   RSS  PPID %CPU %MEM COMMAND
    9 0        SW         0     1  0.0  0.0 mtdblockd
    1 0        SW         0     0  0.0  0.0 init
    4 0        RW         0     1  2.3  0.0 kswapd
  118 0        SW         0    16  0.0  0.0 sh

3. slabinfo查看
为了提高linux的效率, kernel使用了很多缓存cache, 反映在/proc/slabinfo中
# cat /proc/slabinfo
slabinfo - version: 1.1
inode_cache          212    224    480   28   28    1
dentry_cache         219    270    128    9    9    1

                  active-objects
| allocated-objects
| | object-size
| | | active-slab-allocations
| | | | total-slab-allocations
| | | | | alloc-size
| | | | | |
inode_cache 212 224  480 28 28 1 : x x
| |
limit |
batch-count
在kernel中, 分配是预先使用page_size这样的块大小来分配的,而不是要分配多少时再去分配一个大小。 kernel预先分配了一些基本大小的cache,如:
size-32
size-32(DMA)
size-64
size-64(DMA)
size-96
size-96(DMA)
size-128
size-128(DMA)
也就是说,如果一个object要分配一个60 byte的objects,那么它就可以从size-64的slab中分配(或者如果需要DMA方式访问它们,那么就可以从size-64(DMA)中分配)
这些参数在分析系统内存泄漏时是一个非常有效的方法。你会看到某个size的大小会不断增长, 而没有减小,说明有泄漏。
<think>好的,我现在需要回答用户关于Qt桌面应用程序开发中的注意事项和最佳实践的问题。首先,我需要回想一下用户提供的引用内容,看看有没有相关的信息可以借鉴。 根据用户提供的引用[2],Qt 6.8的桌面版本和嵌入式版本在目标平台、硬件支持等方面有差异。用户之前问过在Ubuntu系统上选择桌面开发是否合适,而回答中提到Qt的跨平台特性,所以可能需要强调跨平台开发注意事项。另外,用户可能关心如何优化性能、选择合适的工具集,以及遵循最佳实践来确保应用的高效和可靠。 接下来,我需要整理Qt桌面开发注意事项。首先想到的是跨平台兼容性,因为Qt支持多平台,但开发者需要注意不同系统的差异,比如文件路径、UI适配等。然后是内存管理,Qt使用对象树自动释放内存,但仍需避免内存泄漏。另外,UI设计方面,推荐使用QML和Qt Widgets,但需要根据应用类型选择,比如QML适合需要动画和现代界面的应用,而Qt Widgets适合传统桌面应用。 最佳实践方面,模块化设计、信号槽机制的正确使用、多线程处理、国际化支持等都是重点。性能优化方面,可能需要提到减少界面阻塞、合理使用模型视图编程、避免过度绘制等。此外,版本控制和持续集成对于团队协作也很重要,还有文档编写和测试策略。 需要确保回答结构清晰,分点列出注意事项和最佳实践,并且引用用户提供的引用内容,比如在提到跨平台时引用[^2],或者在性能优化时提到Qt版本的选择[^2]。同时,生成的相关问题需要与Qt开发相关,比如性能优化、跨平台适配、模块选择等。 最后,检查是否符合系统级指令:使用正确的中文,数学公式格式无误,引用标识正确,代码块使用合适的语言标记,如C++或QML示例。确保回答真实可靠,结构清晰,分步骤说明,并且生成的相关问题有针对性。</think>### Qt桌面应用程序开发注意事项与最佳实践 #### 一、注意事项 1. **跨平台兼容性** - Qt支持多平台开发,但需注意不同操作系统的文件路径(如`/`与`\`)、字体渲染差异和UI控件默认样式[^2]。例如,Linux系统下可能需要额外配置字体库。 - 避免直接调用系统API,优先使用Qt封装类(如`QFile`替代`fopen`)。 2. **内存管理** - Qt通过对象树(`QObject`父子关系)自动释放内存,但需注意: - 避免循环引用导致内存泄漏。 - 使用`QScopedPointer`或`std::unique_ptr`管理非父子关系的堆对象。 3. **UI线程与耗时操作** - 主线程(UI线程)阻塞会导致界面卡顿。耗时操作(如文件读写、网络请求)应放在子线程中,通过信号槽通信更新UI。 - 示例代码: ```cpp // 使用QThread和Worker对象 class Worker : public QObject { Q_OBJECT public slots: void doWork() { // 耗时操作 emit resultReady(); } signals: void resultReady(); }; ``` 4. **资源管理** - 使用Qt资源系统(`.qrc`文件)嵌入图片、样式表等,避免外部文件依赖。 - 释放未使用的资源(如关闭数据库连接、释放`QPixmap`缓存)。 --- #### 二、最佳实践 1. **模块化设计** - 遵循**单一职责原则**,将功能拆分为独立模块。例如: ```cpp // 数据层 class DataManager : public QObject { // 数据库操作封装 }; // 界面层 class MainWindow : public QMainWindow { // UI逻辑处理 }; ``` 2. **信号槽机制优化** - 使用`Qt::QueuedConnection`避免跨线程竞争。 - 减少高频信号(如实时数据更新)的槽函数处理耗时。 3. **UI设计与QML应用** - 对需要动态效果的界面(如仪表盘、动画),优先使用**QML**而非Qt Widgets。 - 示例QML代码: ```qml Rectangle { width: 200; height: 200 color: "blue" RotationAnimation on rotation { from: 0; to: 360; duration: 1000 loops: Animation.Infinite } } ``` 4. **性能优化** - 使用`QElapsedTimer`定位性能瓶颈。 - 模型视图编程中,对大数据集使用`QAbstractItemModel`的懒加载(`fetchMore`)。 5. **国际化支持** - 将所有用户可见文本用`tr()`包裹: ```cpp button->setText(tr("Submit")); ``` - 使用`Qt Linguist`工具生成多语言翻译文件(`.ts`)。 6. **版本控制与CI/CD** - 在`.gitignore`中排除构建目录(如`build/`)。 - 使用**Qt Creator**集成CMake或qmake,配置自动化测试和部署流程。 --- #### 三、调试与测试 1. **日志系统** - 使用`qDebug()`、`qWarning()`分级输出日志。 - 重写`qInstallMessageHandler`实现日志文件保存。 2. **单元测试** - 通过`QTest`框架编写测试用例: ```cpp void TestCalculator::testAdd() { Calculator calc; QCOMPARE(calc.add(2, 3), 5); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值