第三阶段.Linux+arm

一.树莓派开发

1.刷机

2.登录树莓派

3.分文件编程

a.分模块的编程思想

b.方便调试

c.主程序简洁

注:其他文件的功能函数需要在.h文件中声明,并且主程序文件包含此.h的头文件

头文件" ",优先从当前路径去找

头文件《》,默认从user/include 下面去找

4.库

Linux共享库、静态库、动态库详解 - sunsky303 - 博客园

a. 静态库:

程序执行之前(编译),就加入到目标程序之中。

 

b.动态库

动态函数库,是在程序执行时动态(临时)由目标程序去调用

 5.库的制作

a.静态库的制作

      格式xxxx.a

  1. gcc calcufuncs.c -c 生成xxx.o文件
  2. ar rcs libcalcufunc.a calcufuncs.o  xxx.o文件生成xxx.a静态库文件

b.动态库的制作:

    a. gcc -shared -fpic calcufuncs.c -o libcalc.so

        -shared 指定生成动态库

        -fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。

6.库的使用

静态库:

gcc calculatorT.c -lcalcufunc -L ./ -o mainProStatic

-lcalcufunc -l     是制定要用的静态库,库名砍头去尾

-L告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib  /usr/local/lib去找

动态库:

gcc calculatorT.c -lcalc -L ./ -o mainProDy

==========================================================                 

引用动态库,怎么指定动态库的位置

linux动态库(.so)搜索路径(目录)设置方法 - zhangzheng08pku - 博客园

带动态库的程序,

可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件

export LD_LIBRARY_PATH="/home/pi/back/test"

7.串口通讯概述

1.全双工和半双工

2.数据位 停止位 奇偶校验位

语音模块+树莓派

wiringPiSetup();

fd = serialOpen("/dev/ttyAMA0",9600);

nread = read(fd,cmd,sizeof(cmd));

8.交叉编译

1. 交叉编译是什么?

交叉编译 是在一个平台上生成另一个平台上的可执行代码。

C51 交叉编译的发生在keil(集成环境上面)

2.为什么要交叉编译?

平台上不允许或不能够安装我们所需要的编译器比如C51

a.因为目的平台上的资源贫乏,无法运行我们所需要编译器
b.树莓派是不是就不需要交叉编译?
            错。也要  树莓派有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
            操作系统也是代码,也要编译!

            平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心

    宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
    目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。

交叉编译用到的工具:交叉编译器、交叉编译工具链

3. 交叉编译工具链的安装
    https://github.com/raspberrypi/

    从共享文件夹拷贝到工作目录
     cp /mnt/hgfs/share/tools-master.zip .
     解压
     unzip tools-master.zip 
     cd /home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
     pwd获得路径

     echo $PATH 获得当前环境变量的值


   3.1 临时有效,配置环境变量
        PATH 环境变量
        export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
  3.2 永久有效,配置环境变量

   修改工作目录下的.bashrc 隐藏文件,配置命令终端的
         vi /home/CLC/.bashrc 
         在文件最后一行加入:
             export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
         source /home/CLC/.bashrc 加载配置文件,马上生效配置。

4. 交叉编译服务端客户端

        交叉编译:
            检查下交叉编译工具对不对:
                arm-linux-gnueabihf-gcc -v
                4.8.3

        arm-linux-gnueabihf-gcc  xxx.c -o xxx

        如何把编译生成的可执行文件下载到开发板:
        scp clientInPi pi@192.168.43.30:/home/pi
        指令  文件名  开发板用户名@开发板地址:开发板的绝对路径

5. 带wiringPi库的交叉编译如何进行
        1. 正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。
        2. 通过-I -L来指定
         
         因为链接的库的格式不对,是宿主机的平台,出现以下错误
          arm-linux-gnueabihf-gcc demo2.c -I /home/CLC/lessonPI/WiringPi/wiringPi -lwiringPi
        /home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lwiringPi
        collect2: error: ld returned 1 exit status

        把树莓派的wringPI库拿上来用

        软链接:
        参考文章: https://www.cnblogs.com/zhangna1998517/p/11347364.html
        概念:
             1. 软链接文件有类似于Windows的快捷方式。
             2. 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
             3. 你选定的位置上生成一个文件的镜像,不会占用磁盘空间
        如何生成:
        ln -s libwiringPi.so.2.50 libwiringPi.so 
        指令 参数   要被链接的文件    软链接文件名字

        硬链接:ln libwiringPi.so.2.50 libwiringPi.so 
                它会在你选定的位置上生成一个和源文件大小相同的文件

9.Linux 内核基础

1.树莓派等芯片带操作系统的启动过程

        C51,STM32(裸机)》》》》》》C直接操控底层寄存器实现相关业务。  业务流程型的裸机代码
                            遥控灯: while(1)
                            垃圾桶:WemosD1 LOOP
                            恩智浦智能车: stm32
        
        X86,Intel   windows
        启动过程:  电源 -》 BIOS -》windows内核-》C,D盘-》 程序启动(QQ)

        嵌入式产品: 树莓派,mini2440, mini6410,nanopi,海思,RK(瑞芯微)------人脸识别打卡器,智能家居主控。。。
        启动过程:  电源-》BootLoader(引导操作系统启动)-》Linux内核-》文件系统(根据功能性来组织文件夹,带访问权限)-》KTV点歌机,
    
        安卓
        启动过程:  电源-》 fastBoot/Bootloader/-》linux内核-》文件系统-》虚拟机-》HOME应用程序-》点某图标打开某APP


        BootLoader:   一阶段 让CPU  跟内存,FLASH, 串口,IIC,IIS, 数据段,打交道,驱动这些设备(汇编和C结合)
                                  二阶段: 引导Linux内核启动 (纯C)

