技术生涯中的第一本书

这本书不一定是入门的最佳首选,但是它能带你站在一定高度来学习单片机知识,书中内容写作仓促,欢迎大家批评指证,这本书仅仅只是个开始,后期将给大家带来更多劲爆优质内容 作者邮箱:wangls121@163.com



内容简介
单片机是一门对综合性知识要求非常高的课程,单片机的入门一直以来对初学者来说是个老大难题,而入门后如何将这些知识运用到实际项目中,进一步提升单片机开发使用技能又是一个难题。一般来说,实战项目带有很多技巧性,需要大量的知识和经验积累。针对这些情况,本书将从入门和实用的角度出发,全面系统的介绍单片机从入门到进阶以及实战的技巧。全书包含两大部分,第一部分以单片机入门为主,通过对比8051、PIC16、MSP430、STM32多种单片机和Arduino开发平台下I/O、中断、定时器、扩展芯片、I2C总线、SPI总线以及串口等外设模块的使用方式,通过总结介绍了一套适用于通用单片机外设的开发方法;第二部分结合实际单片机项目中的方法与技巧,从工程的角度出发,围绕读者将会面对的工程领域电路以及软件开发方法、代码规范、模块化程序编写、项目基本开发流程、实用状态机编程、单片机操作系统思维方式编程、算法的本质以及常用算法原理与应用场景、单片机中的数据结构、代码版本管理、基于模型开发方式实例分析与移植、Arduino开发平台介绍与基本使用方法、Vscode开发工具在单片机中的应用,让入门读者近距离感受工程项目中的开发方式。
本书适合作为电子信息类本、专科学生入门与进阶单片机知识的参考书,也可作为电子爱好者实战参考书,对于单片机或嵌入式工程师来说也是一本不错的参考书籍。

