自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 FreeRTOS-内存管理源码分析

FreeRTOS 总共提供了5种内存分配方法:heap_1.cheap_2.cheap_3.cheap_4.cheap_5.c这五种分配方式各有各的优势,用户可根据应用情况按需使用,在分析源码之前先了解一下内存管理的一些相关知识,其中内存碎片一直是内存管理致力于解决的一项问题,内存碎片是指频繁地请求和释放不同大小的内存,结果就是当再次要求分配连续的内存时导致申请失败,原因是由于之前...

2019-03-08 14:02:00 735

原创 FreeRTOS-空闲任务、低功耗源码分析

FreeRTOS在启动任务调度时会自动创建一个空闲任务,空闲任务主要在系统没有其它任务或任务都处于挂起状态时执行,它被系统设置为最低优先级,不会去抢占其它高优先级的任务,从而既能保证系统总有至少一个任务可以运行又不干扰到其它任务。空闲任务里面可以执行一些辅助操作,比如任务删除自身时由于无法立马释放掉自己的内存,这时可以做个标记,在空闲任务里面去删除。还有个非常重要的功能就是实现低功耗,进入空闲任务...

2019-03-05 11:32:31 2645

原创 FreeRTOS-任务通知源码分析

任务通知可用来代替信号量、消息队列、事件标志位,而且使用任务通知的形式效率会更高,它不需要像信号量那样创建队列和操作队列,任务通知的存储变量来自任务控制块中,当宏 configUSE_TASK_NOTIFICATIONS 被定义为1时就可以使用任务通知相关的函数了。任务通知的接口函数同样存在发送和接收,发送的接口函数如下:/* 发送通知,有通知值但不保留接收任务原通知值 */xTaskNoti...

2019-02-27 18:10:59 489

原创 FreeRTOS-事件标志组源码分析

事件标志组的具体实现过程和前面信号量实现方式非常相似,信号量只能和单个任务或事件进行同步,而事件标志组能和多个任务或事件进行同步。事件标志组顾名思义就是用事件位来表示某个任务是否发生了,发生了的话就标记一个标志位,然后通知接收任务去做相应的处理工作。当然标志可以以组的形式出现,就是接收任务同时要求有多个事件(所有需求的标志都置位了)发生了才执行处理。事件标志组的相关接口函数如下:/* 创建事...

2019-02-26 14:13:33 771

原创 FreeRTOS-信号量源码分析

信号量主要用来进行资源管理和任务同步,FreeRTOS中信号量分为二值信号量、计数型信号量、互斥信号量、递归互斥信号量。二值信号量: 一个只有一个队列项,队列项大小为0的队列,队列只有满和空两种状态。一般用于中断和任务之间的同步,例如串口通信,在串口通信中断服务函数中接收到串口发送过来的数据后释放二值信号量来通知串口的处理任务接收到了数据,串口处理任务由原来的阻塞状态恢复为就绪状态,实现了在没数...

2019-02-23 16:20:14 1895

原创 FreeRTOS-队列源码分析

FreeRTOS的队列是用于任务与任务、任务与中断之间通信的一种数据结构。各个任务之间的数据通信通过一段共同的存储空间按需获取和发送数据,这段存储空间采用队列的形式进行访问,可以采用动态或静态的方式来创建这段内存。任务往队列中发送数据和接收数据通常采用先进先出(FIFO)的存储缓冲机制,当然也可以使用后进先出(LIFO)的形式。FreeRTOS往队列发送和接收数据采用的是直接拷贝的形式,将要发送和...

2019-02-17 18:03:44 985

原创 FreeRTOS-时间管理(延时、系统时钟)源码分析

在写FreeRTOS的应用程序时,经常需要使用到延时函数,当执行到延时函数时,会将任务从就绪状态变为延时等待状态,这里会放弃CPU的占用权进入阻塞态,将CPU让给其它任务使用直到延时时间结束会重新变为就绪态。FreeRTOS中的延时函数有两种模式,一种是相对模式,另一种是绝对模式。相对延时函数使用 vTaskDelay() ,相对延时函数是指每次执行都是从函数接口处开始计时,计时到指定时间结束回来...

2019-02-14 08:40:01 1240

原创 FreeRTOS-任务删除、挂起、恢复源码分析

由于后面的源码分析会涉及到一些任务的操作函数,所以这里先分析一下任务的一些相关操作,包括任务的删除、挂起、恢复操作。任务删除:#if ( INCLUDE_vTaskDelete == 1 ) void vTaskDelete( TaskHandle_t xTaskToDelete ) { TCB_t *pxTCB; /* 进入临界区 */ taskENTER_CRITICAL...

