标签:
---------------------------------------- Linux 基础 --------------------------------
1.Linux的诞生
1.unix两大分支:BSD和system V
2.GUN计划:允许软件自由复制更改移植
3.Linux发行版本:red_hat(red_hat) Debian(ubuntu) 系列
4.Linux 用户界面
1.图形界面
2.用户界面
5.Linux操作系统的构建:
硬件--内核--系统调用(保护内核的软件)--shell(命令解析器)--图形界面(应用软件)
6.文件系统:
定义:组织文件在磁盘中储存
7.Linux的目录结构
1."/"--根目录
2."/boot"--用来保存系统启动信息存放的目录
3."/dev"--设备目录(一切皆文件)
4."etc"--配置文件目录
5."/home"--用户主目录
6."/usr"--用户目录
7."/bin"--常用的命令目录
8."/lib"--库目录
9."/media"--媒体文件的存放目录
10."/sbin"--管理员文件目录
8.shell:
bash ksh csh sh
9.x window
KDE.gome
2.基本命令
1.[sram@locolhost~]$--[用户]
2.命令的基本格式:命令 选项 参数
~表示一个用户的主目录
以"."开头的所有文件,都是隐藏文件
隐藏文件中"."表示当前目录硬连接 ".."表示上层目录的硬连接
3.ls --表示显示目录下的所有文件和目录(不包含隐藏的文件)
-a 显示所有的文件和目录
-l 显示文件的详细信息
-h 显示文件的大小(K M G)
-i 显示文件的inode节点
man ls
4.pwd--显示当前的完整工作目录
5.clear 清屏(跳屏)
alias c=‘clear‘添加重影
source.bashrc 扫描
6.vm工具包的安装
1.解压: tar-zxvf vm~
2.cd vm
3./vm ...pl
7.data
显示系统时间,root用户能够设置时间
8.man 查看命令或者是函数的帮助文档
1.系统命令
2.函数调用
3.C语言函数
su - root(转化为最高权限用户)
9.常见的快捷键
1.Tab 命令补全键
2.ctrl+C 结束当前进程
3.ctrl+D 关闭当前shell
4.ctrl+shift+t 添加一个shell
5.ctrl+z 将进程放在后台运行
10.linux系统中有三个标准设备
0--标准输入设备--键盘
1--标准输出设备--屏幕
2--标准错误设备--屏幕
〈 表示输入重定向
〉表示输出重定向
2〉错误重定向
----------------------------------day----------------------------------
1.cd命令--表示切换目录可以是绝对路径也可以是相对路径
以"/"开头的路径是绝对路径
否则系统会限制环境变量(CDPATH)中指定的目录的查找,如失败,则在当前目录下查找;
2.mkdir--创建一个空目录,系统会默认为该目录添加一个"."和".."目录
3.rmdir--删除一个空目录
4.drwx------ 3 LH LH 4.OK 11-11 00:42.thumbnails
文件类型 属主 属组 其他用户 硬连接数 最后修改日期
5.touch命令--表示创建一个空档文件;
6.chmod--修改文件属性
1.普通方式
格式 chmod 对象(+或-) 权限 文件名
对象 u--user g--group o--other
+ 增加 -减去
权限r/w/x
2.八进制的方式
使用三位八进制数表示三组权限
7.cp--文件的复制
1.-f 强制复制
2.-r 递归复制
3.-i 覆盖之前进行提示
8.mv--文件的剪切或者重命名
1.-f 强制
2.-i 覆盖之前进行提示
9.rm--删除文件
-f 强制删除
-i 删除前询问
-r 递归的删除文件
10.in--创建硬连接指令
软连接:指对文件创建一个快捷方式;-s
硬连接:对文件起一个别名
11.vim编译器
是由VI发展过来的
vim编译器有三种模式
1.命令模式
2.插入模式
3.末行模式
在打开文件的时候,首先是命令模式
命令模式--〉插入模式
a/i/o或是A/I/O
a--在光标的下一位置插入
i--在光标的当前位置插入
0--在光标的下一行进行插入
A--在本行末插入
I--在本行的行首插入
0--在光标的上一行插入
插入模式--〉命令模式
"ESC"
命令模式--〉末行模式
":"
末行模式--〉命令模式
"ESC"
插入模式--末行模式不能互相进行转换
1.命令模式下的指令
1.光标定位
h-左移一个光标
l-右移一个光标
z-下移一个光标
k-上移一个光标
$-光标移至行尾
O-光标移至行尾
H-页的首部
M-页的中间
L-页的尾部
ctrl+b 向上翻页
ctrl+f 向下翻页
shift+9 最前端
shift+0 最尾端
gg--光标定义到第一行
G--将光标定义到末行
nG--将光标定位到第n行
2.删除指令
x--删除字符
nx--删除n个字符
dw--删除一个单词
ndw--删除n个单词
dG--删除到文件尾部
D--删除到行尾
3.复制和粘贴
yy--复制一行
nyy--复制n行
nyw--复制n个单词
p--粘贴
4.剪切
dd--剪切一行
ndd--剪切n行
2.末行模式命令
1.光标定位
set nu--设置行号
set nonu--取消行号
:行号--将光标定位在制定的行中
2.删除文件内容指令
: n1 n2d 表示将文件从n1行删除到n2行
3.保存和退出
: q--退出
: w--写入文件
: wq! --保存强制退出
4.file--查看文件的类型
5. cat--在终端上显示文件的内容
-n 添加行号
-b 添加行号 空白行不添加
6.head、tail显示文件的头几行或者末尾几行内容
-n 选项表示显示的行数
如不添加该选项则默认显示10行内容
7.more--分页显示文件的内容
-n--每页显示的文件行数
+n--从第几行开始显示
8.wc--用来统计文件的内容(行数 字数 字节数)
-c--只显示字节数
-w--只显示字数
-l--只显示行数
9.find--用来查找符合条件的文件;
find 目录名 查找的方式 文件的内容
查找方式
-name 以文件名的方式进行查找
-user 以用户名的方式进行查找
-group 以组用户名的方式进行查找
-size 以大小方式进行查找
可以使用"=/-/+"表示文件的大小是大于小于等于该字节数
-type 以类型的方式进行查找
-b 块设备
-c 字符连接
-f 普通文件
-l 符号连接
-p 表示管道
-d 表示目录
vim ./.vimrc ------设置行号(set nu)
-----------------------day ------------------------------------------------
1. who --查看当前系统中的所有登陆用户
who am i --查看登录用户
whoami --查看当前有效用户
2. su--表示切换某个用户
使用方法 su- 用户
sudo 使用管理员身份执行命令
3.useradd--添加一个用户
常用的选项:
-s 设置登录shell
-u 表示设置用户ID
-c 添加注释信息
-d 设置主目录
4.usermod --修改用户的属性
选项与useradd相同
5.passwd--设置用户密码(除超级用户外,只能设置自己的密码)
passwd 选项 用户名
可使用的选项:
-l 锁定口令
-u 口令解锁
-d 使账户号无口令
-f 强迫用户下次登录时修改口令
强制密码过期
1.userod -L 用户名 锁定用户
2.chage -d 0 用户名 设置密码过期
3.usermod -U 用户名 解除锁定
6.userdel--表示删除用户的主目录
7.chown--修改用户的属主
-R 表示递归
8.chgrp--修改用户属组
-R 表示递归
9.进程管理
1.程序和进程
1.程序--一段可以存放的代码
2.程序运行的过程就是进程
3.进程和程序不是一一对应的
2.进程的分类
1.交互进程
2.批处理进程
3.守护进程
3.进程的属性(pcb)
1.PID--进程的ID
2.PPID
3.UID GID
4.进程的状态:就绪,运行,僵尸,睡眠
5.占用一定的资源
6.优先级
4.init进程是所有进程的父进程,PID恒为1
5.在shell下敲击一个命令,在命令后面敲击"&"表示进程后台运行
6.jobs表示将当前shell下的所有运行的进程显示出来
7.fg 标号--表示将后台该标号的进程调入前台
8.ctrl+z 表示将前台的进程放入后台,并且暂停
9.bg 将后台暂停的程序改为运行态
10.ps 将系统中所有的进程显示出来
-a 表示所有用户的进程
-u 显示用户的名称和启动时间
-x 没有终端的进程
-l 以长格式显示
-e 所有的进程
11. ps-aux
ps-le
12.pstree-以树状结构显示进程
13.pgrep--表示查看服务进程的ID
14.kill ID 杀死进程
《
cat /etc/passwd 查看所有用户信息
groups 查看用户所属组
finger 查看用户信息
1、setfacl -R -m u:oracle:rwx /home/cdy 给目录加权限(用户存在 不能切换)
-----------------------------------day 01--------------------------------
软件包的管理
1.常见的包:RPM,YUM;
2.tar包的管理:
1.tar包中主要是源码;
2.tar包的创建:
tar -cvf 压缩包.tar 文件链表;
-c 表示创建;
-v 表示显示详细过程;
-f 显示制定文件名;
-t 表示显示tar包的内容;
tar -xvf 包.tar --减压一个包
tar -czvf 压缩包.tar.gz 文件链表;
tar -zjvf 压缩包.tar.bz2 减压缩目录
tar -zxvf tar.gz 文件链表
3.gzip /gunzip --压包命令
-v 表示压包
-l 查看包中内容
系统的启动流程
1.硬件的加电自检
1.硬件时间的设置:hwclock --set --data mm/dd/yy/hh/mm/ss
2.主引导记录:
1.446b--主引导记录
2.4*16b--分区信息
3.2b--跳转指令 将CPU的控制权交给操作系统
2.bootloader
1.是运行操作系统前的一小段代码,通常使用汇编语言来编写
主要是对相关硬件进行初始化(时钟,内存),将内核代码复制到内存中
2.跳转到内存中内核对应的代码处执行
3.常用的配置文件/etc/grub.conf==>/boot/grub/grub.conf
1.default -->加载的内核
2.timeout -->等待用户输入的时间
3.initrd,root等
3.载入内核
名称:主板本+次版本+末版本号
4.启动init进程
1.init进程是所有进程的父进程
2.它是加载内核后启动的第一个进程:PID=1;
3.PID=0 表示内核调度器,主要在分配时间片
4.与init相关的配置文件(设置相关的启动服务)
5.读取相关的配置文件
1..etc/inittab/--init进程的配置文件
1.initdefault:
0--halt 关机
1--signal 单用户模式
2--Multiuser 多用户模式
3--FULL Multiuser完整的多用户模式
4--nousing
5--X11(x window)图形界面
6--reboot 重启
2.在各种模式下都要启动的进程
si::sysinit:/etc/rc.d/rc.sysinit
id:run_level:action:process
id:为两位的标识符
run-level:启动的级别
action:在该级别下运行的文件或脚本
action--sysinit 在系统启动时执行;
3.etc/rc.d/init.d--存放启动服务
4.etc/rc.d/rc[0123456].d--表示对应模式下启动的服务
常见到的服务长以K和S开头,表示不启动和启动
5.常用的命令:
chkconfig --查看设置某个级别下某个服务
ntsysv--图形界面下的设置服务
网络设置:
网路模型:
OSI(iso):应用层,表示层,会话层,运输层,网络层,链路层,物理层
TCP/IP:应用层 传输层 网际层 网络接口层
ip地址
A类:0 + 7位的网络号+24位的主机号
0.0.0.0~127.255.255.255
B类:10+14位的网络号+16位的主机号
128.0.0.0~191.255.255.255
C类 110+21位网络号+8位主机号
192.0.0.0~223.255.255.255
D类:1110 +28网络号
224.0.0.0`239.255.255.255
E类:保留
------------------------------------- C -----------------------------------
第二阶段:c语言基础
1.在产生Unix操作系统(汇编语言)之后,在第二年的时候由贝尔实验室产生了c语言;
2.两个标准:
0.K&R;
1.c89 -- 在1989年的时候,美国国家标准委员会通过的一个标准;
2.c99 -- 在1999年的时候,美国国家标准委员会通过的一个标准;
3.c语言中注释的方式:
1./*......*/ --段注释
2.// --行注释
3.#if 0..... #endif --宏定义注释
4.#include --表示引入一个头文件
1.头文件的作用,对函数做申明和定义;
2.如果引入系统头文件使用"<>"和" "" ";
3.如果引入自定义头文件使用" "" ";
5.gcc -- GUN计划下的一个免费的c语言编译器;
常见的选项:
-o 表示重命名;
-E 表示预处理;
-c 编译过程
-S 汇编过程
-I 添加一个头文件的搜索路径;
-L 添加一个库的搜索路径
-l 添加一个库
-Wall 尽可能指出警告
-std=c99 使用c99标准
-O0~3-- 程序优化
6.编译的过程:
源文件 --〉预处理--〉编译-->汇编--〉链接--〉可执行文件
7.文件的后缀名:
.c 源文件
.i 预处理之后的源文件
.s/S 汇编语言程序
.o 目录文件(二进制文件)
.so 共享库
.a 静态库
8.常用到的运算符:
算数运算符: + - * / %
赋值运算符: =
逻辑运算符:〉 〈 〉= 〈= != == && ||
位运算符: 《 》 & | ^
三目运算符: ?:
逗号运算符: ,
9.标识符:
1.申请的标识法大小不能超过32字节;
2.标识符只能以字母、下划线、数字构成,同时数字不能作为标识符的开头;
3.常使用的标识符规则为驼峰式(get)和下划线()的方式;
10.常量的定义:
1.#define分为两种
1.普通的定义宏
2.行数的宏定义
2.在使用define时,往往使用大写表示常量
3.define的本质是在程序预处理的时候将定义的宏替换
11.在C语言中的八进制和十六进制
012---八进制
0x12---十六进制
12.变量
变量必须随时先定义后使用
常用的转义字符
\t---水平指标(8个空格)
\v---垂直制表
\n---回车
\r---换行
\b---推格
13.常用的输入输出函数
1.putchar---输出一个字符
函数原型 int putchar(int c)
函数参数 c 表示一个整数
函数返回 成功:一个无符号字符(ANSI)
失败:EOF
2.printf 输出的格式
%d 十进制
%u 输出无符号整数
%c 字符类型数据
%f 浮点类型
%lf 双精度类型
%s 字符串类型
%x 十六进制
%p 输出地址
%o 八进制格式
3.格式:%m.nf
- 左对齐
m 数据的宽度
n 实数的有效位数
4.类型转换:
1.隐式类型转换
int i = 3+5-2.7;
2.强制类型转换:
(type)+ 类型或者表达式;
5.& -- 表示对一个变量取地址
6.* -- 表示对一个地址取值;
7.if语句:
格式: if(表达式) 语句;
表达式: 计算表达式得到一个逻辑运算值为真,执行语句;
否则跳过执行下一条语句;
语句: 只能是一条语句,如果需要多条,要构造成一个复合语句;
8.无论是什么结构(循环、选择等)之后只能加一条语句;
if(条件)
一条语句(复合语句)
else
一条语句
9.在条件语句中else会就近结合if
10.对for语句而言:
for(循环因子的初始化;循环因子的退出条件;循环因子的变化规律;)
语句
数组:
1.基本概念:同种类型数据的集合;
2.数组名称表示数组集合的名称;
数组名是一个指针常量 表示下一维空间的首地址;
3.一维数组:(定义,初始化,赋值和使用,特殊用法)
定义: 数据类型 数据名[ 常量表达式 ];
1.数组以下表为0 的元素开始;
2.数组名称为申请的连续空间的首地址;
引用: a[下标表达式];
---注意边界问题:由于编译器不会检测数组是否越界,所以可能修改其他变量的情况;
3.类型修饰符:
auto:
const:
static:
register:
4.初始化方式:
1.初始化的个数小于申请数组大小的维数;-- int a[3]={1,2,3,4}
2.可以初始化部分; int a[3]={[1]=3};
3.可以省略维数; int a[] ={1,1,2};
4.常见的初始化方式:
int a[ ]={1,2,3,4,5,6,7};
5.初始化的个数小于数组的维数,那么其他元素赋值为0;
int a[100]={0};
5.sizeof() --运算符: ---sizeof(int)
1.变量 -- 计算该变量占用的空间
2.数据类型 -- 计算数据类型申请的空间
6.rand ( );
1.设置随机种子srand ( );
2.产生随机数: ([n]~[m]) (1~100)
(int)((rand()/(1.0 + RAND_MAX))*(m-n+1)+n)
---不要把随机种子和随机数放一个循环里(循环不超过1s,产生相同的数)、
一维字符数组:
1.字符串常量的表示: "abcd"
2.字符串组成: 首地址+ 空间+ 字符串的结尾
3.字符串的存储: 字符数组。
4.字符串的输入输出:
类型 (%s )+地址(数组名、指针)
强调:地址中数组应为一个字符数组,指针是一个字符指针
5.在使用scanf输入字符串时:遇到 空格 tab 回车,表示字符串结束
6.stdin 标准输入 (键盘)
stdout 标准输出(显示器)
stderr 标准错误 (显示器)
7.输入输出字符串:
gets/ puts
8.字符串操作函数: #include〈string.h>
strcpy -- 字符串的复制
strlen -- 求字符串的长度 (不包含‘\0‘)
strcat -- 连接字符串
sprintf -- 同上
strncpy -- 表示复制原字符串前n个字符
strcmp -- 字符串的比较
函数:
1.分类:
1.按照用户分类:库函数和自定义函数
2.按照参数分类:有参函数和无参函数
2.函数的使用:
1.函数的定义
[类型修饰符] 返回值类型 函数名称 ( 形参列表)
{
函数体;
}
1.函数的返回类型:
如果不定义函数返回,默认返回整数;
函数的返回只能有一值;
如果没有返回,那么加void 表示无返回值;
函数返回如果是一个指针或地址,那么该地址对应的空间不能是普通的局部变量;
2.函数名: 表示该函数的入口点
3.形参列表:形参的类型 + 形参变量--(不可省略,调用可省);
各形参之间使用逗号隔开。
4.函数体: 表示函数的实现;
如果需要返回 ,return + 返回值; 若不需要,什么都不写 -- return ;
2.函数的声明: 声明必须放在调用之前。
作用:告诉编译器调用该函数返回的使用的参数个数和类型 以及函数返回的类
型,为编译器提供语法判断的依据;
两种形式:
定义如下:
int abc(int a,int b,char c)
{
//函数体;
}
声明:
1.int abc(int a,int b,char c)
2.int abc(int ,int ,char)
3.函数的调用
对函数的使用
函数名 (实参列表)
返回值接收 = 函数名 (实参列表)
变量的生存空间和作用范围:
1.作用域
1.局部变量:
1.在定义的函数或者复合语句有效;
2.程序开始运行时不分配空间,在定义该变量时分配空间。
2.全局变量:
1.作用范围为开始定义处,到文件尾部;
2.程序在运行时分配空间,在程序运行结束时释放空间;
3.全局变量的优先级小于局部变量。
2.生存周期:(局部变量)
1.动态存储:(auto)
2.静态存储:(static):相当于全局变量;
3.extern:表示外部的
如果用来修饰全局变量:表示拓展变量的作用域;
file1:
int a;
file2:
extern int a;
4.static:
1.用来修饰变量:
1.局部变量:相当于全局变量;
2.全局变量:表示该变量不能被其他文件使用;该变量只能 在本文件中使用;
2.修饰函数:表示函数只能在本文件中使用;
static int abc (int a)
{
}
5.const:表示常量 ;
指针:
1.定义:指针是一种数据类型,是变量在内存中所对应单元的地址;
2.内存是以字节的形式进行划分,每一个字节都有一个地址;
3.指针变量:它是一个存放其他类型数据地址的变量:
1.基本数据类型:float *p 等价于 float (*p);
2.数组指针变量: int (*p)[5]; ------------ 占4个字节
3.指向指针的指针变量:int **p;
4.指针的数组: char *a[5]; ----------20个字节
5.函数指针: int (*p)(int *,int) = swap; ----- 函数入口点的指针;
swap(&a,&b); //p(&a,&b); ---- 往往使用在函数的传参中;
6.内存空间访问的方式:
1.直接访问:使用变量的名称直接访问或者修改变量;
2.间接访问;通过该变量空间的指针访问或者修改变量。
7.每种指针应该指向同一类型的数据的地址;
4.运算符:
1.取值运算符 &:表示对某一变量进行取地址;
2. *:表示对某个地址进行取值;(char * -- 表示指针的一个标识);
3.
5.int *a; int* a; int * a;
6.野指针:申请普通局部变量指针,但没有做任何初始化;
7.指针的算术运算:
对于指针而言,做算术运算的本质是地址的偏移;加法向后偏移,减法向前偏移。
例:char *p; (p+1)表示指针向后偏移一个char类型数据个字节;
指针的偏移的是数据类型,而不是字节;(编译器决定的)
8.const:
修饰一般变量:const放于修饰类型符的前、后作用相同。
const int a = 5;
int const a = 5;
修饰指针时:
const int *a = &b; const 修饰a指向的对象;
int const *a= &b; const 修饰a指向的对象;
int *const a= &b; const 修饰a;
const int *const a= &b; const 修饰a和a指向的对象;
const 修饰函
void swap(const int *a,const int *b)-----*a,*b不会被改变。
9.指针和字符串:
char *p = "abcdeg";
strlen(p); ----字符串长度
sizeof(p); ----指针所占用的字节空间
strlen sizeof( )
10.malloc函数组:
表示用户自定义空间,但是用户有申请空间的权利,那么必须存在释放空间的
函数;用户申请的空间在堆中
void *malloc(size_t,size)
函数说明:从内存中申请一片内容
函数参数:
size --预申请的空间大小
函数返回:成功返回空间首地址;
失败返回 NULL;
void free (void *ptr) ;
函数说明: 释放申请的空间;
作业:P200 2、 3、
int (*a) [5]; -----4个字节
int *a[5]; ------20个字节
int (*a)add(int ,int)
const int a = 5;
int b = 3;
const int *c = &b;
{
*c = 15; ----错
b = 15; ----正确
}
malloc/calloc/realloc --> free( )
文件函数:
(stdin,stdout,stderr ---> 文件指针)
errno
perror
fprintf
*1.fopen(打开文件)
FILE *fopen(const char *path,const char *mode);
函数说明:打开流式操作;
函数参数:
path:欲打开文件路径
(路径pathname、文件名filename)
mode: 表示文件的打开权限
r:表示只读,并且文件指向文件的开头部分;
r+:表示读写,文件指向文件的开头部分;
w:表示只写,如果文件不存在则创建,并且文件指向文件的开头部分;
w+: 表示读写,如果文件不存在则创建,文件指向文件的开头部分;
a:表示写追加
a+:表示读写追加
函数返回:
成功:返回FILE类型的指针;
失败: NULL set the errno
*2.fclose(关闭文件)
int fclose(FILE *fp);
表示关闭一个文件;
3.fgetc/fgets (从打开的文件中获取一个字符/字符串)
4.getc/gets
5.fputc/fputs(写入文件一个字符/字符串)
*6.fread
size_t fread (void *ptr,size_t size,size_t nmemb,FILE *fp)
*7.fwrite
size_t fwrite (void *ptr,size_t size,size_t nmemb,FILE *fp)
8.fflush
*9.fseek
——————————————————————— 高 编 ———————————————————
#if
#else
#ifdef
#idndef
#endif
2.c
step 1. type code
2. gcc 2.c
3. close line3
4. gcc 2.c
5. gcc -D DEBUG 2.c (看结果)
宏定义、
服务器与客户端:
ftpc.c
设置端口号 ifconfig eth0 192.168.12.62
查看端口号 ifconfig
sudo vim /etc/services
myftp 6666/tcp 绑定端口号,使用tcp协议
信号:进程间通信机制
为什么进程间要进行通信?
进程间没有任何联系
进程间通信方式有几种?
1.信号
2.无名管道
3.有名管道
4.消息队列
5.共享内存
6.信号量
7.套接字
进程间通信原理?
1.信号
进程间通信原理?
pid
怎么查看进程id号?
ps -l | grep a.out
(ps -l 查看当前终端进程
ps l 查看所有终端进程)
怎么通过命令发送信号?
kill 信号编号 pid
我们能够发送什么信号?
kill -l 列出所有的信号
man 7 signal信号的属性
CTRL+C的本质是:
kill -2 pid(只能结束当前终端的前台进程)
信号是异步事件:
在任何时候都可能发生的事件
软件中断: 模式和硬件中断相同
信号都有默认方式,是否可以修改默认方式?
默认方式: 中断、停止和忽略
可以修改默认方式
怎么修改默认方式?
signal函数可以修改默认方式
typedef关键字的使用技巧:
只要会定义变量,就会使用typedef
int t_32:分配了4个字节,我们可以往t_32中存数据
typedef int t_32; 不分配空间(只是给编译器看的),只是重新定义了int这个数据类型,也就是说在程序中t_32和int没有区别
char *cp:分配了4个字节,我们可以往cp中存数据的地址
typedef char *cp;
void (*fp)(int);分配了4个字节,我们可以往fp中存函数的地址
typedef void (*fp)(int);
命令行可以发信号,怎么编程序实现发命令?
kill函数
(只要在命令行里可以实现的功能,大多可以通过函数实现)
2.无名管道进程间通信方式:
原理: 子进程继承父进程的文件描述符(在硬盘里)
管道就是一个特殊的文件,既然是特殊的文件,我们的读写方式应该是固定的,
我们用read和write进行读和写,不能使用fread或fwrite,也不能用lseek和fseek
当写满时会阻塞,等待读;
当读空时也会阻塞,等待写。
当关闭写端,只有读端,这时读管道会出现两种情况:
1.当管道中有数据时,读取数据
2.当读完数据时会直接返回,不会阻塞
当关闭读端,只有写端,这时写管道会收到SIGPIPE
作业:
利用无名管道实现cp命令(子进程写新文件,父进程读要复制的文件)
cp res,dest----> a.out res,dest
vim:
vsp路径 垂直分屏
sp 路径 水平分屏
多屏之间切换:ctrl+ww
shift+v 激活行选择,然后按上下键选择多行,然后按下y复制
缩进:选中, 2 shift+ 〉 后缩2次
shift+ 〈 前缩
ctrl+v 激活局部选择
ctrl+i 恢复
u 返回上一层
3.有名管道进程间通信方式:
原理:文件系统可见,意味着ls可以看见,但大小始终为0,因为写到管道中的数据
都在内存中,内存中的东西文件系统不可见
创建有名管道有两种方式:
命令mkfifo(需创建fifo)和函数mkfifo(#include<sys/stat.h>),不需fifo
既然文件系统可见,那么所有进程都可以打开open这个管道文件,往管道写write数据,
读read数据
strlen和sizeof区别:
strlen:是函数,计算字符串长度,不包括\0, \0本身是结尾标示符
sizeof:是运算符,计算数据类型的长度,基本数据类型和构造数据类型
sizeof(int)--〉4
int a[10],sizeof(a)--> 40
作业:
利用有名管道实现复制文件,一个进程进行写新文件,一个读要复制的文件
fifow dict.txt
fifor dictbackup
diff dict.txt dictbackup
(两个main函数)
写管道:mkfifo fifo(一个管道就可以了)
diff fifo.c 123 (看fifo.c 和 123 是否一样,一样什么都不显示)
4.system v(一种标准) 进程间通信方式:
共享内存、消息队列和信号灯
原理都一样
原理看图:图system v ipc,图share memory
(1)共享内存实现步骤:ftok得到key-->shmget用key得到sid-->shmat内核到用户的地址映射--shmdt删除内核到用户的地址映射--〉shmctl删除共享内存
ipcs 查看所有system v ipc
ipcs -m 查看贡献内存
ipcs -s 查看信号量
ipcs -q 查看消息队列
ipcrm -m sid 删除共享内存
IPC_CREAT|IPC_EXCL 这两个组合,当相同的共享内存已经存在时,会报错EEXIST
vim7.3安装和vim7.3配置(root下)
安装:
tar -xvf vim-7.3.tar.bz2
cd vim73
cd src
./configure
make
make install
关闭终端重新打开
配置:(root权限下,当前目录)
cd ~
tar -xvf vim.tar
(2)两个信号同时发生,可能有一个被忽略掉
信号量进程间通信方式,两种:
两种:一种是2值信号量,一种是计数信号量
当申请资源时,本质就是-1
当释放资源时,本质就是+1
0和非0两种情况,0是没有资源,非0有资源。
vim:
shift+8 n和N 全选中
:%s/old/new/g 替换
(3)消息队列进程间通信方式
是通过数据结构中的链式队实现的
每个消息必须有自己的类型(类似于QQ号码)
消息的长度是不固定的
消息的前4个字节必须是类型
如果是自己的消息,通过后4个字节来知道消息的长度,然后读固定长度的数据
每个进程都可以往队列中添加固定类型固定长度的消息
管道本质:循环数据队
信号:异步事件(软中断,操作系统级别的)
信号量: 同步事件
(posix标准)
*同步共享内存 程序(重点)
共享内存:类似于malloc(一个进程定义的一个进程使用),共享内存可多进程使用,都是通过返回void类型的首地址。
多进程协调中,共享内存很重要
线程和进程:
一个进程最少有一个线程
在进程中创建线程
一个进程可以创建多个线程,多个线程都具有同一个pid属性,具有不同的LWP属性
资源角度:一个进程创建的所有的线程都共享进程的资源,进程之间资源收独立的
线程关联角度:一个进程创建的所有的线程中任一线程出现段错误(去了不该去的内存空间),那么其他线程一起中断
cpu利用角度:进程和线程没有区别,都参与调度(两个while(1)可以“同时”运行)
查看LWP命令:ps -aL
操作 创建 关闭 等待
进程 fork exit wait
线程 pthread_create pthread_cancel pthread_join
pthread_create函数不包含在libc库中,所以在gcc编译时需要加-lpthread,来说明程序中使用了线程相关的函数
线程可以很方便的实现线程间通信,只要是全局变量就可以实现线程间通信。
多个线程访问同一块空间,会遇到同步问题,解决同步问题使用posix信号量(计数信号量)
vim
shift+g 跳转到当前文件的最后一行
gg 跳转到当前文件的第一行
作业:
server.c中为什么要加close(listenfd)和close(acceptfd)?
他们的位置能不能随意改变?
测试tcp的三次握手和三次挥手?
了解序号和应答号的原理和作用?
了解tcp头中flags中syn和ack的意义?
总结tcp和udp的基本区别?
vim /etc/services #myftp 6666 tcp 设置服务器端口号
vim ftp.conf 设置文件目录(get service 显示的)
ifconfig 查看虚拟机iP
ifconfig eth0 192.168.12.62 设置虚拟机ip
SQL:(gcc -lsqlite3)
sqlite3 my.db
.ta 查看table
.sc
create table student(number integer,name text,score real) 创建
insert into student values(1,‘niuniu‘,90.5); 插入
select * from student; 查看
select * from student where number > 2 ; where条件查询
select * from student order by score; 升序
select * from student order by score desc; 降序排序
select * from student where score > 60 order by score desc limit 2;
drop table haha(table名); 删除table
alter table student add column sex text; 给table添加sex选项
update student set sex=‘man‘ where name=‘niuniu‘; update更新属性
update student set sex=‘man‘ where number=1;
delete from student where name=‘liu‘; 删除liu
create table student(number integer primary key,name text,score real); 主键
.q 退出
locate sqlite3.so 查看库
第二阶段项目:电子相册
Framebuffer
像素: 1024(宽) * 768(高) * 32位
ubuntu 10.04 CTRL+alt+F1 退出图形界面 CTRL+alt+f7 进入图像界面
解压字体库:
tar -xvf freetype-2.3.11.tar.bz2
cd freetype-2.3.11/
./configure --prefix=/home/lh/Desktop/drivers/Shome/v4l2/名字(必须是绝对路径) --host=arm-linux(要解压的版本)
make
make install
--------------------------------------------- ARM ---------------------------------------
为什么学习arm?
嵌入式是可以裁剪、低功耗、低成本的专用计算机系统
cpu(中央处理器)、mcu(cpu+控制器)和单片机(cpu+控制器+存储器)
s3c2440是mcu,内部没有存储器,需要外接
存储器有flash(掉电不丢失,是基于阵列的 --〉U盘)、硬盘(掉电不丢失,是基于机械的 --〉移动硬盘,光盘)和内存(掉电丢失,是基于阵列的)
flash和硬盘用于存储程序(可以执行,但是特别慢,虚拟内存),内存是最大的缓冲区 --〉用于执行程序(速度快)
一级缓冲、二级缓冲 --〉 内核
arm是一种cpu,cpu是一种大脑,学习arm就是在学习怎么使用这个大脑
arm是arm公司设计的,但arm公司不生产实体的芯片,它会把arm的设计授权给不同的公司,不如三星,三星再根据自己对市场需求的判断在arm的基础上添加控制器
控制器是对各种设备控制程序的最优硬件化
如果没有控制器,我们也可以控制设备,但控制流程会变得很复杂,使得开发成本增加,这个成本包括人力和财力
控制器不是生物的,他也需要相关的程序进行配置,但是仅限于配置
使用寄存器配置控制器
寄存器是总线宽度(arm9是32位总线宽度)的存储器,以位为控制标志
怎么学习arm?
看说明书
学习arm的难点?
寄存器的理解和对设备本身的理解
怎么和开发板进行互动?
开发板通过com0可以和pc进行双向通信
com0是9针串口,发现现在的pc都没有这个接口,但我们有USB,所以用串口转USB进行双向通信
首先连接开发板与pc
激活虚拟机的情况下插入USB线
虚拟机识别USB线的查看方式是lsusb
ubuntu查看USB线的驱动用lsmod 若有ch340,则证明驱动存在并可用
USB线驱动存在并且已经运行后,肯定会创建相应的设备文件,设备文件在/dev下,文件名是ttyUSBn
有了设备文件以后,相关的软件就可以打开设备文件进行通信
kermit这个软件可以实现这种功能
安装配置kermit
sudo dpkg -l | grep kermit,如果什么也没有打印证明没有安装
sudo dpkg -i ckermit.deb
安装过程中会提示需要先安装另一个包:libsocks.deb,安装失败
sudo dpkg -i libsocks.deb
上面的安装成功以后再重新安装ckermit.deb
sudo dpkg -i ckermit.deb
kermit 这个软件需要一个配置文件kermitrc.tar,来设置一些相关属性
把kermrc.tar 解档到用户根目录 (root:/root sram:/home/sram/),用户根目录下会多余一个文件.kermrc
kermit -c, 如果开发板没有通电,他会阻塞,这时打开开发板电源,若能看到不是乱码的信息,那么kermit就可以使用了
vi ./.bashrc 下添加 PATH=$PATH:~/Desktop....
source ./.bashrc
怎样点亮LED?
一个Led有2种状态,亮和灭
控制器GPIO(通用目的输入输出)控制器可以实现控制led
用寄存器配置GPIO控制器
只要是寄存器肯定是32位,那么一个led的亮灭需要1位控制
需要知道mcu的哪个端口在控制led,所以需要看原理图
怎么使用GPIO控制器?
一共130个GPIO,由于一个寄存器只有32位,不能控制130个GPIO,所以分为9组,每组都有独立的寄存器进行相应的配置
由于应用的复杂性,端口数过少,所以需要每个端口具有多种功能,那么我们可以得到一个结论:当我们编程序时,首先应该选择端口的功能
编写的程序怎么变成arm上可以运行的机器代码?
不同的硬件需要不同的编译器
gcc编译的程序只能用于AMD/因特尔
那么对于arm来说需要专用的编译器,arm-linux-gcc
在光盘中找arm编译器
tar -xvf arm-none-linux-guneabi.tar
把arm-none-linux-guneabi/bin 这个路径加到PATH
打开 .bashrc ,添加PATH=$PATH:/home/niulibin/toolchain/bin/
寄存器配置要点?
当你要修改某14、15位时,千万不要修改了其他位
通过位运算 &与 |或 ~非来实现
作业: 编写Led程序,并且能够编译通过
CPATH和VPATH的作用
怎么让led.bin在开发板上运行?
s3c2440上电启动时,会主动的去norflash 或 nandflash中去取4k字节到内存中,然后运行,这时s3c2440启动任务已经完成,然后交给运行的4k程序
通过开发部上的S2来决定去哪里取
4k程序已经烧写到flash中了
{
在nor flash下,下载uboot.bin引导程序到nand flash
kermit -c
3-->2-->1s
enter
loadb 30008000 ....
}
loadb 30008000,给开发板发命令,要通过串口给开发板发数据,开发板要把这些数据存到30008000开头的内存中
ctrl+\然后按c,进入kermit命令行界面,然send led.bin,通过串口发送led.bin这个arm程序到开发板30008000开头的内存中 ( .kermrc)
然后按c回到和引导程序的交互中,go 30008000
led 只有输出---〉0x55(5为4位,0101)
任务: 实现puts 和 gets、
ADC?
数字信号:随着时间的变化,电压不是连续变化的信号就是数字信号
模拟信号:随着时间的变化,电压连续变化的信号就是模拟信号
现实世界中都是模拟信号,但我们的智能系统是数字信号,所以要处理现实中的模拟信号
RTC?
顺序不对应是因为说明书中寄存器的地址不是连续的
中断:
作业?
通过kermit给开发板发命令
ledon n (strtok)
ledoff n
adc
adc set 2500
电压大于2.5V,led1闪; 小于2.5V,led1灭
RTC
RTC set 2014.8.8 20:20:20 (返回时间)
为什么裸机编程中能用静态库,但不能用动态库?
静态库是在编译阶段,把相关的函数机器代码都编译进入可执行文件,所以不需要相关库的依赖,可以直接运行,行话叫可移植性强,可以用于裸机编程也可以用于操作系统编程
动态库是在编译阶段,没有把相关的函数机器代码编译进入可执行文件,所以需要相关库的依赖,不可以直接运行,行话叫可移植性强,可以用于操作系统编程
作业(iic)?
保存结构体到AT24C08
保存1024个数据到AT24C08
中断?
串口中断中发送与接受为一个中断(INT_TXD0、INT_RXD0)
什么存储器可以直接运行程序? nor flash ( nand flash 只能存程序)
友善之臂 在nor flash中,烧写了一段4k的程序,可用来向内存(SDRAM)中下载程序
如果nor flash和nand flash中都没有程序,可用 JTAG
lh--〉 .kermrc 设置波特率 9600
12M/9600/16-1 = 4D
-L map.lds /* 注释 */
全局变量不能使用,导致strtok不能使用?
通过链接脚本可以解决
程序的组织形式:
栈段 局部变量 (高)
代码段(text) if else
常量段(rodata) "niulibing"
初始化数据段(data) 全局变量 int a=1 局部静态变量static int a=1
未初始化数据段(bss)全局变量 int a 局部静态变量static int a (低)
RTC的实现?
寄存器不连续
启动过程?
cpu有两种启动方式(nand nor),通过配置4个OM端口来决定从哪里启动
nand 启动:
nand没有地址线,有8位的数据线,通过nand控制器来操作
上面的特性决定了nand不能被cpu地址总线直接操作
(nor flash :4M 2^22/1024/1024)----> 22 = 13根行线 + 9根列线
cpu启动后会把nand的前4K搬移到cpu内部的4k静态随机存储器(SRAM),这是cpu内部操作与我们没有关系
然后从0地址开始执行及其代码,内部SRAM的首地址是0,正好和上面的性质对应
如果nand中的程序大于4k,那么nand中的前4k就必须具备把所有的程序从nand搬移到cpu外部同步动态随机存储器SDRAM
(虚拟内存:flash)
nor 启动:
nor有22位地址线,最大支持4M,直接与cpu的地址总线连接,可以被cpu直接访问,有16位数据线,所以每次能读2个字节,通过memory控制器来操作
cpu启动以后通过片选信号nGCS0,可以直接访问nor,所以nor中的程序可以被cpu直接执行
然后从0地址开始执行nor中的机器代码,nGCS0这个片的大小为128M,首地址是0,正好和从0地址运行对应
(机器指令肯定 32位)
汇编语言: .dis 反汇编
Linux系统实用开发:4、
ARM体系结构与编程:2—4
arm 有37个寄存器
lr 返回值
s3c2440 3、
立即数: #开头的
64M内存(SDRAM):
4bank * 4M * 16bits/8(2 bytes) * 2片
任务?
三级流水线 (并行执行,取指、译码、执行) arm9最多支持5级流水线
b(相对--〉跳转指令)和bl(带返回的跳转指令,保存到LR)指令的理解 2^(24+2)/1024/1024 = 64M (-32M,32M正负跳转)
ldr(=)指令和ldr伪指令的区别 (ARM中的机器指令:需要翻译的ARM中的机器指令)
GNU ARM汇编(机器代码 + 如果条件--〉 .开头的)和 ARM汇编(机器代码)的区别 ---〉 Linux系统开发 4.4、
指令的前4个位代表什么(条件执行)
37个寄存器各是什么
PC(4字节)是r15,有几个PC(1个),PC中存的是什么(下一条指令的地址--〉cpu总线地址)
ea000006
e:无条件执行 a:(1010) 101 0不保存地址到LR(共6个) 6<<2 +8 24为3个周期 32--〉向下偏移20位
nop: 占用执行周期,不进行任何操作--〉跳转到下一个异常
CPSR(1个) SPSR(5个)
指定svc模式栈地址: 才能实现C语言函数调用功能
任务?
满递减栈(先减4,后存入栈),可以让我们知道ldr sp,0x1000的意思
模拟und异常(cpu不支持的指令称为und,arm9不支持硬浮点,可用。。。实现)
led的汇编实现
作业:
串口汇编/RTC
作业?
闹钟 flasharm/rtc/rtc.c
每到固定时间(一分钟)响,响30秒,用rtc中断
在30s响的中间任何时刻,可以让闹钟不响,用按键中断(中断不可以嵌套中断--〉定义全局变量)
通过串口z可以设置当前时间和闹钟时间,用串口中断
主程序只输出时间
定时器4:12M/(255+1)/16=2929 --〉 1s 0x6000 = 24576 24576/2929为8s
uboot移植:
文件系统: 组织硬盘
bootloader源码下载(ftp)--〉第一个 2410型号
2440比2410快---〉更改时钟配置
tar -xvf
cd u-boot-1.1.65
uname -a
uboot(引导内核)130k,我们只能移动4k,怎么办?
二次搬移 (第一次运行时,需要搬移SRAM--〉SDRAM)
第一次:硬件程序将flash前4k移动到cpu(4k的有效程序,初始化SDRAM)
第二次:uboot把130k搬移到GCS6(片选6)
uboot命令:
loadb(下载到SDRAM) help/? go
led: 下载pc机的程序--〉SDRAM拷贝到nand flash
loadb 30008000
nand erase 0 1000(16进制)--〉 擦除、覆盖Nand
nand write 30008000 0 1000
任务?
bootloader? 引导下载
你知道几种bootloader? uboot vv
uboot? 对硬件进行初始化(串口、SDRAM) 用uboot把130k的bootloader移动到nand flash
uboot和我们自己编写的arm逻辑程序有什么区别?
uboot大小? >4k(130k)
uboot运行步骤? 两次搬移
uboot中需要实现什么功能?
uboot中实现以太网的目的?
用uboot怎么实现把我们自己编写的逻辑程序拷贝到flash中,拷贝完成以后uboot处于什么状态?
---uboot移植---?
smdk 评估版
与体系结构无关:strcpy 在哪都能运行
arm-linux-gcc -v 查看gcc版本
tar -xvf gcc-3.4.5-glibc-2.3.5
echo `pwd` >> ~.bashrc
cd ---> vim .bashrc 添加路径
source .bashrc
关闭中断,再打开
vi Makefile 添加mini 2440
cp -rf smdk2410/ smdk2440
cd /include/config cp -rf smdk2410.h smdk2440.h
cd /board/smdk2440 把2410改成2440
cd /u-boot-1.1.65 make smdk2440_config 配置文件
make
ls u-boot.bin
ctags:
make ctags,一定要在最顶层Makefile处执行,会在顶层目录生成ctags文件,这个文件中有顶层目录下所有文件的关联信息
在~/.vimrc的最后一行添加 set tags=/home/。。。。u-boot-1.1.6/ctags
然后再用vim打开的文件中,就可以跳转到相关的文件中,定位相关的变量定义
vim的定位步骤,光标移动到相关变量,然后按CTRL+] 进行跳转,跳转是可以递归的,然后按CTRL+o 可以返回
{
ctags -R *
ls
vim tags
}
u 撤销
CTRL+V 局部激活 (可以一列一列的)
作业?
下载u-boot-1.1.6 和 2014-3
环境变量:
setenv niuniu good man 设置
saveenv 保存
printenv 打印
setenv niuniu 删除(再设置一次)
saveenv
网络:
setenv ipaddr 192.168.12.222
saveenv
setenv serverip 192.168.12.62
ping 192.168.12.252 (不可以ping自己)
netstat -u4a ---> udp 0 0 *:tftp *:*(证明服务器存在)
设置服务器目录
tftpboot 30008000 led.bin
#boot nand erase 0 1000
nand write 30008000(内存) 0(nand flash 0字节处) 1000(字节大小)---〉实用系统开发 7、
dpkg -l | grep tftp 查看是否有服务器
{ ii tftp-hpa 5.0-11ubuntu2.1 HPA‘s tftp client
ii tftpd-hpa 5.0-11ubuntu2.1 HPA‘s tftp server }
任务?
uboot环境变量?
是否可以自己定义环境变量?自己定义的有什么意义?
uboot环境变量怎么操作?
ping通自己的ubuntu?
在ubuntu下设置tftp服务器?
netstat -u4a?
/etc/services?
/etc/default/tftpd-hpa?
tftpboot 30008000 led.bin?
为什么tftpboot不用加ip地址?
----内核移植----?
tar -xvf linux-2.6.32.2
cd linux-2.6.32.2
vim Makefile
#183 $ arm
#184
make mini2440_defconfig
make uImage
cd u-boot-1.1.6/
ls cd tools/
sudo cp mkimage /bin/ 产生uImage
(1)启动内核--〉手动
make uImage
cd linux-2.6.32.2/arch/arm/boot/
ls
cp uImage var/lib/tftpboot/
cp u-boot.bin /tftpboot/
kermit -c
tftpboot 30008000 u-boot.bin 加载u-boot.bin到内存,覆盖掉niu-u-boot.bin
setenv ipaddr 192.168.12.222
setenv serverip 192.168.12.62
saveenv
----> 覆盖之前的u-boot.bin
help nand
nand erase 0 100000
nand write 30008000 0 100000
reset 复位
setenv ipaddr 192.168.12.222
setenv serverip 192.168.12.62
saveenv
printenv
tftpboot 30006000 uImage
bootm 30006000
(2)启动内核--〉自动
bootcmd 修改倒计时3 2 1 ---〉 为0 :bootdelay 0
setenv bootcmd tftpboot 30006000 uImage\;bootm 30006000
saveenv
printenv
重启电源,不要按enter(需要网线,拔了网线,就消失了)
(3) 写到nand flash,拔出网线仍可以启动
nand erase clean 全部擦除
tftpboot 30008000 u-boot.bin / 用minitools进行拷贝
nand write.jffs2 30008000 0 100000 (需要.jffs2,遇到坏块可以跳过)
setenv addrip
setenv serverip
tftpboot 30008000 uImage
nand write.jffs2 30008000 100000 500000 (从30008000写到100000,大小为5M)
setenv bootcmd nand read.jffs2 30006000 100000 500000\;bootm 30006000 (30006000:必须在30008000靠前一点)
uncompres 解压
做一下 Mini2440 之Linux 移植开发实战指南 3、
----文件系统移植----?
make distclean 删除中间文件(变成刚刚下载的样子)
{ smdk2440 用的是smdk2410 的_defconfig }
先 make mini2440_defconfig (一次)
再
make
make menuconfig (在最上层目录) 是否保存:Yes 会生成 .config 两下Esc退出
vim .config
文件系统:硬盘的组织形式
移植根文件系统
/bin(ls) /sys(驱动)---〉/proc + /dev(相应的设备) /etc(配置文件)
内核不能和文件系统起冲突,文件系统不能和 起冲突
内核不需要uboot
内核启动时,把flash分区
步骤?
cd busybox-1.13.3
make menuconfig
参照参考手册
vim .config
make
make install
cp /gcc...arm-none/arm-none/bin rootfs/lib (复制目录cp -a) *so*
arm-linux-readelf /home/lh/Desktop/software/busybox-1.13.3/busybox -a | grep Sh 查看必须的库
最后生成 rootfs.jfft2 约13M
只有busy-box一个可执行文件,其他都为软链接
ping 192.168.12.62
tftpboot 30008000 uImage
nand write.jffs2 30008000 100000 500000 (从30008000写到100000,大小为5M)
setenv bootcmd nand read.jffs2 30006000 100000 500000\;bootm 30006000 (30006000:必须在30008000靠前一点)
[sram=w]# (可以)
设置主机ip:
从磁盘获取。。。
------------------驱动编程----------------------
sudo insmod ./globalmem.ko
sudo rmmod globalmem
lsmod | grep global*
cat /dev/glo*
day04?
77.pdf
能读几个
要读几个
day05?
88.pdf
ioctl 设置属性
setsockopt 更改缓冲区属性
echo "abcde" 〉 /dev/globalpipe1 写
cat /dev/globalpipe1 读
e 6章02
day06?
e 6章01
整型占 32位
5种io模型
netstat -nap | grep app 查看有木有服务器
man 2 fcntl
server中: -----〉man ipv4 (red hat)
ipv4.sin_family = AF_INET;
ipv4.sin_addr.s_addr = INADDR_ANY;
ipv4.sin_port = htons(PORT);
day07?
e 6.3
10.pdf
锁: 自旋锁 信号量
顶半部 + 底半部 (定时器:定时为顶半部,10s后响应为底半部)
keys
day08?
irq_adc.c(内核源码树中已有adc中断,需设置成共享,再判断中断是哪个产生的)
tar -xvf linux-2.6.32.2_usb.tar.gz
cd /linux-2.6.32.2/drivers/char
vim mini2440_adc.c
在
//中断处理函数 中加:
if(dev_id != &adcdev)
return IRQ_NONE;
cd /linux-2.6.32.2
sudo cp /home/lh/Desktop/software/mkimage /bin/ 产生uImage
make mini2440_defconfig
make uImage
智能家居项目:
AM2302?
起始信号:输出 低电平 延时至少800us
释放总线:输出 高电平/ 输入
响应信号: 判断是否低电平(while)--〉低 可能有响应
读取40位:申请一长度为5的数组
V4l:
1.打开设备 /dev/video open
2.查看能力(是否有捕获能力) ioctl(video.fd,,)
vi /usr/include/linux/videodev2.h
v4l2 capability
#245 CAPTURE 捕获
3.每秒捕获多少帧
4.捕获
5.关闭
开始采集 STREAMON STREAMOFF
mmap 内存映射
摄像头:
cd /mnt/v4l2
cp libjpeg_arm/lib/* /lib/
修改内核:
mini2440-〉images-〉linux-〉 vboot.bin zImage_p35 rootfs_qtopia_qt4.img
cheng
uname -r 2.6.32.2-FriendlyARM
把你从光盘里拿出的内核解压后,的文件,linux-2.6.32.2,进入
vi Makefile
改为 当前版本号 2.6.32.2-FriendlyARM(把原来的EXTRAVERSION=.2-FRIENDLYARM)
需要.config文件(如果没有.config 文件,那么我们需要吧一个文件config_mini2440_x35不知道是cp 成.config)
make
modinfo ./led_driver.ko 查看版本信息
显示:
vermagic: 2.6.32.2-FriendlyARM mod_unload ARMv4 成功
关闭板子led进程:
vi /etc/init.d/rcS/
#leds start service #注释掉
重启
结构体
struct homeinfo{
int ledinfo[4],int meiqiinfo,int yanwuinfo}
led:
Unable to handle kernel NULL pointer dereference at virtual address 00000000 ** 内核中存在空指针
去掉 struct keysdev *keysdev = filp->private_data;
是否缺少 return
keys:
CTRL + c 之后不能在执行 ./app 提示lock failed 原因:上一个lock,没有up()
在keyscan中加up()解锁
标签:
原文地址:http://www.cnblogs.com/coding4/p/5604776.html