自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(103)
  • 问答 (1)
  • 收藏
  • 关注

原创 9.7 临界区与临界资源

9.7 临界区与临界资源不可重入函数应用场合多任务环境在执行过程中可能会被中断、任务切换打断临界资源一次只允许一个进程使用的共享资源互斥访问,同一时刻只允许一个进程访问举例:打印机、全局变量、静态变量、缓冲区临界区访问临界资源的代码段临界区访问方式:互斥访问同时刻只允许一个进程访问临界区的实现操作原语EnterCriticalSection()LeaveCriticalSection()实现方式互斥访问:信号量、互斥量、自旋锁关中断uC/OS 临界区实现#if OS_

2020-10-31 00:17:51 663

原创 9.8 系统调用 (上)

9.8 系统调用 (上)函数调用自定义函数C标准库第三方库框架操作系统ucos 多任务编程示例void task1(void){ while(1) { ; }}void task2(void){ for(;1;) { ; }}OS_STK stack1[512];OS_STK stack1[512];int main(void){ serial_init(); board_init(); OSInit(); OSTaskCreate(task1

2020-10-31 00:10:43 114

原创 9.6 可重入函数

9.6 可重入函数多任务带来的问题函数sum()被任务task1调用在调用过程中,任务task1挂起调度器运行task2函数sum()被任务task2再次调用可重入函数可重复调用、并发调用、可以被中断在多任务环境中,多次调用,不影响运行结果一般应用在多任务、多进程的运行环境中不可重入函数的标志函数内部使用了全局变量、静态局部变量函数返回全局变量或静态局部变量函数内部使用了malloc/free函数函数内部使用了标准I/O函数函数内部调用了其它不可重入函数可重入函数设计应用场

2020-10-31 00:10:06 115

原创 9.5 函数栈与进程栈

9.5 函数栈与进程栈函数栈帧的作用保存函数上下文局部变量函数参数为什么需要任务栈?任务被打断、调度是随机的作用1:函数栈帧作用2:任务现场需要保存(状态寄存器、被打断地址)uC/OS的任务栈void task(void *pd){; //处理任务的函数}OS_STK task_stack[1024]; //定义一个任务栈int main(){BspInit();OSInit();OSTaskCreate(task,(void *)0,&task_stack[1

2020-10-31 00:03:37 225

原创 9.4 调度器的工作原理

9.4 调度器的工作原理多任务的本质抢占cpu什么是调度器调度器是操作系统的核心:任务切换多任务机制:多个任务轮流使用CPU,达到“并发”目的任务:每个任务是无限循环的时间片轮转:每个任务运行xx毫秒,由时钟或软中断完成简单的调度器/************************************************* Filename: os_schedule.c* Author: litao.wang* Description: *

2020-10-31 00:02:53 583

原创 9.3 多任务的裸机实现(下):状态机

9.3 多任务的裸机实现(下):状态机长延时任务的分解将运行时间较长的任务分解为多个子任务举例:厨师与顾客i多任务的状态机实现解决方案数码管显示:每次只刷新一个数码管按键扫描:按键按下、按键消抖、按键释放裸机状态机例程/************************************************* Filename: state_machine.c* Author: litao.wang* Description: *

2020-10-31 00:02:11 702

原创 9.2 多任务的裸机实现(上)

9.2 多任务的裸机实现(上)多任务带来的时间问题每个任务的执行间隔每个任务的执行时间任务的分类有些任务需要频繁运行:数码管显示、按键扫描有些任务不需要频繁运行:温度传感器、温度设置例程1裸机多任务/************************************************* Filename: task.c* Author: litao.wang* Description: * Create: 2018-07-11

2020-10-31 00:01:45 356

原创 9.1 CPU和操作系统入门

9.1 CPU和操作系统入门嵌入式开发编程特点健壮性安全性实时性各种各样的bug业务逻辑语言语法编译器操作系统硬件电路芯片像系统一样思考– 多任务– 可重入函数– 临界区– 系统调用– 中断原理– 进程栈、中断栈– 存储器映射、重映射– DMA、cache、register– 内存管理单元:MMU– IO端口与IO内存– 位运算、位域...

2020-10-31 00:01:09 101

原创 8.24 模块设计进阶:框架

8.24 模块设计进阶:框架什么是框架(framework)?可扩展的应用骨架对众多应用的相同功能进行分离、抽象将应用中一些通用的功能模块化通用的模块下沉,专用的模块上浮,慢慢迭代为框架框架是半成品:基于框架可以快速开发应用框架举例:开发板框架特点半成品、可扩展应用依赖性使用框架的好处更高层次的代码复用:将重复代码按照一定框架统一起来,实现模块级代码复用,避免重复造轮子提高软件开发质量、降低开发成本快速开发产品、提高工作效率框架与库取别组织形式框架相当于定义了应用骨架,可

2020-10-31 00:00:39 229

原创 8.23 模块设计进阶:跨平台设计

23 模块设计进阶:跨平台设计C标准库 ANSICC语言本身是跨平台的:C标准和C标准库系统调用:win32 API 和 Linux POSIX APIC标准库封装了不同平台的系统调用数据类型使用标准C语言类型确定大小的可移植数据类型特定内核数据类型dev_t、pid_t特定于平台的类型:如int对编译器和CPU的依赖字节序大端模式与小端模式大端与小端之间的转换内存对齐操作系统相关将跟操作系统相关的都封装为统一的接口隐藏不同操作系统的接口差异头文件路径分隔符使用通用的”/”

2020-10-31 00:00:00 260

原创 8.22 模块间通信(下):异步通信

22 模块间通信(下):异步通信异步通信的优点非阻塞式调用、基于消息或事件机制老张烧水的故事– 装一壶水,插上电,坐等– 装一壶水,插上电,看电视,水壶鸣笛后去倒水常用的异步通信方式消息机制:消息跟平台相关事件驱动:状态机、GUI/前端中断异步回调内核模块间通信Notify内核与用户空间通信Netlink、Aio用户模块之间的通信Socket、PIPE、FIFO管道、信号、信号量、消息队列...

2020-10-30 23:59:30 155

原创 8.21 模块间通信(中):回调函数

21 模块间通信(中):回调函数函数调用接口普通函数调用回调函数消息通信接口异步通信:消息、信号量、中断、事件驱动函数调用通信方式参数传递返回值单向调用函数调用例程main.c/************************************************* Filename: main.c* Author: litao.wang* Description: * Create: 2018-01-12 00:05:

2020-10-30 23:58:59 568 2

原创 8.20 模块间通信(上):全局变量

20.模块间通信(上):全局变量共享全局变量全局变量的作用域全局变量的定义与声明//module1int globale_val;//module2extern int globale_val;//module3extern int globale_val;在Linux内核中共享全局变量通过EXPORT_SYMBOL导出全局变量在内核中新增头文件声明通过函数接口来引用全局变量代码module1#include<linux/init.h>#include&l

2020-10-30 23:58:29 343

原创 8.19 被误解的关键字:goto

8.19 被误解的关键字:gotogoto的历史争议劣势无限制使用goto,特别是往回跳,使程序结构复杂任何程序都可使用顺序、分支、循环三种结构表示出来优势函数内的出错出口的统一处理、指定唯一出口当多层嵌套时,比break、return更有优势既能提高效率,也不会破坏程序良好的结构哪些地方建议使用goto?函数出错时的处理函数内部模块化设计:将函数主逻辑代码和出错处理部分隔离,结构更加清晰代码复用:将一个函数多个出口归并为一个总出口资源统一处理:内存释放、锁、句柄…使用注意

2020-10-30 23:57:58 761

原创 8.18 模块设计原则:高内聚低耦合

8.18 模块设计原则:高内聚低耦合模块内聚定义(软考)块内联系:模块内各元素的关联、交互程度从功能角度:自己的功能自己实现,不麻烦其它模块如何实现高内聚功能内聚:模块的功能尽可能单一模块的实现尽可能调用本模块的函数模块耦合耦合度模块间的关联依赖:调用关系、控制关系、数据传递模块间关联越强,其耦合度越高,模块独立性越差耦合方式非直接耦合:两个模块之间没直接联系数据耦合:通过参数来交换数据标记耦合:通过参数传递记录信息控制耦合:通过标志、开关、名字等,控制另一个模块外部耦合:

2020-10-30 23:57:26 2773

原创 8.17 头文件中的内联函数

8.17 头文件中的内联函数什么是内联函数使用inline关键字修饰的函数内联函数作用:解决函数调用效率问题使用场合:频繁调用、代码简单的函数优势内联函数PK函数:在调用处直接展开,省去了调用开销内联函数PK宏:参数传递、参数检查、返回值关键字:inline内联函数:inline,有可能调用,有可能展开静态内联:static inline //限定作用域为本模块头文件一般不能有变量、函数的定义避免重定义为什么内联函数可以直接定义在头文件里?编译时内联展开static..

2020-10-30 23:56:54 804

原创 8.16 定义与声明的一致性

8.16 定义与声明的一致性定义与声明的一致性检查在定义的xxx.c文件里再包含xxx.h

2020-10-30 23:56:01 235

原创 8.15 头文件之间的依赖关系

8.15 头文件之间的依赖关系头文件的意义模块的封装:接口的声明系统层次:模块的依赖的关系打印xxx.c文件的依赖gcc -MM xxx.c 不打印库gcc -M头文件包含顺序#include <C标准库头文件>#include <系统头文件>#include “第三方库头文件"#include “低层模块头文件"#include “本模块相关头文件"头文件的自包含减少头文件的包含顺序依赖– 任何一个头文件,都可以独立编译、拿来就用– 想包含stud

2020-10-28 23:55:11 612

原创 8.14 Linux内核中的头文件

8.14 Linux内核中的头文件驱动文件中的头文件路径 #include<linux/xx.h> #include<asm/xx.h> #include<mach/xx.h> #include<plat/xx.h>内核中常用头文件分布跟CPU架构相关:arch/$(ARCH)/include板级平台相关:rch /(ARCH)/plat−xx/includerch/(ARCH)/ plat-xx/includerch /(ARCH)/p

2020-10-28 23:54:40 680

原创 8.13 头文件剖析:头文件路径(下)

8.13 头文件剖析:头文件路径(下)Integrated Development Environment(IDE)包括:编辑器、编译器、调试器、图形用户界面功能:代码编写、分析、编译、调试一条龙服务与Linux下的编译环境对比MAKE与Makefile代码编辑:vim/gedit VS 编辑器代码编译:预处理器、编译器、汇编器、链接器、调试器依赖关系:Makefile VS 项目管理器编译辅助:环境变量设置 VS 图形用户界面...

2020-10-28 23:54:07 645

原创 8.12 头文件剖析:头文件路径(上)

8.12 头文件剖析:头文件路径(上)绝对路径以根目录为起点#include”/home/wit/c-lesson/chap8/xx.h”#include “F:/litao/project/inc/xx.h"相对路径以某一目录为起点上级目录:#include”…/lcd/lcd.h”当前目录:#include”./lcd.h”相对目录:#include”lcd.h两种包含方式头文件包含方式一:#include “module.h”头文件包含方式二:#include <stdi

2020-10-28 23:53:32 259

原创 8.11 头文件剖析:前向引用

8.11 头文件剖析:前向引用什么是声明声明:将一个标识符与某个C语言对象相关联(函数、变量等)函数原型:提供给编译器做函数参数格式检查变量声明:告诉编译器,这个变量在已经别处定义可以声明的标识符变量、函数类型、类型标志结构体、联合、枚举常量语句标号预处理器宏什么是前向引用?识符在声明完成之前就开始使用标识符通常不能在完全声明之前使用int i = sizeof(i);C++的类成员C语言允许前向引用的三个特例隐式声明(C99/C++禁止)语句标号(标号的作用域)可以

2020-10-28 23:52:59 217

原创 8.10 头文件剖析:变量声明

8.10 头文件剖析:变量声明外部声明extern int i;extern int a[20];extern struct student stu;函数的定义与声明函数默认是extern 可以省略extern int function();extern “C” int function();区分定义和声明int i = 10; //如果省略extern且具有初始化语句,为定义extern int i; //如果使用extern,无初始化语句,为声明int i; //如果省略ex

2020-10-28 23:52:23 101

原创 8.9 头文件剖析:隐式声明

8.9 头文件剖析:隐式声明隐式声明warning: implicit declaration of functionint f();隐式声明带来的深层bug函数类型冲突与自定义函数的冲突与内建函数的冲突与库函数的冲突程序员要重视隐式声明不同编译环境,隐式声明的函数运行结果可能不同C11/C++:treat warning as a error...

2020-10-28 23:51:48 197

原创 8.8 头文件剖析:基本概念

8.8 头文件剖析:基本概念为什么要有头文件?C语言的历史遗留问题局部编译:以C文件为单位进行编译,然后再进行链接编译检查:变量、函数的声明函数、变量的声明先声明后使用C语言的局部性:以文件为单位编译,防止编译错误任何标识符在使用之前都要声明(跳转标签、main除外)声明的方法在函数内声明在函数外声明在头文件中声明头文件作用数据类型定义宏定义变量声明函数声明模块的接口导出库的接口声明变量的定义和声明有什么区别?主要区别是是否产生内存分配的操作变量的定义,最终会生成

2020-10-28 23:51:10 132

原创 8.7 一个模块的封装过程

8.7 一个模块的封装过程模块封装一个模块一个C文件C文件函数实现H文件函数声明、对外留出接口C语言默认惯例#include这个模块的头文件使用该模块实现的各种接口

2020-10-28 23:50:32 188

原创 8.6 规划合理的目录结构

8.6 规划合理的目录结构一个好的目录结构层次结构清晰体现功能性体现模块化体现层次性维护管理方便模块的添加、删除多人协同开发

2020-10-28 23:49:23 171

原创 8.5 面向对象的思维陷阱

8.5 面向对象的思维陷阱面向对象与模块化设计出发点相同高质量软件设计方法侧重点不同面向对象:代码复用,重点在于内容实现模块化设计:分而治之,重点在于抽象的对象之间的关联,而不是内容面向对象不是万能的先有系统定义,再有模块划分和实现,实现过程中代码复用面向对象的长处–通过继承实现代码复用,减少工作量–作为一种分析方法、简化复杂系统的分析基于现有模块和对象去构建系统– 会陷入资源所限定的框框中– 模块间相互关联、相互作用–模块间的依赖关系、初始化过程...

2020-10-25 00:08:37 86

原创 8.4 系统模块划分

8.4 系统模块划分基本概念系统:各种对象相互关联、作用,形成特定功能的有机整体模块化:将系统目标,按模块方式分解、设计、实现模块:具有独立功能的有机组成,模块化过程中的产物系统与模块的关系先有系统定义、功能定义,才有模块划分,最后才有模块系统的外在功能是其内部多个模块协同作用实现的基本流程确定系统目标、功能–炸酱面根据系统功能和目标,设计出一组协同工作流种地产粮食、粮食做成面粉、面粉做成面条、炸酱面针对工作流,确定角色及分工、角色之间的关联–农民:输出粮食;工人:输出面粉;厨

2020-10-25 00:08:02 1245

原创 8.3 模块的编译和链接(下)

8.3 模块的编译和链接(下)编译过程预处理、编译、汇编、链接多个文件编译顺序只编译修改过的文件

2020-10-25 00:07:29 83

原创 7.19 Linux内核的面向对象思想:多态

7.19 Linux内核的面向对象思想:多态多态编译时多态:重载Kmalloc函数运行时多态:覆盖回调函数代码rtl8150_probe 负责初始化驱动内嵌了8150的结构体指针封装了一个netdev_ops的接口static int rtl8150_probe(struct usb_interface *intf, const struct usb_device_id *id){ struct usb_device

2020-10-25 00:06:50 295

原创 7.18 Linux内核的面向对象思想:继承(下)

7.18 Linux内核的面向对象思想:继承(下)什么是接口?一个类支持的行为、方法对象封装后,留出来供别的对象使用的接口接口的作用对象之间的通信:通过接口交互不需要关注内部的实现,当实现改变、不影响接口的使用汽车:方向盘、油门、刹车、换挡接口与抽象类比较相同点都不能实例化为对象都是为了实现多态不同点接口是一些方法的封装,不允许有数据成员抽象类被子类继承、接口要被类实现rtl8150 usb网卡驱动分析static struct usb_driver rtl8150_driv

2020-10-25 00:06:18 248

原创 7.17 Linux内核的面向对象思想:继承(上)

7.17 Linux内核的面向对象思想:继承(上)继承的好处通过继承,形成多层的程序结构结构清晰、层次清晰、易于维护提高代码的复用性继承的实现方式1.内嵌结构体基类和子类差异较大,一级继承通过结构体封装:子类将父类嵌在其结构体内部然后子类在父类基础上扩展自己的属性和方法子类对象可以自由引用父类的属性和方法2.私有指针父类和子类差别不大父类之间创建一个特殊的对象,当子类来用//bfin_can.cstruct bfin_can_priv *priv = netdev_priv(d

2020-10-25 00:05:15 285

原创 7.16 Linux内核面向对象思想:封装(下)设备模型举例

7.16 Linux内核面向对象思想:封装(下)设备模型举例字符设备struct cdev {struct kobject kobj;struct module *owner;const struct file_operations *ops;struct list_head list;dev_t dev;unsigned int count;};Linux设备模型总线:bus设备:device驱动:driverLinux设备模型:devicestruct device {

2020-10-25 00:04:43 122

原创 7.15 Linux内核的面向对象思想:封装(上)

7.15 Linux内核的面向对象思想:封装(上)字符设备./fs/char_dev.c 用到了include/linux/cdev.hstruct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned i

2020-10-25 00:04:07 142

原创 7.14 面向对象编程:封装、继承与多态

7.14 面向对象编程:封装、继承与多态面向对象编程Object Oriented Programming对象是程序的基本单元:包括数据成员和函数(属性和方法)类:对客观事物的抽象,本质是一种数据类型,其实例为对象面向过程编程Procedure Oriented Programming函数是程序的基本单元:解决问题的一个步骤模块化编程思想:从上至下、以功能块为单位进行程序设计面向对象编程三大特征封装:将客观事物抽象为类:属性和方法继承:子类对象拥有父类对象的属性和方法多态:一个接口

2020-10-25 00:03:13 144

原创 7.13 代码复用与分层思想

7.13 代码复用与分层思想代码复用函数库框架:MVC操作系统计算机系统分层与接口基本概念按需求划分:各层实现各自功能、各层之间通过接口通信每一层都是对其下面一层的封装、给上面一层提供服务每一层都会留出接口、给上一层复用接口也不一定是固定不变的分层的好处代码重用软件层次结构清晰、易于维护兼容性:适配不同平台、设备扩展性:功能易于扩展Linux内核中的分层系统框架文件系统:VFS、EXT、YAFFS、CRAMFS设备驱动模型:device、driver、busInp

2020-10-24 18:01:57 191

原创 7.12 Linux内核中的队列:KFIFO(下)

7.12 Linux内核中的队列:KFIFO(下)编译模块make menuconfigkernel hackingsample kernel codebuild kfifo examplesmake moduleslinux-4.4.232 /samples 目录下会多出record-example.ko文件开发板 insmod record-example.ko测试模块cat /proc/record-fifoecho “11” > /proc/record-fifo内

2020-10-24 18:01:27 291

原创 7.11 Linux内核中的队列:KFIFO(上)

7.11 Linux内核中的队列:KFIFO(上)基本概念内核版本:Linux-4.4.x定义:lib/ kfifo.c include/ linux /kfifo.hKFIFO基本操作入队初始化:kfifo_init \ kfifo_allocKfifo_putKfifo_in \ kfifo_in_spinlocked出队Kfifo_getKfifo_out数据结构struct __kfifo { unsigned int in; unsi

2020-10-24 18:00:33 275

原创 7.10 队列:链式队列

7.10 队列:链式队列空间不连续单向链表代码/************************************** 名称描述:队列:使用链表实现 * 实现功能:队列的出队、入队、队列判断、置空队列等 * 作 者:王 利 涛* QQ 群 :475504428* 公 众 号:宅学部落(armlinuxfun)* 嵌入式自学路线咨询 QQ:3284757626 *************************************/ #include&

2020-10-24 17:59:46 145

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除