2019-02-11 15:12:32 910

原创 FreeRTOS-任务切换源码分析

前面分析了启动任务调度器的源码,在创建好空闲任务后启动滴答定时器(systick)后就调用SVC中断跳转到任务去执行,但作为OS我们一般不会只创建一个任务,都是有多任务需求才使用OS,后续任务一旦多了,就涉及了到了任务切换,这也是OS的核心,如何根据任务的优先级的和当前状态来切换任务,怎么保证每个任务都有执行的机会,这就是调度器做的工作。在我们前面分析的启动好任务调度器后下一步就是启动空闲任务了,...

2019-02-09 22:03:51 1164

原创 FreeRTOS-任务创建源码分析

任务创建是FreeRTOS系统启动的第一个步骤,前面在启动调度器的时候先创建了空闲任务,然后再由调度器跳到任务里面去执行。任务创建函数里面做了很多的工作,先会为任务堆栈和任务控制块分配内存并初始化它们,然后将任务添加到就绪列表里面,等待调度器来调用。任务创建的接口定义如下:BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, con...

2019-02-07 00:07:38 610

原创 FreeRTOS-列表和列表项源码分析

前面在调度器启动之前先创建了两个任务,一个启动任务一个空闲任务,然后调度器会跳到启动任务去执行。在分析任务创建的源码之前,需要先分析一下列表和列表项,创建任务实际上就是初始化任务的各个成员变量(即初始化任务控制块的成员),在初始化完后这个任务就会进入到就绪状态,等待调度器来执行它,其中任务控制块就有一项用于描述任务当前的状态,这个状态就是列表项,存放列表项的容器就是列表(链表结构),前面提到就绪状...

2019-02-04 18:12:53 548

原创 FreeRTOS-启动任务调度器源码分析

本章基于FreeRTOS的启动任务调度器源码分析,后续将会上传其它我对FreeRTOS的源码分析过程及理解,首先来认识一下任务调度器。任务调度器:任务调度器主要用于实现任务的切换,任务并不是我们所熟知的函数,而是指一段占有独立内存空间,专门用于处理一组逻辑事件的任务块。最直观的对比理解就像是可以有多个while函数,以前我们写代码都是一个main函数一个while循环,我们会在while循环...

2019-02-02 22:42:10 1618

原创 git指令备忘录

参考廖雪峰的Git教程整理的,官网链接:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000git分区:工作区->(add)暂存区->(commit)版本库安装sudo apt-get install git创建版本库空目录下:mkdir learn...

2018-10-02 17:05:12 233

原创 Android使用串口(基于android-serialport-api)

运行平台: CPU:全志V40 Android版本:6.0.1关于安卓设备上使用串口,谷歌官方在github上有提供代码实例,里面有JNI的代码和串口API的java文件,工程的地址如下: https://github.com/cepr/android-serialport-api官方给出的代码是eclipse工程,SDK的版本也比较旧。我使用的Android Studio,如果直接...

2018-06-07 10:32:14 52315 15

原创 JAVA快速入门-反射

Tips: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#...

2018-02-16 21:03:16 315

原创 JAVA快速入门-泛型

Tips: 泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。 泛型的定义主要有以下两种: 1.在程序编码中一些包含类型参数的类型,...

2018-02-15 19:33:40 308

原创 JAVA快速入门-JNI_C调用JAVA

