Linux驱动开发(一)---环境搭建与hello world

54 篇文章 37 订阅
22 篇文章 80 订阅

学无止境

今天开始学习一下驱动开发。之前也写过一些内核模块的东西,但是没有系统的了解过驱动的工作方式,这次来学习一下,学习的资料来自于b站韦东山老师的视频,总结一下学习的心得体会。
感谢韦老师的无私奉献

70天30节Linux驱动开发快速入门系列课程【实战教学、技术讨论、直播答疑】

在这里插入图片描述

环境搭建

先来用Ubuntu学习一下,先入个门吧。
如果要开发驱动,必须要先安装内核头文件,用如下命令。

apt-cache search linux-headers-$(uname -r) // 确认有没有 
sudo apt-get install linux-headers-$(uname -r) // 下载安装

开发环境就安装好了,就在/lib/modules下
在这里插入图片描述
如此简单
在这里插入图片描述

Hello World

就是直接上hello world吧,迈出第一步。

#include<linux/init.h>    
#include<linux/kernel.h>  
#include<linux/module.h>  
  
static int __init hello_init(void)
{
    printk("hello world\n");
    return 0;
}
 
static void __exit hello_exit(void)
{
    printk("hello driver exit\n");
}
module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");

Makefile

ARCH=x86
CROSS_COMPILE=

KVERSION = $(shell uname -r)
KERN_DIR =  /lib/modules/$(KVERSION)/build 

all:
	make -C $(KERN_DIR) M=`pwd` modules 

clean:
	make -C $(KERN_DIR) M=`pwd` modules clean
	rm -rf modules.order

obj-m	+= helloworld.o

清空dmesg,

sudo dmesg -c

然后编译运行,

xxx@ubuntu:~/work/driver$ make
make -C /lib/modules/5.3.0-28-generic/build  M=`pwd` modules 
make[1]: Entering directory '/usr/src/linux-headers-5.3.0-28-generic'
  CC [M]  /home/xxx/work/driver/helloworld.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/xxx/work/driver/helloworld.mod.o
  LD [M]  /home/xxx/work/driver/helloworld.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.3.0-28-generic'

加载模块

sudo insmod helloworld.ko

查看模块

xxx@ubuntu:~/work/driver$ lsmod |grep helloworld
helloworld             16384  0

查看内核打印

xxx@ubuntu:~/work/driver$ dmesg     
[14799.880719] hello world

卸载模块

sudo rmmod helloworld

最简单的内核模块就基本完成了。虽然没什么作用,但至少已经从用户态,走进了内核了
在这里插入图片描述

代码解释

在这里插入图片描述
这也没啥能解释的了,太简单了。

内核源码

我们可以下载 一份内核源码来查看所有函数的源码,
《下载地址》
然后配合source insight,就可以查看到函数的源码了。

拓展一下

来一段简单的数据交互,从用户态传递字符串进来,在内核保存一下,然后再读出去。
深入了啊
在这里插入图片描述

驱动部分代码:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/device.h>

static int major = 0;
static char sdata[64] = {0};
static int sdatalen=0;
static struct class *class_for_hello;

static ssize_t hello_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
{
	printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
	copy_to_user(buf, sdata, sdatalen);
	return sdatalen;
}

static ssize_t hello_write (struct file *file, const char __user *buf, size_t size, loff_t *offset)
{
	printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
	sdatalen=size;
	copy_from_user(sdata, buf, sdatalen);
	return sdatalen;
}



static struct file_operations hello_fops = {
	.owner		= THIS_MODULE,
	.read       = hello_read,
	.write      = hello_write,
};

int __init hello_init(void)
{
	printk("hello drv init\n");
	major = register_chrdev(0, "hello_drv", &hello_fops);
	
	class_for_hello = class_create(THIS_MODULE, "helloclass");
	device_create(class_for_hello, NULL, MKDEV(major, 0), NULL, "hellodev"); /* /dev/hellodev*/
	
	return 0;
}

void __exit hello_exit(void)
{
	printk("hello drv exit\n");
	device_destroy(class_for_hello, MKDEV(major, 0));
	class_destroy(class_for_hello);
	unregister_chrdev(major, "hello_drv");

}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");



解释一下核心部分

	class_for_hello = class_create(THIS_MODULE, "hellodev");
	device_create(class_for_hello, NULL, MKDEV(major, 0), NULL, "hellodev"); /* /dev/myled */

这里是为了创建/dev/hellodev设备,这个设备就是用户态与内核态交互的地方,看成一个文件,但是操作要比普通文件多一些。不过这里只用了read和write

	device_destroy(class_for_hello, MKDEV(major, 0));
	class_destroy(class_for_hello);