本身旨在为初学者打造一本全方位介绍单片机入门与进阶的书籍,帮助初学者入门,并梳理单片机学习过程中的整个脉络。可能有读者朋友会问,市面上有这么多单片机入门书籍和视频,本书在内容上有什么优势?这里简单的谈谈自己的看法,作者虽然谈不上是这个行业的名家,但是曾经带过很多初学者,也经常与刚踏入单片机行业或放弃该行业的从业者进行交流,加上作者本身是通过一步步自学过来的,也长期混迹于各大论坛和行业技术群,对单片机学习过程中的“坑”深有体会,这里所说的“坑”倒也不是学习单片机本身面临的知识点难度,而是适合初学者的一套学习方法。所以在本书中,读者也将看到贯穿全书都是介绍方法与思路。其实各行各业都一样,入门这一步非常困难,困难在刚开始读者对很多东西(以单片机为例:C语言、单片机原理、模拟电路基础知识、数字电路基础知识、计算机原理、I2C总线、SPI总线、寄存器)都不懂,不知道从何学起,但是一旦入门了之后,很多读者经常会感慨“这个玩意原来就这么回事!!”,脉络清晰了,怎么去补充知识,怎么去学,自然而然也就清晰了。本书内容仅仅只是帮助初学者如何去学习,限于篇幅,许多知识点没有进一步展开介绍,俗话说的好“师傅领进门,修行靠个人”,单片机和嵌入式开发也一样,入门之后,根据每个人的职业规划或爱好可以朝着自己的方向不断的去补充新的知识和技能。
许多初学者以为单片机开发就是写代码,在作者看来,写代码应该放到最后一步。首先读者需要将整个单片机项目分解、细化,看下哪些知识点是自己熟悉的,哪些是自己不熟悉的,不熟悉知识点再进一步分解成哪些是要花时间与精力解决的,整个项目要使用什么样的软件框架,把关键问题解决之后再去写代码,会起到事半功倍的效果。
掌握模块化设计思路,其实各行各业都有这种模块化思想,例如一辆机动车自上往下看包括发动机、变速箱、底盘、外观、内饰等,如果再进一步分解发动机则包括排气系统、进气系统、冷却系统、燃油系统、配气机构、曲轴连杆等模块组成。单片机系统里面这种模块化思想也体现的淋漓尽致,一个单片机包括CPU、RAM、FLASH、时钟系统、输入输出I/O、I2C、SPI、串口、定时器、RTC模块;一个单片机项目包含的程序模块通常有数字输入模块、数字输出模块、通信模块、系统调度模块等,掌握这种模块化设计思想会让你在各行各业中获益良多。
作者是个物理爱好者,大学期间学的也是物理学专业,出于对电子技术的热爱,从大二开始,不断参加各种科技、电子协会,帮助班上和在校同学解决各种电器问题,小到吹风、音响,大到电视机、电脑、空调、洗衣机,还多次积极协助组织参与三下乡活动,将科技知识带进农村,为老百姓切切实实答疑解惑并解决实际电器问题。此外,作者也多次参加各层级举办的电子类竞赛,尽管有的比赛成绩不是很理想,但是在竞赛过程中都能学有所获、受益良多。正是这些实战经历,使得作者在很多方面对单片机和嵌入式的理解比较独特,也希望这些独特的理解能帮到各位读者。
本书内容安排从每个阶段实用的角度出发,秉持着通俗易懂的原则,第一部分主要为介绍单片机入门知识,与众多介绍单片机入门的方式不同,作者特地选择了市面上常用的四种单片机(STC89C52RC,PIC16,MSP430和STM32)与开源界非常流行的Arduino开发平台进行对比,一方面通过对比为了帮助读者了解不同单片机的开发方式,另外也可以总结这些单片机开发方式的共同点,以便读者以后碰到新单片机时可以将这种技巧快速应用其中。
一直以来,单片机进阶是很多单片机初学者面临的老大难问题,一方面市面上系统性的书籍比较少,另外一方面单片机进阶学习需要结合实际项目,单纯通过理论方式很难将这些经验描述到位,作者花了很多心思梳理了单片机进阶的整个知识框架,从第16章的实际工程应用中的电路着手到第17章的软件痛点分析,其中参考了网上大量文章以及初具规模公司中实用的一些规范,在第18章介绍了基础版的代码规范,旨在帮助读者养成一个良好的代码编写习惯。实际项目中的程序往往是复杂但又有迹可循的,第19章中特地介绍了如何编写模块化程序,以便读者更好读懂和编写一定代码量的单片机程序。而要做好一个单片机项目,特别是在多个人协同开发时,一个好的研发流程显得尤为重要,很多技术公司发展到一定规模都面临流程上的问题,第20章中作者以一个实际的案例介绍了一个完整项目的基本开发流程,为了更进一步的让读者对这种开发方式有所理解,在第21章中特地补充了一个实际做好的项目,来进一步帮助读者巩固研发流程。从第22章开始主要介绍一些实际项目中的技巧,例如第22章中的状态机原理以及实际项目中哪些地方用到状态机,并进一步延伸出状态机更广泛的用途。而在第23章中则使用通俗易懂的方式介绍操作系统方式编程和如何打造一个基础版的操作系统,通过与市面上非常流行的实时系统uCOSII做对比,读者会发现其实开发操作系统也没有想象中的那么难。在校期间,很多计算机与电子类专业学生经常会听到老师说算法才是程序的灵魂,但是算法到底是什么以及单片机中算法该如何使用,在第24章中进行了详细的介绍,而为了让读者进一步认识算法,在第25章和第26章中加入了两个非常熟悉的游戏--贪吃蛇与俄罗斯方块在Windows中和单片机上的实现方式,让读者可以更进一步的理解算法的本质。单片机软件本身是抽象的,单片机能实现相应功能,其实主要是程序编写者的功劳,为了将这些单片机资源利用好,数据结构在这其中起到了重要作用,第26章中详细介绍了单片机中常用的几种数据结构。许多单片机入门者包括从业多年的工程师对于如何维护代码一直比较模糊,特别是多人协作开发同一个项目时,这种问题显得尤为突出,第27章针对当前流行的分布式代码版本管理作了基础和实用的介绍,这种管理方式无论是对于写代码还是文档管理都是非常不错的一个选择。作者认为技术从业者要勇于探索和拥抱新的技术、新的开发方式,人类社会的进步就是机器不断取代人力的过程,单片机开发也一样,特别是长期从事单片机开发行业的工程师应该有感触,绝大部分时间都是在做一些普通人都能做得事情,对于一款单片机来说它的资源、开发方式基本上是固定的,所以第28章中介绍了一种基于模型的开发方式,这种开发方式在未来一定会得到全面普及,只是以何种方式、时间出现的问题。一个好的工具、平台同样也能加速项目开发效率,第29章介绍的Arduino开发平台,尽管许多读者非常熟悉,但是也希望通过本书这种介绍方式读者能对开源平台有一个全新的理解。而第30章的Vscode也算是微软近年来的大作,几乎横跨整个代码界面,其便捷性和可扩展性给工程师带来了极大的便利性。
最后感谢周围关心与支持作者的亲人与朋友,本书写作过程比较仓促,有些内容表达上有所欠缺,希望读者朋友能够谅解,也真心希望读者朋友能通过本书学到或悟到一些对您有用的东西。





