上一篇实现了 JAVA 调用 C 语言函数的过程,当然 C 也能通过 JNI 来访问 JAVA 的方法和成员变量,实际上具体调用什么函数以及如何实现这些具体的操作,都在 jni 的手册中有进行讲解。下面以程序来实现 C 调用 JAVA 方法或成员变量的过程。先是一个简单的访问 JAVA 静态成员方法的程序 JAVA代码:public class Hello { /* C来访问这个静态...

2018-02-15 16:04:02 240

原创 JAVA快速入门-JNI_JAVA调用C

Tips: JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本...

2018-02-15 00:21:27 243

原创 JAVA快速入门-内部类

Tips: (1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。 (2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。 (3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。...

2018-02-13 15:57:19 232

原创 JAVA快速入门-包和权限

Tips: 为了更好地组织类,Java提供了包机制。包是类的容器,用于分隔类名空间。如果没有指定包名,所有的示例都属于一个默认的无名包。在包的基础上再引入权限的概念,它包含类的访问权限和类成员的访问权限。下面先以程序来说明一下 JAVA 中包的概念。/* 包的关键字“package” *//* 这个 Pack 类会存放在 a/b/c/d 这个四级目录的d目录下 */pac...

2018-02-13 15:09:30 288

原创 JAVA快速入门-异常

Tips: 异常:程序在运行过程中发生由于外部问题(如硬件错误、输入错误)等导致的程序异常事件。(在Java等面向对象的编程语言中)异常本身是一个对象,产生异常就是产生了一个异常对象。异常(Exception)都是运行时的。编译时产生的不是异常,而是错误(Error)。需要注意的是,程序设计导致的错误(Error)不属于异常(Exception)。JAVA中异常都是从类Throwable类...

2018-02-12 22:02:05 233

原创 JAVA快速入门-面向对象三大特性-多态性

Tips: 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指...

2018-02-12 18:09:37 296

原创 JAVA快速入门-面向对象三大特性-继承性

Tips: 继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如可以先定义一个类叫“车”,车有以下属性:车体大...

2018-02-12 15:37:20 299

原创 JAVA快速入门-面向对象三大特性-封装性

Tips: 封装性是面向对象编程中的三大特征之一,封装性就是把对象的成员属性和成员方法结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含如下两个含义。 把对象的全部成员属性和全部成员方法结合在一起,形成一个不可分割的独立单位(即对象) 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口是指与外部发生联系。下面以一个简单的 JAVA ...

2018-02-11 23:44:08 284

原创 JAVA快速入门-类的引入

这章主要描述 JAVA 的类,类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。实际上 C 语言里面的结构体就跟类非常的相似,下面先以一个 C 语言的例子来实现面向对象程序设计的思想,然后用此例子来说明它存在的一些缺陷,...

2018-02-11 23:00:07 923

原创 linux内核启动流程及busybox分析

内核版本:linux-3.4启动流程: 1、比较机器ID 2、解析u-boot传入的启动参数 3、挂接根文件系统、执行第一个应用程序1、比较机器ID 打开 vmlinux.lds.S 里面可以找到内核把初始化参数的段定义为了”.arch.info.init”.init.arch.info : { __arch_info_begin = .; *(.arch.info.init

2017-12-18 15:33:42 2161

原创 linux源码Makefile和脚本分析

基于平台:slinx的全志A33开发板开发板编译系统指令如下: tar -xvf sinlinx-a33-linux-xxx.tar.gz git reset –hard 工具链: tar -jxvf /root/work/sinlinx/a33/tools/toolchain/arm-2014.05-29-arm-none-linux-gnueabi-i6

2017-12-16 17:25:40 821

原创 uboot启动分析第一阶段(start.S)

前面分析了启动脚本、Makefile、mkconfig,接下来就是uboot的start.S这个启动代码了,下面是本章的平台介绍: 单板:迅为4412开发板(Exynos 4412) SDRAM:1G EMMC:4GExynos 4412的启动过程可以在数据手册的Booting Sequence找到,下面只截取关键部分: Exynos 4412 has 64 KB ROM (iROM) a

2017-12-03 21:23:38 7901

原创 uboot编译脚本解析

本章是基于迅为4412开发板,对编译脚本进行分析。前面已经有对全志A33的板子做了makefile和mkconfig的分析,对于其它的平台也大同小异,所以这里就不再复述那部分的内容了。 迅为开发板专门对编译做了一个脚本,有利于多核心开发板的选择和编译链接。下面是脚本的内容分析:#!/bin/sh# 单板配置最终如下:# arm arm_cortexa9 smdkc210 samsung

2017-11-28 19:49:21 1090

原创 u-boot分析之顶层Makefile、mkconfig结构分析

本章uboot代码分析是基于全志A33平台,uboot代码版本是U-boot-2011.09。Bootloader概念介绍: 在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌

2017-11-15 20:09:01 1246

原创 U-boot取消或修改启动延时bootdelay

在我们的实际项目中都希望uboot尽量能够快速启动,这就涉及到uboot的裁剪工作,由于裁剪的工作量和内容比较多,这里暂不描述。但是uboot有个启动延时bootdelay,在我们进入linux内核之前会有个短暂的倒计时,可能是1秒也可能是2秒。这个延时用于在uboot启动之后避免直接进入linux内核,在进入内核之前按下Enter键可以进入uboot菜单,在这个管理界面中我们可以执行很多的操作,根

2017-10-27 09:58:57 14858 3

原创 android6.0第三方APP获得设备节点的访问权限

之前使用android4.4的系统进行开发时 system/app(系统自带APP) 目录下的 app 可以直接访问 dev 目录下的设备节点,Android 5.0 以后,因为采取了 SEAndroid/SElinux 的安全机制,即使拥有 root权限,或者对某内核节点设置为 777 的权限,仍然无法在 JNI 层访问。 这里先了解一下 SEAndroid app 的分类 SELinux(或S

2017-10-07 18:36:29 5009

原创 C++ 类的静态成员、友员函数

我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。假设我们想要

2017-09-05 11:48:40 753

原创 C++ 构造析构函数

构造函数的作用: 该类对象被创建时,编译系统为对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员。当然他的可以做其它的,但一般用于初始化。下面以程序来讲解构造函数和析构函数的知识点:class Person{private: char *name; int age; char *work;public:

2017-09-04 15:57:04 229

原创 C++ 函数重载、指针及引用

C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,即函数的参数列表不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;例如:int &c =

2017-09-03 17:08:36 757

原创 C++命名空间namespace

前面文章所写的代码都是单一个文件就把功能实现完了,但是大多数场合我们都需要多个文件来合作执行,每个文件针对相应的需求完成特定的功能。因此我们的代码会越写越多,功能文件也会越来越多,工程一旦大起来就需要多位开发人员一起来完成一个这个工程。我们没办法保证每位开发人员所使用的标识符命名不产生冲突,所以标准的C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作

2017-09-03 14:52:23 316

原创 C++访问控制

在C语言的结构体中,我们定义的结构体变量可以访问结构体里面的任意一个变量,但是在C++的类里面,我们可以设置他的访问权限,哪些可以更改,哪些不能更改,不能更改的变量可以通过哪些特殊途径去修改。这里我们先来认识一下C++的访问权限有哪几种。private: 只能由 1. 该类中的函数、2. 其友元函数 访问。 不能被任何其他访问,该类的对象也不能访问。protected: 可以被 1. 该类中的

2017-09-02 13:33:12 394

原创 C语言和C++之面向对象的引入(oop)

C++语言是在C语言的基上添加了面向对象、模板等现代程序设计语言的特性而发展起来的。两者非常相似,在对硬件资源的操作上,C语言更加直接,它的重点在于算法和数据结构,如强大的linux底层设备驱动使用的就是C语言。而C++则更倾向于设计程序,它首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的实际问题,这样就可以通过获取对象的状态信息得到输出或实现对过程或事务的控制。C语言是面向过程语言,

2017-09-02 10:52:14 641

原创 使用 global key 一键启动应用程序

按键分三类: 1. global key:按下按键,启动某个APP可以自己指定,修改: Frameworks/base/core/res/res/xml/Global_keys.xml例如AKEYCODE_TV2. system key:比如音量键 AKEYCODE_VOLUME_DOWN3. user key:其它按键,比如ABCD AKEYCODE_A使用globa

2017-08-26 12:14:11 1786

原创 Android输入系统简述

触摸屏与键盘是Android最普遍也是最标准的输入设备。其实Android所支持的输入设备的种类不止这两个,鼠标、游戏手柄均在内建的支持之列。当输入设备可用时,Linux内核会在/dev/input/下创建对应的名为event0~n或其他名称的设备节点。而当输入设备不可用时,则会将对应的节点删除。在用户空间可以通过ioctl的方式从这些设备节点中获取其对应的输入设备的类型、厂商、描述等信息。 当用

2017-08-25 16:53:53 371

空空如也

空空如也

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

TA关注的人

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