退出的时候记得删掉class和device。

	copy_from_user(sdata, buf, sdatalen);
	copy_to_user(buf, sdata, sdatalen);

内核的数据与用户态的数据,通过这两个函数进行传递,不能直接访问用户态的buf指针。
否则就很容易内核崩溃
在这里插入图片描述

用户态代码


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

/*
 * ./userapp -w abc
 * ./userapp -r
 */
int main(int argc, char **argv)
{
	int fd;
	char buf[1024];
	int len;
	int ret;
	
	/* 1. 判断参数 */
	if (argc < 2) 
	{
		printf("Usage: %s -w <string>\n", argv[0]);
		printf("       %s -r\n", argv[0]);
		return -1;
	}

	/* 2. 打开文件 */
	fd = open("/dev/hellodev", O_RDWR);
	if (fd == -1)
	{
		printf("can not open file /dev/hellodev\n");
		return -1;
	}
	
	printf("open file /dev/hellodev ok\n");

	/* 3. 写文件或读文件 */
	if ((0 == strcmp(argv[1], "-w")) && (argc == 3))
	{
		len = strlen(argv[2]) + 1;
		len = len < 1024 ? len : 1024;
		ret = write(fd, argv[2], len);
		printf("write driver: %d\n", ret);
	}
	else
	{
		len = read(fd, buf, 1024);		
		printf("read driver: %d\n", len);
		buf[1023] = '\0';
		printf("APP read : %s\n", buf);
	}
	
	close(fd);
	
	return 0;
}

这个就没啥解释的,就是读写文件的标准操作。
在这里插入图片描述

操作

编译加载内核

root@ubuntu:/home/xxx/work/driver/2# make
make -C /lib/modules/5.4.0-120-generic/build  M=`pwd` modules 
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-120-generic'
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-120-generic'
root@ubuntu:/home/xxx/work/driver/2# ls
hello_drv_test.c  helloworld2.c  helloworld2.ko  helloworld2.mod  helloworld2.mod.c  helloworld2.mod.o  helloworld2.o  Makefile  modules.order  Module.symvers  userapp
root@ubuntu:/home/xxx/work/driver/2# insmod helloworld2.ko

此时可以看到/dev/下就出现了我们的hellodev的文件

root@ubuntu:/home/xxx/work/driver/2# ll /dev/hellodev 
crw------- 1 root root 240, 0 Jun 27 19:16 /dev/hellodev

然后就可以编译用户态程序

root@ubuntu:/home/xxx/work/driver/2# gcc -o userapp hello_drv_test.c 
root@ubuntu:/home/xxx/work/driver/2# ./userapp -w hello
open file /dev/hellodev ok
write driver: 6
root@ubuntu:/home/xxx/work/driver/2# ./userapp -r
open file /dev/hellodev ok
read driver: 6
APP read : hello

完美
在这里插入图片描述

结束语