目 录
第一部分 入门篇
第1章 经典的LED例子
1.1 8051单片机点亮LED
1.2 STM32单片机点亮LED
1.3 MSP430单片机点亮LED
1.4 PIC单片机点亮LED
1.5 Arduino点亮LED
思考与拓展
第2章 LED点亮例子剖析
2.1 LED电路解析
2.2 单片机对比介绍
2.2.1 电脑主板
2.2.2 手机“CPU”
2.2.3 单片机内部组成
2.3 单片机运行程序简介
2.3.1 CPU运行程序本质
1. 加法运算
2. 减法运算
3. 乘法运算
4. 除法运算
2.3.2 CPU执行程序汇编分析
2.4 单片机与Arduino的关联与区别
第3章 初学者搭建电路的神器——面包板
3.1初学者使用面包板的好处
3.2 面包板使用简介
3.3 面包板在实际项目中的妙用
3.3.1 原型电路验证
3.3.2 单片机连接分立元器件或模块
3.3.3 多平台、多模块系统验证
思考与拓展
第4章 开发环境搭建
4.1 8051单片机Keil开发环境搭建
4.1.1 8051单片机软件安装与编译
4.1.2 STC系列8051单片机代码下载
4.2 STM32单片机开发环境搭建
4.2.1 STM32单片机软件安装与编译
4.2.2 STM32单片机代码下载
1.SWD方式下载
2.串口下载
4.3 MSP430开发环境搭建
4.3.1 软件安装与编译
4.3.2 代码下载
4.4 PIC开发环境搭建
4.4.1 软件安装与编译
4.4.2 PIC单片机代码下载
4.5 Arduino开发环境搭建
4.5.1 ArduinoIDE开发环境搭建
4.5.2 ArduinoIDE代码下载
4.5.3 MSP430 Arduino开发环境搭建
4.6 Proteus仿真环境搭建
思考与拓展
第5章 基本输出IO口——多变的输出控制
5.1 I/O基本知识
5.1.1 万物皆有电阻
5.1.2 欧姆定律
5.1.2 I/O专业术语
1.开漏输出
2.上拉输出
3.推挽输出
4.高边开关
5.低边开关
5.2 单片机I/O口输出电路内部剖析
5.2.1 STC单片机I/O口
5.2.2 PIC16单片机I/O口
5.2.3 MSP430单片机I/O口
5.2.4 STM32单片机I/O口
5.3 I/O作为输出用的几种方式
5.3.1 小电流输出驱动
5.3.2 电平或功率匹配
5.3.3 大功率大电压驱动
5.3.3 设备工作电压远高于安全电压
思考与拓展
第6章 基本输入I/O口——不限于按键输入
6.1 开关基础知识普及
6.1.1 微动开关
6.1.2 感应开关
6.1.3 电容触摸开关
6.1.4 人体感应模块
6.1.5 普通6*6按键
6.2 单片机I/O输入模式
6.2.1 上拉输入
6.2.2 下拉输入
6.2.3 浮空输入
6.3 单片机I/O口输入电路内部剖析
6.3.1 8051单片机I/O输入
6.3.2 PIC16单片机I/O输入
6.3.3 MSP430单片机I/O输入
6.3.4 STM32单片机I/O输入
6.4 几种常用的输入方式
6.4.1 直连单片机I/O口
6.4.2 匹配电平后连接单片机I/O口
6.4.3 超过安全电压或跨距离信号输入
思考与拓展
第7章 单片机引脚不够用怎么办——外挂扩展芯片
7.1 使用扩展芯片情形及基本步骤
7.2 8051单片机实现3-8线译码器驱动
7.3 8051单片机实现74HC245收发器驱动
7.4 8051单片机实现74HC573锁存器驱动
思考与拓展
第8章 中断——单片机“一心多用”却不落下重要事情
8.1 生活中场景与外部中断对比
8.2 8051单片机外部中断
8.3 PIC16单片机中断
8.4 MSP430单片机中断
8.5 STM32单片机中断
8.6 Arduino外部中断
8.7 外部中断总结
思考与拓展
第9章 不甘只做定时器-它还有很多其它妙用
9.1 8051单片机定时器
9.2 PIC16定时器
9.3 MSP430定时器
9.4 STM32定时器
9.5 Arduino定时器
9.6 定时器使用总结
思考与拓展
第10章 少引脚做多事情——总线
10.1 总线由来简介
10.2 总线初探
10.2.1 手动模拟驱动74HC595
10.2.2 8051单片机驱动74HC595
10.3 SPI总线原理与使用
10.3.1 SPI总线介绍
10.3.2 51单片机驱动MCP23S08输出
10.3.3 51单片机读取MCP23S08按键值
10.4 I2C总线驱动PCA9554
10.4.1 I2C总线简单介绍
1. 起始位
2. 停止位
3. 数据位
10.4.2 输出控制流水灯
10.4.3 读取I2C输入数据控制LED
思考与拓展
第11章 串口通信——单片机与外界沟通常用方式
11.1 原始通信方式与基本概念
11.1.1 单工通信模式
11.1.2 半双工通信模式
11.1.3 全双工通信模式
11.2 串口通信基本原理
11.3 串口通信单片机实现
11.3.1 8051单片机串口通信
11.3.2 PIC16单片机串口通信
11.3.3 MSP430单片机串口通信
11.3.4 STM32单片机串口通信
11.3.5 Arduino单片机串口通信
11.3.6 串口通信总结
11.4 同是串口通信,别被接口和协议弄糊涂
11.4.1 串口通信物理接口
1.RS232接口
2.RS485接口
11.4.2 串口通信协议
思考与拓展
第12章 非常重要却常被忽略的技能——调试
12.1 使用硬件调试器dbug
12.1.1 PIC单片机调试
1. MPLAB代码调试步骤
2.MPLAB变量监测
12.1.2 MSP430单片机调试
1.IAR软件调试步骤
2.IAR软件变量监测
12.1.3 STM32调试
1.Keil软件调试步骤
2.Keil软件变量监测
12.1.4 单片机调试器使用总结
12.2 一颗LED灯能反馈的信息众多
12.2.1 定时器中断中使用LED调试
12.2.2 串口通信中使用LED调试
12.2.3 LED直接显示设备状态
12.3 单片机调试使用最多的方式-串口
12.4 任何时候要有快速找到问题的办法
12.4.1 软硬件问题确定
12.4.2 尽可能用熟悉的东西,找可靠渠道购买
思考与拓展
第13章 有趣的显示方式
13.1 生活中的LED变形记
13.2 单总线全彩灯
思考与拓展
第14章 A/D-打开单片机与模拟世界沟通的桥梁
14.1 A/D原理
14.2 PIC单片机A/D
14.3 MSP430单片机A/D
14.4 STM32单片机A/D
14.5 Arduino A/D
思考与拓展
第15章 以为只是个PWM,没想到你有这么多“魔法”
15.1 PWM介绍
15.1.1 多种方式实现PWM
15.1.2 专用名词解释
1.频率
2.占空比
15.2 呼吸灯原理剖析
15.3 舵机控制
15.4 步进电机控制
15.4.1 步进电机原理
15.4.2 步进电机控制
15.5 PWM直流电机调速
思考与拓展
第二部分 提高篇
第16章 学了很多东西,实际项目中如何用——硬件部分
16.1 实际项目电路与单片机入门电路差距
16.2 供电电路
16.2.1 开发板供电
16.2.2 消费电子产品供电
16.2.3 工业控制器供电
16.2.4 车用控制器供电
16.2.5电源电路总结
16.3 输入电路
16.3.1 开发板输入电路
16.3.2 工业输入电路
16.3.3 车用输入电路
16.4 输出电路
16.4.1 工业功率输出电路
16.4.2 车用功率输出电路
16.5 A/D采集电路
16.5.1 工业A/D输入电路
16.5.1 工业A/D输入电路
16.6 通信电路
16.6.1 开发板通信电路
16.6.2 CAN总线通信电路
16.7 对比分析总结
思考与拓展
第17章 别让单片机学习停留在点亮LED——软件部分
17.1 初学者单片机软件能力徘徊不前
17.2 怎么改变这种现状
17.2.1 项目分解能力
17.2.2 程序框架搭建能力
17.2.3 算法能力
17.3 学习单片机成长捷径
17.3.1 多做项目
17.3.2 明确目标
17.3.3 执行力,拒绝拖延
17.4 站在巨人的肩膀上
17.4.1 Arduino平台
17.4.2开源代码托管平台
思考与拓展
第18章 要想路儿走的远,编程规范少不了
18.1 组织结构
18.1.1 工程文件组织结构
18.1.2 文件夹代码组织结构
18.1.3 程序结构
18.2 标识符命名
18.2.1 命名基本原则
18.2.2 宏与常量命名
18.2.3 变量命名
18.2.4 函数命名
18.2.5 文件命名
18.3 代码排版
18.3.1 代码缩进
18.3.2 代码分行
18.3.3 头文件
18.3.4 注释排版
18.3.5 代码可读性
18.4 注释
18.4.1 注释基本原则
18.4.2 文件注释
18.4.3 函数与代码注释
1. 函数注释
2. 代码注释
3.变量、常量、宏的注释
18.6 变量、结构、常量、宏
18.6.1 变量定义
18.6.2 类型前缀定义
18.6.3 变量作用域
18.6.4 结构体与枚举命名
18.6.5 常量、宏、模版命名规则
18.6.6 位域
18.7 函数规范
18.7.1 函数命名
18.7.2 函数参数
18.8 变量和结构规范
18.9 宏表达式与常量规范
18.10 表达式规范
思考与拓展
第19章 模块化程序编写
19.1 点亮一颗LED模块化程序改造
19.1.1 xxx.h文件编写
19.1.2 xxx.c文件编写
19.2 模块化程序编写进阶
19.3 打造可重复利用的软件模块
思考与拓展
第20章 多功能电子钟——项目开发基本流程
20.1 项目需求
20.1.1 客户描述
20.1.2 需求整理
20.2 项目规格说明
20.3 项目总体方案
20.4 项目概要设计
20.4.1 硬件概要方案
20.4.2 软件概要设计
20.5 项目详细设计
20.5.1 硬件详细方案
20.5.2 软件详细方案
20.6 项目调试与验证
20.6.1 硬件调试
20.6.2 软件部分
20.7 项目测试
20.7.1 功能测试
20.7.2 压力测试
20.7.3 外界环境测试
20.8 项目批量阶段
思考与拓展
第21章 网红楼梯灯
21.1 项目需求
21.2 项目规格说明
21.3 项目总体方案
21.4 项目概要设计
21.4.1 硬件概要方案
21.5 项目详细设计
21.5.1 硬件详细方案
21.5.2 软件详细方案
21.6 项目调试与验证
21.6.1 控制器调试
21.6.2 LED驱动板调试
21.6.3 软件验证
21.7 项目测试
21.7.1 硬件测试
21.7.2 软件测试
1. 正常功能测试
2. 异常功能测试
第22章 状态机编程,不止于按键
22.1 状态机实现按键功能
22.2 状态机基本原理与实现
22.2.1 状态机原理
22.2.2 状态机实现
22.3 状态机串口接收协议
22.3.1 简单版串口协议
22.3.2 实用串口协议
思考与拓展
第23章 可以不用操作系统,但是要会操作系统方式编程
23.1 不要被操作系统吓到,其实它也可以很简单
23.2 动手写一个简单操作系统
23.2.1 构造一个简单的调度器
1. 定义一个任务结构体
2. 构造任务添加函数
3. 构造调度执行函数
4. 任务更新函数
5. 任务启动
23.3 与市面主流系统对比
思考与拓展
第24章 算法和程序是两码事
24.1 程序和算法
24.1.1 算法本质
24.1.2 程序本质以及与算法之间联系
24.2 单片机项目中的典型算法
24.2.1 滤波算法
1. 限幅滤波
2. 中位值滤波法
24.2.2 PID算法
1.只有比例系数P的情况
2.微分系数D
3.积分系数I
24.2.3 校验算法
1.校验和
2.异或校验
3.CRC校验
4.MD5算法
5.查表算法
24.3别花太多时间在程序,算法才是值得付出的
思考与拓展
第25章 Windows和单片机平台算法对比
25.1 贪吃蛇
25.1.1 贪吃蛇游戏实现要点
25.1.2 贪吃蛇原理解析
1.绘制贪吃蛇游戏区域
2.蛇身移动
3.绘制食物
4.游戏结束判断
5.蛇“吃”食物
6.难度自动增加功能
25.2 Windows下贪吃蛇代码解析
25.2.1游戏区域初始化
25.2.2 绘制食物与蛇身
1.绘制食物
2.蛇身绘制
25.2.3 检测蛇碰撞
25.2.4 蛇吃食物
25.2.5 蛇身移动坐标更新
25.2.6 蛇身变换方向
25.3 单片机实现贪吃蛇
25.3.1 游戏变量与宏定义
25.3.2 复位蛇身与游戏开始
25.3.3 按键检测与设定蛇运动方向
25.3.4 蛇身移动坐标更新
25.3.5 吃食物检测
25.3.6 产生新食物
25.3.7 碰撞检测
25.3.8 显示蛇与食物
25.4 俄罗斯方块
25.4.1 俄罗斯方块类型
25.4.2 方块下落显示区域
25.4.3 预览方块和分数显示
25.4.4 按键检测和移动方块
1.按键检测
2.移动方块
3.正常下落
4.向左向右移动方块
5.向下移动方块
25.4.5 旋转方块
25.4.6 方块消除
思考与拓展
第26章 数据结构-怎么感受不到你的存在
26.1 链表-多任务调度
26.1.1单向链表
1.单向链表结构体定义
2.创建单向链表
3.单链表插入节点
4.单链表删除操作
5.判断单链表是否为空
6.获取单链表中节点个数
26.1.2 双向链表
1.双向链表和单向链表的区别
2. 双链表结构体定义
3. 初始化双向链表
4.尾部插入一个节点
5.指定节点前面插入
6.删除指定节点
7.检查链表是否为空
26.2 队列-通信缓冲
26.2.1 环形队列基本操作
1.队列结构体
2.队列初始化
3.清空队列
4.入队
5.出队
26.2.2 8051单片机队列操作示例
1.队列大小及缓存定义
2.队列初始化
3.队列入队操作
26.2.3 队列操作在实时系统中的应用
思考与拓展
第27章 代码版本管理-让你的代码管理更规范
27.1 混乱的代码管理方式
27.1.1 复制粘贴-标题命名法
27.1.2 复制粘贴-日期管理法
27.3 使用工具科学管理代码,让重复的代码不重复
27.3.1 代码管理软件介绍
27.3.2 代码管理软件安装
27.3.3 代码管理软件打开与使用
1. Git Extensions打开
2. Git Extensions新建仓库与文件推送
3. Git Extensions 文件变更
27.4 Git基本原理介绍
27.4.1 Git简介
27.4.2 Git能够解决的问题
27.4.3 Git实现原理
思考与拓展
第28章 不用写一行代码的开发方式——基于模型开发
28.1 一个基于模型的简单例子
28.2 当你以写代码为荣时,殊不知正在被机器悄悄取代
28.3 任意单片机使用基于模型开发
28.3.1 8051单片机使用Simulink模型开发
28.2.2 simulink生成模型代码简单剖析
28.2.3 其它单片机模型移植
28.4 基于模型开发方式进阶思考
思考与拓展
第29章 打造实用的Arduino平台
29.1 打造个人的Arduino开发平台
29.1.1 添加Arduino支持的单片机类型
1.在线方式安装Arduino硬件支持包
29.1.2 添加Arduino软件库
1.在线添加库
2.离线添加库
29.2 Arduino IDE多文件工程建立
29.3 多种仿真平台总有一个适合你
29.3.1 使用Proteus仿真Arduino
29.3.2 在线TinkerCAD仿真
29.3.3 使用在线wokwi仿真
思考与拓展
第30章 万能开发工具Vscode
30.1 Vscode简介
30.2 Vscode开发环境搭建
30.3 单片机开发平台PlatformIO
30.3.1 添加PlatformIO扩展插件
30.3.2 PlatformIO新建8051单片机工程
30.3.3 PlatformIO新建Arduino工程
思考与拓展