『壹』 宓屽叆寮忔搷浣滅郴缁熺戞櫘鏃堕棿
宓屽叆寮忔搷浣滅郴缁熸槸涓绉嶇壒娈婄殑鎿嶄綔绯荤粺锛屽畠琚璁捐$敤浜庡祵鍏ュ紡绯荤粺涓銆傚傛灉浣犻渶瑕丩inux杩欑被宓屽叆寮忔搷浣滅郴缁熺殑鏀鎸侊紝鍙闇杞绘澗瀹夎匧inux绯荤粺鑷宠櫄鎷熸満鎴栫‖浠惰惧囦笂锛屽苟閰嶇疆浜ゅ弶缂栬瘧鐜澧冦
🛠️寮鍙戞祦绋嬬畝杩
纭淇濆紑鍙戞澘涓庝笂浣嶆満椤虹晠閫氫俊鏄棣栬佷换鍔°傚紑鍙戞澘涓轰綘棰勭暀浜嗙綉鍙c丆OM鍙e拰骞跺彛Jtag銆傚ぇ澶氭暟鎯呭喌涓嬶紝閫氳繃COM鍙h繘琛岄氫俊锛岃╀綘鍦ㄤ笂浣嶆満鍒╃敤瓒呯骇缁堢锛圵indows鐜澧冿級鎴朚inicom锛圠inux鐜澧冿級杞绘澗鏌ョ湅鎿嶄綔绯荤粺淇℃伅銆
🔧纭浠舵惌寤哄氨缁鍚
纭浠舵惌寤哄氨缁鍚庯紝涓嬩竴姝ユ搷浣滄槸锛1️⃣ Bootloader鐨勭Щ妞嶏紝濡俇boot銆乂iVi鎴朢edboot绛夈2️⃣ 鍐呮牳绉绘嶏紝缃戜笂璧勬簮涓板瘜锛屾棤闇鎷呭咖銆3️⃣ 鏂囦欢绯荤粺绉绘嶃4️⃣ linux鐜澧冧笅鐨勯┍鍔ㄤ笌绋嬪簭璁捐°
💡鏃犻渶鎿嶄綔绯荤粺鏀鎸
鑻ヤ綘鐨勯」鐩鏃犻渶鎿嶄綔绯荤粺鏀鎸侊紝鍙闇瀹夎匒DS寮鍙戣蒋浠讹紝鐢–鎴栨眹缂栬瑷缂栧啓绋嬪簭锛屽啀閫氳繃jtag涓嬭浇鑷虫澘瀛愶紝杞绘澗鎼炲畾锛
🕰️瀹炴椂鏃堕挓璁捐
鏃犻渶澶嶆潅鎿嶄綔绯荤粺锛孋璇瑷鍗冲彲鎼炲畾锛
💥鎺㈢储宓屽叆寮忔搷浣滅郴缁熺殑濂ョ
宓屽叆寮忔搷浣滅郴缁熸槸涓绉嶇壒娈婄殑鎿嶄綔绯荤粺锛屽畠琚璁捐$敤浜庡祵鍏ュ紡绯荤粺涓銆傚揩鏉ュ姞鍏ユ垜浠锛屼竴璧锋帰绱㈠祵鍏ュ紡鎿嶄綔绯荤粺鐨勫ゥ绉樺惂锛
『贰』 在linux系统中进行编程的具体流程是什么麻烦说具体点,谢谢喽
中使用Linux开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过如下的过程:
1.建立开发环境
操作系统一般使用RedHat-Linux,版本从7到9都可以,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(例如arm-Linux-gcc、arm-μclibc-gcc),或者安装产品厂家提供的交叉编译器。
2.配置开发主机
配置MINICOM,一般的参数为波特率为115 200bps,数据位为8位,停止位为1,无奇偶校验,软件硬件流控设为无。在Windows下的超级终端的配置也是这样的。MINICOM软件的作用是作为调试嵌入式开发板的信息输出的监视器和键盘输入的工具。配置网络,主要是配置NFS网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。
3.建立引导装载程序BOOTLOADER
从网络上下载一些公开源代码的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据自己具体的芯片进行移植修改。有些芯片没有内置引导装载程序,例如三星的ARM7、ARM9系列芯片,这样就需要编写开发板上Flash的烧写程序,网络上有免费下载的Windows下通过JTAG并口简易仿真器烧写ARM外围Flash芯片的烧写程序,也有Linux下的公开源代码的J-Flash程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是系统正常运行的第一步。如果购买了厂家的仿真器当然比较容易烧写Flash,这对于需要迅速开发自己产品的人来说可以极大地提高开发速度,但是其中的核心技术是无法了解的。
4.下载别人已经移植好的Linux操作系统
如μCLinux、ARM-Linux、PPC-Linux等,如果有专门针对所使用的CPU移植好的Linux操作系统那是再好不过的,下载后再添加自己的特定硬件的驱动程序,进行调试修改,对于带MMU的CPU可以使用模块方式调试驱动,对于μCLinux这样的系统则需编译进内核进行调试。
5.建立根文件系统
从下载使用BUSYBOX软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他程序。默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc目录下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等,自动挂装文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用mkcramfs、genromfs等工具产生烧写映像文件。
6.建立应用程序的Flash磁盘分区
一般使用JFFS2或YAFFS文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性Flash(NOR型)512KB~32MB,有的系统使用非线性Flash(NAND型)8~512MB,有的两个同时使用,需要根据应用规划Flash的分区方案。
7.开发应用程序
应用程序可以放入根文件系统中,也可以放入YAFFS、JFFS2文件系统中,有的应用不使用根文件系统,直接将应用程序和内核设计在一起,这有点类似于μCOS-II的方式。
8.烧写内核、根文件系统、应用程序
9.发布产品
另外,站长团上有产品团购,便宜有保证
『叁』 做一个嵌入式Linux系统究竟要做哪些工作
1、Linux 基础
安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统
能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务
Shell 编程基础使用vi编辑文件 使用Emacs编辑文件 使用其他编辑器
2、Shell 编程基础
Shell简介 认识后台程序Bash编程熟悉Linux系统下的编辑环境 熟悉Linux下的各种Shell 熟练进行shell编程熟悉vi基本操作
熟悉Emacs的基本操作 比较不同shell的区别 编写一个测试服务器是否连通的shell脚本程序 编写一个查看进程是否存在的shell脚本程序
编写一个带有循环语句的shell脚本程序
3、Linux 下的C 编程基础
linux C语言环境概述 Gcc使用方法 Gdb调试技术 Autoconf Automake Makefile 代码优化
熟悉Linux系统下的开发环境 熟悉Gcc编译器 熟悉Makefile规则编写Hello,World程序 使用 make命令编译程序 编写带有一个循环的程序
调试一个有问题的程序
4、嵌入式系统开发基础
嵌入式系统概述交叉编译 配置TFTP服务 配置NFS服务 下载Bootloader和内核
嵌入式Linux应用软件开发流程熟悉嵌入式系统概念以及开发流程 建立嵌入式系统开发环境制作cross_gcc工具链 编译并下载U-boot
编译并下载Linux内核 编译并下载Linux应用程序
5、嵌入式系统移植
Linux内核代码 平台相关代码分析 ARM平台介绍 平台移植的关键技术 移植Linux内核到 ARM平台 了解移植的概念
能够移植Linux内核移植Linux2.6内核到 ARM9开发板
6、嵌入式 Linux 下串口通信
串行I/O的基本概念 嵌入式Linux应用软件开发流程 Linux系统的文件和设备 与文件相关的系统调用 配置超级终端和MiniCOM
能够熟悉进行串口通信 熟悉文件I/O 编写串口通信程序 编写多串口通信程序
7、嵌入式系统中多进程程序设计
Linux系统进程概述 嵌入式系统的进程特点 进程操作 守护进程 相关的系统调用了解Linux系统中进程的概念 能够编写多进程程序编写多进程程序
编写一个守护进程程序 sleep系统调用任务管理、同步与通信 Linux任务概述任务调度 管道 信号 共享内存 任务管理 API 了解Linux系统任务管理机制
熟悉进程间通信的几种方式 熟悉嵌入式Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输 编写一个使用共享内存的程序
8、嵌入式系统中多线程程序设计
线程的基础知识 多线程编程方法 线程应用中的同步问题了解线程的概念 能够编写简单的多线程程序编写一个多线程程序
9、嵌入式 Linux 网络编程
网络基础知识 嵌入式Linux中TCP/IP网络结构 socket 编程 常用 API函数 分析Ping命令的实现 基本UDP套接口编程 许可证管理
PPP协议 GPRS 了解嵌入式Linux网络体系结构 能够进行嵌入式Linux环境下的socket 编程 熟悉UDP协议、PPP协议 熟悉GPRS
使用socket 编写代理服务器 使用socket 编写路由器 编写许可证服务器 指出TCP和UDP的优缺点 编写一个web服务器 编写一个运行在
ARM平台的网络播放器
10、GUI 程序开发
GUI基础 嵌入式系统GUI类型 编译QT 进行QT开发熟悉嵌入式系统常用的GUI 能够进行QT编程使用QT编写“Hello,World”程序
调试一个加入信号/槽的实例 通过重载QWidget 类方法处理事件
11、Linux 字符设备驱动程序
设备驱动程序基础知识 Linux系统的模块 字符设备驱动分析 fs_operation结构 加载驱动程序了解设备驱动程序的概念
了解Linux字符设备驱动程序结构 能够编写字符设备驱动程序编写Skull驱动 编写键盘驱动 编写I/O驱动 分析一个看门狗驱动程序
对比Linux2.6内核与2.4内核中字符设备驱动的不同Linux 块设备驱动程序块设备驱动程序工作原理 典型的块设备驱动程序分析
块设备的读写请求队列了解Linux块设备驱动程序结构 能够编写简单的块设备驱动程序比较字符设备与块设备的异同 编写MMC卡驱动程序 分析一个文件系统
对比Linux2.6内核与2.4内核中块设备驱动的不同
12、文件系统
虚拟文件系统 文件系统的建立 ramfs内存文件系统 proc文件系统 devfs 文件系统 MTD技术简介 MTD块设备初始化
MTD块设备的读写操作了解Linux系统的文件系统 了解嵌入式Linux的文件系统 了解MTD技术 能够编写简单的文件系统为 ARM9开发板添加 MTD支持
移植JFFS2文件系统 通过proc文件系统修改操作系统参数 分析romfs 文件系统源代码 创建一个cramfs 文件系统
无论选择哪一方向,基本的linux的知识是需要具备的,其他还需要掌握的知识有ARM(最常用的一款嵌入式处理器)和C语言编程,每一方面知识的掌握熟练程度都最终决定了个人进行嵌入式linux开发的综合能力。
更多详情来源:《华清远见嵌入式学院》
『肆』 如何在linux下用gtk开发图形界面应用程序
* 使用 GTK+ 和 Glade 快速开发 Linux 图形界面
** GTK+ 简介
*** 基本概念
GTK+ 是一种用于创建图形界面的库. 嗯, gnome 用的就是它, 不过并不是说只
有在 gnome 环境中才能用, 只要系统上装有 GTK 的库 (基本上有图形系统的个
人机都会有的啦) 就能运行基于 GTK 的程序. 除了 UNIX-like 平台, 它还移植
到 windows 上, 还有面向嵌入设备的 framebuffer 版本等等.
GTK 依赖两个重要的库. 一个是 GLib, 这并不是一个图形库, 也和 glibc 不同
, 它大抵上提供了一些接口以屏蔽系统的不同, 比如 gint 在哪里都是 32bit
的, 等等; 另一个是 GDK, 它是一个设备无关的图形库, 支持基本的画点, 以及
与窗口管理器沟通等任务, 由于 GTK 被设计成能在各个平台, 而非仅仅在
XWindow 环境下使用, 所以这个库也是必要的. 而在他们上面的 GTK 库, 就提
供了一些 widget --- 可以理解为控件啦, 不过窗口也是一个 widget 的说, 给
我们使用, 并提供了包装良好的事件响应机制.
*** GTK+ 开发基础
要开发基于 GTK 的软件, 必须先安装 GTK+ 的开发包. 检查是否正确安装的办
法是在安装后执行 ``pkg-config --cflags --libs gtk+-2.0'', 如果安装不正
确, 会提示找不到相应的包.
GTK 本身是基于 C 的库, 当然也有 C++ 等语言的 wrap, 但它的整个体系是面
向对象的. 其最基本的类是 GObject, GtkObject 继承了它, GtkObject 又派生
出我们最经常用到的 GtkWidget, 我们使用的所有窗体控件都派生于它. 于是,
在 C 环境中我们就要手动处理这些类转换, GTK 和底层的 GLib 等提供了一种
统一的转换方法, 比如把类型为 GtkWidget* 的 button 转换成 GtkButton 形,
写法是: GTK_BUTTON(button), 就酱子.
我不打算在这里列一个 GTK 的 hello world 占页面, 这个程序随便 google 一
下就能找到. 我们可以自己想一想一个图形界面应该如何建立.
首先我们要进行初始化, GTK 提供了 gtk_init() 作为初始化, 它检查程序参数
中的一些特定部分, 进行自己的设置. 调用方法如下:
gtk_init(&argc, &argv);
将 argc 和 argv 传指针的目的是 gtk_init 会对他们进行加工, 把 GTK 自己
用到的一些参数抽取出来.
接着, 我们必须要创建这些控件吧, GTK 中, 创建一个控件会返回一个
GtkWidget 类型 (或它的派生类) 的指针, 所有创建控件的函数的格式是
gtk_控件类型_new(参数表). 比如创建一个窗口的写法是:
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
然后, 我们要设定事件响应函数, GTK 中的事件叫做 signal. GTK 的事件响应
函数接口应该是类似这样的
void
destroy(GtkWidget *widget, gpointer data)
我们把它连入到一个控件中的方法是这样的
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
应该很好理解吧.
我们创建的咚咚, 要说明他们的位置和包含关系, GTK 用 container 来解决这
个问题, 它可以保证在窗口缩放的时候控件的摆放依然合理, container 的具体
使用不详细说, 后面经常要跟 container 打交道, 但基本上不用管 C 代码, 嗯
. 不过其实我们的任何的可视控件都继承自 container, 比如 button 也是一个
container, 它很多时候装的是一个 GtkLabel, 也就是用来显示纯文本的控件,
于是我们就能见到一个文本按钮, 嗯. 使用 container 的方法如下.
gtk_container_add(GTK_CONTAINER(window), button);
这样 button 就会占满整个 window 的控件, 我们后面可以看到可以用
GtkVBox, GtkHBox 等 container 分隔窗体.
好了, 我们可以准备启动程序了, 我们可以用 gtk_widget_show() 来显示各个
控件, 然后我们就应该进入到所谓的事件响应循环了, 这就要使用 gtk_main().
在程序运行过程中, 我们要操纵控件, 比如说我们要在一个 entry 控件(文本框
) 中取出其中的文字, 这样的操作使用 gtk_控件类型_动作(对象, 参数) 的形
式完成的, 比如刚才所说的任务, 做法是 gtk_entry_get_text(entry).
顺便讲讲 GTK 程序的退出, 关闭 GTK 的窗口 (即使是所有窗口) 也不代表程序
退出, 因为那说到底只是一个界面而已, 我们当然可以使用 exit() 的自爆法退
出, 但最好还是给 GTK 一个料理后事的机会, 在主窗口的 destroy 事件响应函
数上用 gtk_main_quit() 就好了.
编译 GTK 程序的办法也很简单.
gcc -o foo foo.c `pkg-config --cflags --libs gtk+-2.0`
** 使用 Glade 快速定制用户界面
好了, 说了一堆有的没的, 如果我现在说我上面说的那一堆中的大部分我们都不
会用到, 是不是觉得偶很歉扁? 前面的介绍只是给大家 GTK 这个库的一些基本
概念, 概念就好了, 我们倒真的不用拿这些来编程的. 想想, 一个复杂一点的界
面, 十几个控件, 再加上各种各样的 container, 自己挂事件, 再加上超常的命
名, 想想都恐怖.
这时候, Glade 横空出世了! 这是一个可视化的界面编辑器 --- 但它仅仅是一
个界面编辑器而已, 甚至连代码编辑框也没有给出. 先不管了, 打开 glade (安
装省略, 饶了我把, 记得装 libglade-dev), 应该很好懂了, 指指点点就能弄好
一个界面, 然后在属性窗的信号一栏中选取需要的信号, 设定响应函数, 非常好
弄.
玩了几分钟, 问题来了, 怎么把它变为程序啊? 提供类似功能的 IDE 如
Borland C++ Builder, 在点击创建新控件的时候, 我们能即使在代码窗看到自
动生成的代码, Glade 也可以采用这种形式, 在设计好界面并保存后, 按一下主
窗口的 build 按钮, 它就自动生成了界面代码, 根本不用自己写的. 打开代码
目录, callbacks.c 里已经有自动创建的事件响应的空函数, 在里面填处理, 然
后 configure make 就行了.
但是, 这样的开发方式还是有问题的. 第一, 自动生成的代码非常复杂, 可是很
多时候我们还是不能完全不看它, 处理和界面是混在一起了, 理解他们变得困难
; 其二, 由于以上的原因, 修改界面变得非常痛苦; 其三, 它给你生成那堆有的
没的配置文件不一定是你想要的.
因此 glade 提供了另一种方法, glade 编辑所得的 .glade 文件是一个 XML 文
件, 其实它已经完整地描述了界面, 我们能否采用一种简单的方式直接载入, 配
置它呢. 这样做, 我们的代码中就真真正正地去处了烦人的界面生成代码, 而专
注于处理部分了.
libglade 正是由于这个而来, 它能很好地完成上面所说的工作. 当我们用
glade 创建了一个 .glade 界面后, 用这种方法我们就可以建立界面, 运行程序
了.
#include <gtk/gtk.h>
#include <glade/glade.h>
GladeXML *GUI;
int
main(int argc, char **argv)
{
gtk_init(&argc, &argv);
/* load the interface */
GUI = glade_xml_new("frame.glade", NULL, NULL);
/* connect the signals in the interface */
glade_xml_signal_autoconnect(GUI);
/* start the event loop */
gtk_main();
return 0;
}
剩下的事情很简单, 如果你的 button 的 clicked 控件有一个响应函数
on_button_clicked, 你写
void
on_button_clicked(GtkWidget *widget, gpointer data)
{
// balabalabala
}
就可以了. 所以, 上面讲的一堆创建界面的方法, 其实大部分时候都用不着.
由于用到了 libglade, 我们的编译方法变为
gcc -o foo foo.c `pkg-config --cflags --libs libglade-2.0`
** 开发举例
一个很简单的程序, 密码学对称加密算法要用到的, 如果说是界面, 就是三个文
本框: 明文, 密码, 密文, 三个按钮, 加密, 解密, 清除, 完了. 为了实验众多
的算法, 我们加了一个下拉窗口, 用来选择算法. 我把它设计成一个 wrapper
和框架, 它不实现任何算法, 只是在界面中获取用户输入, 调用外部程序, 并把
结果显示出来而已. 这样, 实际的算法实现可以用纯 C 写的文本界面程序完成,
移植起来很方便, 在 windows 随便做个一样的界面做前端就整个移植过去了.
于是, 我们需要的窗体元素是 GtkEntry, GtkComboBoxEntry, GtkButton, 查查
手册, 我们用到的界面相关的函数只有以下几个:
- gtk_entry_get_text(), 用于获取文本框输入
- gtk_entry_set_text(), 用于在文本框中显示结果
- gtk_combo_box_get_active_text(), 用于在 ComboBoxEntry (派生自
ComboBox) 取出用户选中的算法.
另一个问题是, 他们都需要相应的对象指针做参数, 这应该怎样获得呢? 我们使
用 glade_xml_get_widget(GUI, "控件名") 就能取得控件了.
『伍』 嵌入式linux系统开发的具体步骤
第一步、建立交叉编译环境
没有交叉开发经验的读者,可能一时很难接受这个概念。首先,要明白两个概念:一般
我们工作的机器,称为开发机、主机;我们制作好的系统将要放到某台机器,如手机或另一
台PC机,这台机我们称为目标主机。
我们一般开发机上已经有一套开发工具,我们称之为原生开发套件,我们一般就是用它
们来写程序,那么,那什么又是交叉编译环境呢?其实一点也不神秘,也就是在开发机上再
安装一套开发工具,这套开发工具编译出来的程序,如内核、系统工作或者我们自己的程序,
是放在目标主机上运行的。
那么或许有初学者会问,直接用原生开发工具为目标主机编译程序不就完了?至少我当
初是这么想的。一般来说,我们的开发机都是X86 平台,原生开发套件开发的工具,也针
对X86 平台,而我们的目标主机可能是PowerPC、IXP、MIPS……所以,我们的交叉编译
环境是针对某一类具体平台的。
一般来讲,交叉开发环境需要二进制工具程序、编译器、C链接库,嵌入式开发常用的
这三类软件是:
Binutils
Gcc
uClibc
当然,GNU包含的工具套件不仅于此,你还要以根据实际需要,进行选择
第二步、编译内核
开发工具是针对某一类硬件平台,内核同样也是。这一步,我们需要用第一步中建立的
工具,对内核进行编译,对于有内核编译经验的人来说,这是非常简单的;
第三步、建立根文件系统
也就是建立我们平常看到的bin、dev、proc……这一大堆目录,以及一些必备的文件;
另外,我们还需要为我们的目标系统安装一些常用的工具软件,如ls、ifconfig……当然,
一个办法是找到这些工具的源代码,用第一步建立的交叉编译工具来编译,但是这些软件一
是数量多,二是某些体积较大,不适合嵌入式系统,这一步,我们一般都是用busybox来完
成的,包括系统引导软件init;
最后,我们为系统还需要建立初始化的引导文件,如inittab……
『陆』 求嵌入式linux开发详细流程(步骤)
建立以Linux系统为基抄础的开发袭环境;
配置开发主机(MINICOM调试嵌入式开发板、NFS网络文件系统,防火墙);
建立引导装载程序BOOTLOADER(公开源代码的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等);
下载别人已经移植好的Linux操作系统(如μCLinux、ARM-Linux、PPC-Linux等);
建立根文件系统(包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等);
建立应用程序的Flash磁盘分区,一般使用JFFS2或YAFFS文件系统;
开发应用程序,应用程序可以放入根文件系统中,也可以放入YAFFS、JFFS2文件系统中;
烧写内核、根文件系统、应用程序、发布产品。