这几天学这个,倒是感觉把单片机的内容要融合过来了,应用与内核驱动,再到硬件,好像可以串起来了,真是越来越有意思了。
在这里插入图片描述
其实刚开始学了一段时间之后,确实会有不懂的地方,慢慢理解,多看看代码和视频,把关键的点理解掉,就避免了从入门到放弃了。学习就是这样,肯定有难点,慢慢吃透就可以。
故乡的雷霆风暴结束了,好像也没听到什么结果……
樱岛火山也爆发了,好像也没有我们想听的结果……
在这里插入图片描述

  • 12
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
第一章 嵌入式系统............................................................ 1 1.1 嵌入式系统概述........................................................... 1 1.2 嵌入式处理器............................................................. 1 1.3 嵌入式操作系统........................................................... 3 1.4 GEC2410B 嵌入式教学平台介绍.............................................. 6 1.5 GEC2410B 教学平台的使用.................................................. 15 第二章 ADS集成开发环境的使用................................................ 21 2.1 ADS 集成开发环境介绍.....................................................21 2.2 使用ADS创建工程........................................................ 24 第三章 ARM验................................................................ 32 3.1 ARM基础实验............................................................. 32 3.1.1 ARM汇编指令编程实验................................................... 32 3.1.2 Thumb和ARM指令混合编程实验........................................... 41 3.1.3 C和ARM汇编混合编程实验............................................... 49 3.1.4 外部中断应用实验...................................................... 57 3.1.5 看门狗定时器应用实验.................................................. 68 3.1.6 PWM控制蜂鸣器实验..................................................... 74 3.1.7 ARM启动及工作模式切换实验............................................. 85 3.1.8 串口通信应用实验...................................................... 91 3.1.9 4X4键盘控制实验...................................................... 102 3.1.10 实时时钟设计实验.................................................... 108 3.1.11 IIC总线应用实验..................................................... 109 3.1.12 Nor flash应用实验................................................... 132 3.1.13 Nand flash应用实验.................................................. 146 3.1.14 ADC应用实验......................................................... 170 3.1.15 VGA显示实验......................................................... 181 3.1.16 IIS音频总线实验..................................................... 187 3.1.17 TFT 液晶屏显示实验................................................... 197 3.1.18触摸屏控制实验....................................................... 212 3.1.19 汉字字符显示实验.....................................................225 3.1.20 红外模块控制实验.....................................................229 3.1.21 直流电机控制实验.....................................................240 3.1.22 步进电机控制实验.....................................................246 3.1.23 RS485 接口通信实验...................................................252 3.2 ARM高级实验 258.........................................................258 3.2.1 TFTP 以太网通讯.......................................................258 3.2.2 USB设备实验...........................................................269 3.2.3 SD卡接口应用实验......................................................297 3.2.4 GPS定位实验...........................................................310 3.2.5 GPRS/GSM 通讯实验.....................................................318 3.2.6 并口打印机驱动设计实验................................................328 第四章 实时操作系统实验.....................................................335 4.1 NUCLEUS PLUS 在S3C2410A 上的移植....................................... 335 4.2 NUCLEUS PLUS 基于S3C2410A 的实验........................................345 4.3 UCOS-II在GEC2410上的移植..............................................352 4.4 UCOS-II应用程序设计....................................................355 第五章 嵌入式LINUX实验 ....................................................361 5.1 搭建嵌入式LINUX实验平台................................................361 5.2 嵌入式LINUX开发与调试..................................................371 5.3 U-BOOT在GEC2410上的移植................................................375 5.4 嵌入式LINUX内核移植定制与编译..........................................386 5.5 嵌入式LINUX根文件系统的制作............................................395 5.6 嵌入式LINUX的LED驱动程序设计..........................................401 5.7 嵌入式GUI开发..........................................................410 第六章 嵌入式WINDOWS CE系统................................................424 6.1 WINDOWS CE的安装........................................................424 6.2 定制嵌入式WINDOWS CE平台...............................................427 6.3 HELLO WORLD实现.........................................................432 6.4 使用ACTIVESYNC连接GEC2410B与PC机.....................................435
移动是IT发展未来 !嵌入式底层就是移动的发展未来 !如何在这个风云际会的时代,让自己积极的参与其中,作为程序员 ,嵌入式是无可避免的选择 !嵌入式底层驱动开发技术含量较高,掌握Android从应用开发,到系统移植,再到设备驱动开发的全套技术,无疑会极大的提升自己的职业竞争力和薪酬谢水平 ,本课程深入浅出,手敲全部实战项目代码,经历软硬件结合的嵌入式项目开发全部过程,而且课程中不仅仅讲解技术,更关注大家的职业生涯和发展,关注企业规模化工作中的模式。 1.课程研发环境 本课程包括JAVA应用、C语言驱动、NDK(应用调用驱动)等方面内容,课程涉及主要工具如下: 开发工具:Eclipse、Source Insight 交叉编译工具:arm-linux-gcc 4.5.1 其他工具:SecureCRT、Minitools、VMware等都会提供与项目匹配的安装程序,并且是破解版 2.内容简介 本教程共分五大部分内容,1 Android应用开发 2 Android系统移植 3 Cortex a8裸机接口开发 4 Android设备驱动开发 5 综合项目实战。第一部分课程从最基础的Android应用开发环境搭建开始,简单讲解了Android界面及事件处理之后,深入剖析Android Handler多线程机制,重点讲解Android NDK应用层与驱动的通信; 第二部分内容,先简单讲解Android系统移植相关原理,然后一步步手把手教大家如何进行Linux内核移植、Android源码编译、以及Android到Cortex A8开发板的移植;第三部分内容,先教大家如何搭建裸机开发环境,然后带领大家一起阅读三星的芯片手册,并编写了LED、蜂鸣器、按键、中断、串口UART、实时时钟RTC、定时器PWM、模数转换ADC等裸机驱动;第四部分,讲解了Linux设备驱动开发环境搭建内核开发相关理论,然后将裸机下的接口驱动移植到Android环境下,并通过NDK和JAVA界面测试通过;第五部分,通过一个实战项目,综合应用各个模块的知识,为毕业设计 、项目研发和高新就业提供了很好的保障。 一、Android应用开发: 第1节:基于ARM Cortex-A8和Android 4.x的联动报警系统课程概述.zip 第2节:Android 4.x应用开发环境搭建.zip 第3节:Android程序结构.zip 第4节:Android界面布局.zip 第5节:Activity.zip 第6节:Android事件处理.zip 第7节:Android多线程.zip 第8节:Handler消息传递机制.zip 第9节:Android定时器.zip 第10节:Android NDK入门.zip 第11节:Android NDK深入理论讲解.zip 第12节:Android NDK深入实例演示.zip 第13节:Android NDK深入实例演示2.zip 第14节:Android NDK深入实例演示3.zip 二、Android系统移植: 第15节:Android移植之VMWare安装.zip 第16节:Android移植之Fedora安装.zip 第17节:Android移植之Fedora配置.zip 第18节:Android移植之Linux内核编译.zip 第19节:Android移植之Linux内核编译2.zip 第20节:Android移植之Android文件系统编译.zip 第21节:linux补充之vi使用.zip 第22节:linux补充之shell命令.zip 第23节:Android移植之开发板真机测试.zip 三、Cortex-A8裸机开发: 第24节:Cortex-A8裸机开发环境搭建.zip 第25节:运行裸机程序的另外两种方式.zip 第26节:汇编点亮LED及代码分析.zip 第27节:关闭看门狗和调用C函数.zip 第28节:设置栈和C语言点亮LED.zip 第29节:控制icache.zip 第30节:控制蜂鸣器.zip 第31节:查询方式检测按键.zip 第32节:初始化系统时钟.zip 第33节:安装USB转串口驱动及串口工具.zip 第34节:Cortex-A8串口通信原理.zip 第35节:Cortex-A8串口通信实现.zip 第36节:Cortex-A8中断原理.zip 第37节:Cortex-A8中断实现.zip 第38节:Cortex-A8 PWM定时器原理.zip 第39节:Cortex-A8 PWM定时器实现.zip 第40节:Cortex-A8 RTC原理.zip 第41节:Cortex-A8 RTC实现.zip 第42节:Cortex-A8 ADC原理.zip 第43节:Cortex-A8 ADC实现.zip 四 Android 4.x设备驱动开发 第44节:Android 4.x设备驱动开发环境搭建.zip 第45节:Android 4.x设备驱动开发概述.zip 第46节:Android 4.x设备驱动开发HelloWorld演示.zip 第47节:Android 4.x字符设备驱动程序.zip 第48节:Android 4.x重要内核数据结构.zip 第49节:Android 4.x字符设备驱动程序示例.zip 第50节:另一种简单的字符设备驱动框架.zip 第51节:用Android NDK测试LED驱动.zip 第52节:Android的蜂鸣器驱动.zip 第53节:Android下查询方式的按键驱动.zip 第54节:Android下ADC驱动.zip 第55节:Android下RTC驱动.zip 第56节:Linux内核中断原理.zip 第57节:Android下PWM驱动.zip 五 、综合项目实战 第58节:项目实战之分析设计.zip 第59节:项目实战之音频报警.zip 第60节:项目实战之LED闪烁报警.zip 第61节:项目实战之蜂鸣器报警.zip 第62节:项目实战之ADC设置.zip 第63节:项目实战之ADC超标触发报警.zip 第64节:项目实战之ADC超标触发报警2.zip 第65节:项目实战之主界面功能.zip 第66节:项目实战之主界面功能2.zip 第67节:项目实战之RTC设置.zip 第68节:项目实战之RTC超时触发报警.zip 第69节:项目实战之按键触发报警.zip 第70节:项目实战之系统设置.zip 链接:http://pan.baidu.com/s/1jG1QpW6 密码:fnf3
题目名称 linux实验-基本指令1 题目关键字 linux实验-基本指令1 题目录入时间 2013-4-1 22:36:02 题目内容 1、root帐号登录,查看/tmp目录,如果/tmp目录下没有子目录myshare,则建立该目录。 2、创建帐号testuser。 3、把myshare目录及其目录下的所有文件和子目录的拥有者该为testuser,工作组改为users。 4、切换至testuser帐号。进入/tmp/myshare目录,采用vim编辑器编写以上程序,程序名称为hello.sh: #!/bin/bash echo "app start" echo -e func (){ echo "hello world!" } func echo -e echo "app end" 5、保存hello.sh后,给予hello.sh拥有者可读、可写和可执行的权限,同组可读可执行,其他人可执行权限。 6、输入./hello.sh,观察程序输出的效果。 7、进入testuser的用户主目录,在这个目录下创建hello.sh的软链接,同时拷贝hello.sh到该目录下并改名为hello.sh.bak,要求拷贝时保留文件属性值。 8、退出testuser帐号,回到root帐号,从/开始查找后缀名为.conf的所有文件,把输出结果重定向到testuser帐号的主目录下的output.txt文件。 9、在上一步操作的.conf文件中找出文件容量最大的和最小那个,并把这两个文件的容量大小输出到output.txt文件中。 10、统计出系统中有多少个用户帐号,把数量输出到output.txt文件中。 11、把output.txt文件转换为windows记事本可正规打开的格式。 12、tar打包压缩testuser帐号主目录下的所有文件。 13、用U盘把上一步打包压缩文件拷贝到U盘上。 14、执行userdel -r testuser,执行rm -fr myshare 题目创建人 题目注释 把打包压缩文件提交即可。 题目名称 linux-课题练习1 题目关键字 linux-课题练习1 题目录入时间 2013-4-15 12:21:53 题目内容 1、创建组testgroup; 2、创建用户a2012,先采用默认设置创建,然后使该用户加入testgroup组。 3、创建用户a2013,其用户主目录为/tmp/a2013,其主组为testgroup,附加组为users。 4、用id命令显示a2012和a2013用户信息,并且把这些信息记录到日志文件/tmp/test.log中。 5、参考书本98-99页crontab命令内容,使用root执行crontab -e,编写时程表,完成每隔5分钟把当前时间追加进/tmp/test.log中。 6、执行crontab -l,把输出内容追加进/tmp/test.log。 7、待完成2次时间记录追加后,执行crontab -r删除当前的时程表。 8、把/tmp/test.log拷贝到windows中(注意文本格式的转换),采用记事本打开,看是否看到完整内容。 题目创建人 题目注释 课题练习,做完后直接把test.log文件提交上来。 题目名称 linux课后作业1 题目关键字 linux课后作业1 题目录入时间 2013-5-6 10:23:32 题目内容 完成课本实验6第一题:菜单驱动程序。 题目创建人 题目注释 本题为当天提交,把程序文件以附件形式提交即可。 题目名称 linux shell程序设计实验1 题目关键字 linux shell程序设计实验1 题目录入时间 2013-5-6 10:25:36 题目内容 完成课本实验6的第2题,要有输入错误处理。 题目创建人 题目注释 把程序文件以附件形式提交即可。 题目名称 linux shell程序设计实验2 题目关键字 linux shell程序设计实验2 题目录入时间 2013-5-6 10:26:43 题目内容 按要求完成课本实验7。 题目创建人 题目注释 把3个程序文件打包提交即可。 题目名称 linux gcc实验 题目关键字 linux gcc实验 题目录入时间 2013-5-20 14:27:52 题目内容 课本实验8第2题 题目创建人 题目注释 请提交Makefile文件 题目名称 Linux下MYSQL操作 题目关键字 MYSQL实验 题目录入时间 2015-4-15 11:19:01 题目内容 1、在Linux下检查是否有mysql,如果没有,请安装。版本上必须是5.5以上,越新越好! 2、在mysql下创建数据库,名称为 testdb,内有表 linuxtest,表字段如下: userid (自己的学号),varchar 50,关键字 mysql_version (当前mysql版本号), varchar 50 linux_version (当前发行版的uname -a 返回值),varchar 100 eth0_HW (eth0物理地址),varchar 50 3、insert对应的数据到表 linuxtest 4、导出该数据库的sql文件,命名为 学号.sql 5、提交该sql文件 题目创建人 题目注释 题目名称 Linux网络实验1-wget+lynx 题目关键字 Linux网络实验1-wget+lynx 题目录入时间 2015-4-20 21:46:19 题目内容 1、让你的linux接入互联网,如果你是虚拟机安装,可以采用桥接本地网卡的方式上网(课堂上有介绍该方法)。如果你是独立安装linux请自行解决。配置好IP地址和网关,DNS设置两个(8.8.8.8和114.114.114.114)。 2、已root登录系统,创建目录webtest,进入webtest目录,分别把ifcfg-eth0文件及resolv.conf文件内容追加至result.txt,。 3、执行echo "1234567890这是分隔线0987654321" >> result.txt traceroute www.scau.edu.cn >> result.txt 4、执行wget http://www.baidu.com 5、以源码方式安装lynx 官方网站:http://lynx.isc.org/ 下载地址:http://lynx.isc.org/current/ 请选择最新版本 安装示例: wget http://lynx.isc.org/current/lynx2.8.8rel.2.tar.gz 解压lynx2.8.8rel.2.tar.gz 进入解压后的目录 依次执行 ./configure make make install 6、echo "1234567890这是分隔线0987654321" >> result.txt 7、执行whereis lynx >> result.txt 8、echo "1234567890这是分隔线0987654321" >> result.txt 9、lynx -dump http://www.baidu.com >> result.txt 10、提交result.txt文件 题目创建人 题目注释 题目名称 GTK+实验 题目关键字 GTK+实验 题目录入时间 2015-5-24 13:47:12 题目内容 GTK+实验,完成课本实验9,最后打包上传(程序源代码+可运行文件) 题目创建人 题目注释 题目名称 决战Linux(1) 题目关键字 LAMP LNMP 题目录入时间 2015-4-28 22:16:03 题目内容 在LAMP、LNMP等环境下,任意挑选下列2种或以上动态网页语言,写出一个页面,读取MYSQL实验中的数据表数据。 (PHP,JSP,Perl,Python,Ruby,Go,ASP.NET) 注意:不同的动态网页语言,所要求的具体环境有可能不同,需要自行搭建。 该实验为综合性实验,最终需要提交综合性实验报告。报告提纲大致如下: 1、实验步骤描述(有图有真像) (1)第一种动态语言 a、实验环境描述 b、系统架构图 c、相关配置总结 d、核心代码总结 e、页面效果截图 (2)第二种动态语言 (3)第三种动态语言 以下同。 2、实验总结(有对比有分析有感想) 题目创建人 题目注释
华清远见嵌入式linux应用程序开发技术详解(内部资料) 第1章 Linux快速入门   1.1 嵌入式Linux基础   1.2 Linux安装   1.3 Linux文件及文件系统   1.4 实验内容——安装Linux操作系统   本章小结   思考与练习  第2章 Linux基础命令   2.1 Linux常用操作命令  2.2 Linux启动过程详解  2.3 Linux系统服务  2.4 实验内容   本章小结   思考与练习  第3章 Linux下的C编程基础   3.1 Linux下C语言编程概述  3.2 进入Vi  3.3 初探Emacs   3.4 Gcc编译器   3.5 Gdb调试器  3.6 Make工程管理器  3.7 使用autotools   3.8 实验内容   本章小结   思考与练习  第4章 嵌入式系统基础   4.1 嵌入式系统概述   4.2 ARM处理器硬件开发平台   4.3 嵌入式软件开发流程   4.4 实验内容——使用JTAG烧写NAND Flash   本章小结   思考与练习  第5章 嵌入式Linux开发环境的搭建   5.1 嵌入式开发环境的搭建   5.2 U-Boot移植   5.3 实验内容——移植Linux内核   本章小结   思考与练习  第6章 文件I/O编程   6.1 Linux系统调用及用户编程接口(API)  6.2 Linux中文件及文件描述符概述   6.3 不带缓存的文件I/O操作   6.4 嵌入式Linux串口应用开发  6.5 标准I/O开发   6.6 实验内容   本章小结   思考与练习  第7章 进程控制开发   7.1 Linux下进程概述  7.2 Linux进程控制编程   7.3 Linux守护进程   7.4 实验内容   本章小结   思考与练习  第8章 进程间通信   8.1 Linux下进程间通信概述   8.2 管道通信   8.3 信号通信  8.4 共享内存   8.5 消息队列  8.6 实验内容   本章小结   思考与练习 第9章 多线程编程   9.1 Linux下线程概述   9.2 Linux线程实现   9.3 实验内容——“生产者消费者”实验   本章小结   思考与练习  第10章 嵌入式Linux网络编程   10.1 TCP/IP协议概述   10.2 网络基础编程   10.3 网络高级编程   10.4 ping源码分析   10.5 实验内容——NTP协议实现   本章小结   思考与练习  第11章 嵌入式Linux设备驱动开发   11.1 设备驱动概述  11.2 字符设备驱动编写   11.3 LCD驱动编写实例  11.4 块设备驱动编写  11.5 中断编程   11.6 键盘驱动实现   11.7 实验内容——skull驱动   本章小结   思考与练习  第12章 Qt图形编程   12.1 嵌入式GUI简介  12.2 Qt/Embedded开发入门  12.3 实验内容——使用Qt编写“HelloWorld”程序   本章小结 
目录 第1章 Linux快速入门 1 1.1 嵌入式Linux基础 1 1.1.1 Linux发展概述 1 1.1.2 Linux作为嵌入式操作系统的优势 2 1.1.3 Linux发行版本 3 1.1.4 如何学习Linux 4 1.2 Linux安装 5 1.2.1 基础概念 5 1.2.2 硬件需求 7 1.2.3 安装准备 7 1.2.4 安装过程 8 1.3 Linux文件及文件系统 11 1.3.1 文件类型及文件属性 11 1.3.2 文件系统类型介绍 13 1.3.3 Linux目录结构 14 1.4 实验内容——安装Linux操作系统 17 本章小结 17 思考与练习 18 第2章 Linux基础命令 19 2.1 Linux常用操作命令 19 2.1.1 用户系统相关命令 20 2.1.2 文件目录相关命令 27 2.1.3 压缩打包相关命令 38 2.1.4 比较合并文件相关命令 40 2.1.5 网络相关命令 45 2.2 Linux启动过程详解 50 2.2.1 概述 51 2.2.2 内核引导阶段 51 2.2.3 init阶段 52 2.3 Linux系统服务 54 2.3.1 独立运行的服务 55 2.3.2 xinetd设定的服务 56 2.3.3 设定服务命令常用方法 56 2.4 实验内容 57 2.4.1 在Linux下解压常见软件 57 2.4.2 定制Linux系统服务 58 本章小结 60 思考与练习 60 第3章 Linux下的C编程基础 61 3.1 Linux下C语言编程概述 61 3.1.1 C语言简单回顾 61 3.1.2 Linux下C语言编程环境概述 62 3.2 进入Vi 63 3.2.1 Vi的模式 63 3.2.2 Vi的基本流程 63 3.2.3 Vi的各模式功能键 65 3.3 初探Emacs 66 3.3.1 Emacs的基本操作 67 3.3.2 Emacs的编译概述 70 3.4 Gcc编译器 71 3.4.1 Gcc编译流程解析 71 3.4.2 Gcc编译选项分析 74 3.5 Gdb调试器 77 3.5.1 Gdb使用流程 78 3.5.2 Gdb基本命令 81 3.6 Make工程管理器 86 3.6.1 Makefile基本结构 86 3.6.2 Makefile变量 87 3.6.3 Makefile规则 90 3.6.4 Make管理器的使用 91 3.7 使用autotools 92 3.7.1 autotools使用流程 92 3.7.2 使用autotools所生成的Makefile 96 3.8 实验内容 98 3.8.1 Vi使用练习 98 3.8.2 用Gdb调试有问题的程序 99 3.8.3 编写包含多文件的Makefile 101 3.8.4 使用autotools生成包含多文件的Makefile 103 本章小结 105 思考与练习 105 第4章 嵌入式系统基础 106 4.1 嵌入式系统概述 106 4.1.1 嵌入式系统简介 106 4.1.2 嵌入式系统发展历史 107 4.1.3 嵌入式系统的特点 108 4.1.4 嵌入式系统的体系结构 108 4.1.5 几种主流嵌入式操作系统分析 109 4.2 ARM处理器硬件开发平台 111 4.2.1 ARM处理器简介 111 4.2.2 ARM体系结构简介 113 4.2.3 ARM9体系结构 113 4.2.4 S3C2410处理器详解 116 4.3 嵌入式软件开发流程 121 4.3.1 嵌入式系统开发概述 121 4.3.2 嵌入式软件开发概述 122 4.4 实验内容——使用JTAG烧写NAND Flash 128 本章小结 131 思考与练习 132 第5章 嵌入式Linux开发环境的搭建 133 5.1 嵌入式开发环境的搭建 133 5.1.1 嵌入式交叉编译环境的搭建 133 5.1.2 超级终端和Minicom配置及使用 135 5.1.3 下载映像到开发板 142 5.1.4 编译嵌入式Linux内核 145 5.1.5 Linux内核目录结构 149 5.1.6 制作文件系统 149 5.2 U-Boot移植 153 5.2.1 Bootloader介绍 153 5.2.2 U-Boot概述 155 5.2.3 U-Boot源码导读 156 5.2.4 U-Boot移植主要步骤 163 5.2.5 U-Boot常见命令 164 5.3 实验内容——移植Linux内核 164 本章小结 165 思考与练习 165 第6章 文件I/O编程 166 6.1 Linux系统调用及用户编程接口(API) 166 6.1.1 系统调用 166 6.1.2 用户编程接口(API) 167 6.1.3 系统命令 167 6.2 Linux中文件及文件描述符概述 168 6.3 不带缓存的文件I/O操作 168 6.3.1 open和close 168 6.3.2 read、write和lseek 170 6.3.3 fcntl 173 6.3.4 select 178 6.4 嵌入式Linux串口应用开发 183 6.4.1 串口概述 183 6.4.2 串口设置详解 184 6.4.3 串口使用详解 191 6.5 标准I/O开发 194 6.5.1 打开和关闭文件 194 6.5.2 文件读写 197 6.5.3 输入输出 198 6.6 实验内容 201 6.6.1 文件读写及上锁 201 6.6.2 多路复用式串口读写 204 本章小结 207 思考与练习 207 第7章 进程控制开发 208 7.1 Linux下进程概述 208 7.1.1 进程相关基本概念 208 7.1.2 Linux下的进程结构 210 7.1.3 Linux下进程的模式和类型 210 7.1.4 Linux下的进程管理 211 7.2 Linux进程控制编程 212 7.3 Linux守护进程 224 7.3.1 守护进程概述 224 7.3.2 编写守护进程 224 7.3.3 守护进程的出错处理 229 7.4 实验内容 232 7.4.1 编写多进程程序 232 7.4.2 编写守护进程 235 本章小结 238 思考与练习 239 第8章 进程间通信 240 8.1 Linux下进程间通信概述 240 8.2 管道通信 241 8.2.1 管道概述 241 8.2.2 管道创建与关闭 242 8.2.3 管道读写 244 8.2.4 标准流管道 246 8.2.5 FIFO 249 8.3 信号通信 253 8.3.1 信号概述 253 8.3.2 信号发送与捕捉 255 8.3.3 信号的处理 258 8.4 共享内存 264 8.4.1 共享内存概述 264 8.4.2 共享内存实现 265 8.5 消息队列 267 8.5.1 消息队列概述 267 8.5.2 消息队列实现 268 8.6 实验内容 272 8.6.1 管道通信实验 272 8.6.2 共享内存实验 275 本章小结 277 思考与练习 278 第9章 多线程编程 279 9.1 Linux下线程概述 279 9.1.1 线程概述 279 9.1.2 线程分类 280 9.1.3 Linux线程技术的发展 280 9.2 Linux线程实现 281 9.2.1 线程基本操作 281 9.2.2 线程访问控制 288 9.3 实验内容——“生产者消费者”实验 298 本章小结 302 思考与练习 303 第10章 嵌入式Linux网络编程 304 10.1 TCP/IP协议概述 304 10.1.1 OSI参考模型及TCP/IP参考模型 304 10.1.2 TCP/IP协议族 305 10.1.3 TCP和UDP 306 10.2 网络基础编程 308 10.2.1 socket概述 308 10.2.2 地址及顺序处理 309 10.2.3 socket基础编程 314 10.3 网络高级编程 322 10.4 ping源码分析 326 10.4.1 ping简介 326 10.4.2 ping源码分析 327 10.5 实验内容——NTP协议实现 345 本章小结 352 思考与练习 352 第11章 嵌入式Linux设备驱动开发 353 11.1 设备驱动概述 353 11.1.1 设备驱动简介及驱动模块 353 11.1.2 设备文件分类 354 11.1.3 设备号 355 11.1.4 驱动层次结构 355 11.1.5 设备驱动程序与外界的接口 355 11.1.6 设备驱动程序的特点 356 11.2 字符设备驱动编写 356 11.3 LCD驱动编写实例 363 11.3.1 LCD工作原理 363 11.3.2 LCD驱动实例 365 11.4 块设备驱动编写 374 11.4.1 块设备驱动程序描述符 374 11.4.2 块设备驱动编写流程 375 11.5 中断编程 381 11.6 键盘驱动实现 382 11.6.1 键盘工作原理 382 11.6.2 键盘驱动综述 383 11.6.3 键盘驱动流程 384 11.7 实验内容——skull驱动 394 本章小结 398 思考与练习 399 第12章 Qt图形编程 400 12.1 嵌入式GUI简介 400 12.1.1 Qt/Embedded 401 12.1.2 MiniGUI 401 12.1.3 Microwindows、Tiny X等 402 12.2 Qt/Embedded开发入门 402 12.2.1 Qt/Embedded介绍 402 12.2.2 Qt/Embedded信号和插槽机制 405 12.2.3 搭建Qt/Embedded开发环境 409 12.2.4 Qt/Embedded窗口部件 410 12.2.5 Qt/Embedded图形界面编程 414 12.2.6 Qt/Embedded对话框设计 416 12.3 实验内容——使用Qt编写“HelloWorld”程序 420 本章小结 428

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖哥王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值