2.树莓派Linux源码目录树分析

Linux内核源代码目录树结构 - maxiongying - 博客园

3.树莓派Linux源码配置
            驱动代码的编写
            驱动代码的编译需要一个提前编译好的内核
            编译内核就必须配置
            配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核

    
                厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码
            第一种方式:
                cp 厂家.config .config
            第二种方式:
                make menuconfig 一项项配置,通常是基于厂家的config来配置
            第三种方式:
                完全自己来


            如何配置树莓派的Linux内核

            驱动两种加载方式:
                * 编译进内核  zImage包含了驱动
                M 模块方式生成驱动文件xxx.ko  系统启动后,通过命令inmosd xxx.ko 加载


            内核配置:
            ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
                         指定ARM架构        指定编译器                      树莓派          主要核心指令

4. 树莓派Linux内核编译
            
            4.1 编译:
            ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
                                            指定用多少电脑资源进行编译
                                            zImage生成内核镜像
                                            modules要生成驱动模块
                                            dtbs生成配置文件

           4.2 编译成功后,看到源码树目录多了vmlinux,失败则无此文件
                 成功后,目标zImage镜像arch/arm/boot底下

            4.3 打包zImage成树莓派可用的xxx.img
            ./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

            4.4 数据拷贝
                mkdir data1 data2
                挂载U盘
                sudo mount /dev/sdb1 data1   一个fat分区,是boot相关的内容,kernel的img
                sudo mount /dev/sdb2 data2   一个是ext4分区,也就是系统的根目录分区。

                安装modules, 设备驱动文件: hdmi usb wifi io ...
                sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/tanglilin/data2 modules_install

                安装更新 kernel.img 文件,注意镜像名字是kernel7.img
                先备份
                    cd /home/tanglilin/data1
                    cp kernel7.img kernel7OLD.img
                再把编译新生成的拷贝到data1,起名kernel7.img
                    cp kernel_new.img /home/tanglilin/data1/kernel7.img


                拷贝配置文件
        cp arch/arm/boot/dts/.*dtb* /home/tanglilin/data1
        cp arch/arm/boot/dts/overlays/.*dtb* /home/tanglilin/data1/overlays/
        cp arch/arm/boot/dts/overlays/README /home/tanglilin/data1/overlays/

5. 文件系统
    1. 什么是文件系统?
        常规认知: 根目录
        文件系统是操作系统用于明确存储设备组织文件的方法。
        以上说的方法:就是文件管理系统(程序),简称文件系统    

    2. 文件系统(文件管理系统的方法)的种类有哪些?
        FAT VFAT NTFS EXT1/2/3/4 HFS ....
        树莓派查看文件系统的命令: df -T
        vfat  :  boot(bootloader, kernel)
        ext4  :  根目录
        tmpfs : 内存文件系统

    3. 什么是分区?
        windows: 随意(面向普通用户PC),目录即分区
            C(装系统的位置)也可以随意在C盘存放文件.    D盘(用户随意发挥)

        
        Linux: 按照功能来分区,每个分区严格存放文件(开发者)   
            嵌入式系统可以分为4个区,分别是
            bootloader、  启动代码
            para、        启动代码向内核传递参数的位置
            kernel、         内核分区
            根分区等      文件系统结构

    1. 什么是文件系统目录结构?
            常规认知: 根目录,不是分区,和windows不同

    2. 什么虚拟文件系统Virtual File System ?
            vfs就是对各种文件系统的一个抽象,它为各种文件系统提供了一个通用的接口,
    
    3. 虚拟文件系统有什么作用?
        简化应用程序员的开发
            不管是什么文件类型,不管文件是磁盘还是设备,都只用open read write统一操作

   10.内核驱动

1.内核驱动基本架构

    a.驱动代码编写

     b.修改Makefile,告诉编译器,要编译该文件

     c.ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules

2.驱动测试步骤

   a.内核驱动装载:sudo insmod xxx.ko

   b.内核驱动卸载:sudo rmmod  xxx(不写ko)

   c.查看内核模块:lsmod

验证步骤:

  a.装载驱动

  b.驱动装载后生成设备  比如/dev/pin ,通过 sudo chmod  666 /dev/pin4 添加访问权限

  c.运行测试程序调用成功

   d.内核的printk是内核层 的printf,通过 dmesg 信息查看

11.地址

    1.总线地址

      cpu能够访问内存的范围

     现象:装了32位win7系统,明明内存条8g,可是系统只识别了3.8g,装了64位的才识别8g。

      32位表示/访问 2的32次方bit

      bit     4294967296

     kbit   4194304

     mbit   4096

     gbit   4

 树莓派 32位

2.物理地址

硬件的实际地址或绝对地址

3.虚拟地址

逻辑地址是虚拟地址

12.I/O操纵

ioremap:将物理地址转换为虚拟地址,io口寄存器映射成普通内存单元进行访问

iounmap:卸载驱动

按位与,按位或

13.socket,tcp和http三者的区别

最全的socket,tcp,http三者之间的区别和原理_GeniusAng的博客-CSDN博客

1.七层网络模型

2.三次握手四次挥手

Linux进阶之TCP三次握手四次挥手 - Wolf_Coder - 博客园

3.http协议之libcurl

Http协议之libcurl实现 - 谢呈勖 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值