• chengdongyue的笔记



    ---------------------------------------- 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.变量
    变量必须随时先定义后使用
    常用的转义字符
    ---水平指标(8个空格)
    v---垂直制表
    ---回车
    ---换行
    ---推格
    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 -- 求字符串的长度 (不包含'')
    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:是函数,计算字符串长度,不包括, 本身是结尾标示符
    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()解锁


  • 相关阅读:
    webstorm 2017 激活破解 最新 2018
    phpexcel 导出xsl乱码
    微信小程序的z-index在苹果ios无效
    onenote架设在局域网服务器
    .gitignore忽略多层文件夹用**
    phpstorm 使用xdebug断点
    Phpstudy 无法启动mysql
    git使用kdiff3合并乱码问题
    小程序回退刷新操作
    Navicat 连接远程服务器mysql 长时间不操作会连接很久
  • 原文地址:https://www.cnblogs.com/coding4/p/5604776.html
Copyright © 2020-2023  润新知