自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 STM32按键实验

按键操作的基本原理:原本的灯控制函数放在了循环之中,我们无法手动进行干预,想要改变单个LED灯,就必须在源程序中进行修改,所以我们引入了按键控制,当按下某个按键的时候,对应该按键的LED灯才会点亮,再次按下按键时,对应的LED灯熄灭。在前面两个实验中,我们学会对单个LED的点亮,本次实验就不对LED灯端口的配置在进行复述,而按键的配置和LED灯的配置几乎相同。这里只对WK_UP按键进行描述,从原理图可以知道:KEY0,KEY1,KEY2都是属于是低电平有效,而WK_UP是高电平有效,且外部没有上拉电

2022-05-10 18:58:22 4144

原创 STM32单片机蜂鸣器实验

简单对蜂鸣器模块做了简单的介绍

2022-05-10 17:11:26 4507

原创 STM32单片机跑马灯实验解析

基于STM32F1xxx单片机开发

2022-05-10 15:10:30 3156

原创 UBOOT源码--环境变量

uboot的环境变量基础环境变量的作用(1)让我们可以不用修改uboot的源代码,而是通过修改环境变量来影响uboot运行时的一些数据和特性。譬如说通过修改bootdelay环境变量就可以更改系统开机自动启动倒数的秒数。环境变量的优先级(1)uboot代码当中有一个值,环境变量中也有一个值。uboot程序实际运行时规则是:如果环境变量为空则使用代码中的值;如果环境变量不为空则有限使用环境变量对应的值。(2)譬如machid(机器码)。uboot中在x210_sd.h中定义了一个机器码2456.写死

2022-01-16 19:43:33 520

原创 uboot--命令体系

uboot命令体系基础使用uboot命令(1)uboot启动后进入命令行环境下,在·此输入命令按回车结束,uboot会收取这个命令然后解析,然后执行。uboot命令体系实现代码在哪?(1)uboot1命令体系的实现代码在uboot/common/cmd_xxx.c中。有若干个.c文件和命令体系有关。(还有commmand.c main.c也是和命令有关的)每个命令对应一个函数(1)每一个uboot的命令背后都对应一个函数,这就是uboot实现命令体系的一种思路和方法。这个东西和我们在裸机十六部

2022-01-14 22:48:41 669

原创 UBOOT--启动内核

uboot和内核到底是什么?uboot是一个裸机程序(1)复杂的裸机程序,和ARM裸机中学习的裸机程序没有本质区别内核本省也是一个"裸机程序"(1)操作系统本身就是一个裸机程序,和uboot,和其他裸机程序并没有本质区别(2)区别就是操作系统运行起来后再软件上分为内核层和应用层,分层后两层的权限不同,内存访问和设备操作的管理上更加精细(内核可以随便访问各种硬件,而应用程序只能被限制的访问的硬件和内存地址)uboot的镜像是uboot.bin,linux系统的镜像是zImage,这两个东西其实都是

2021-12-29 23:04:14 2675

原创 uboot源码--第二阶段

在start.s代码的414行跳转到start_armboot函数start_armboot函数简介一个很长的函数(1)这个函数在uboot/lib_arm/board.c的第444行到908行结束(2)450行还不是全部,里面还调用了别的函数(3)这个函数整体构成了uboot启动的第二阶段一个函数组成uboot的第二阶段(1)uboot的第一阶段主要就是初始化了Soc内部的一些部件(譬如看门狗,系统时钟),然后初始化DDR并且完成重定位。(2)宏观来说,uboot的第二阶段就是要初始化剩下

2021-12-19 00:17:48 479

原创 U-boot源码-启动第一阶段

Start.S引入u-boot.lds中找到start.S入口(1)在C语言中整个项目的入口就是main函数,所以譬如说一个有10000个.c文件的项目,第一要分析的文件就是包含了main函数的那个文件(2)在uboot中因为有汇编阶段参与,因此不能直接找main.c,整个程序的入口取决于链接脚本中ENTRY声明的地方。ENTRY(_start)因此 _start符号所在的文件就是整个程序的起始文件,_start所在的代码就是整个程序的起始代码。SourceInsight中如何找到文件(1)当前状

2021-12-15 17:08:58 1131

原创 C++类的成员变量和成员函数

类是一种数据类型,该类型类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的一个集合。下面是 student 类的定义。class student{ char name[20]; //姓名 int id_num; //学号 int age; //年龄 char sex; //性别 void set_age(int a); int get_age();};有两种方法可以给出成

2021-12-13 20:49:58 403

原创 C++-类的定义和声明

C++ 语言可以看成是 C语言的扩展和改进,相对于 C语言,C++语言主要是增添了面向对象的特性。类(Class)则是 C++ 面向对象编程的实现方式。无论是何种编程语言,进行面向对象程序设计都将是从类的设计开始的。什么是类呢?其实很简单,我们可以理解为一种用户自定义的数据类型,类似于 C语言里面的结构体(struct),在本章最后我们将对比类和结构体之间的异同。class student{ //可以在此处声明类成员变量和成员函数};在例 1 中创建了一个 student 类,可以在该类

2021-12-13 20:39:06 3309

原创 C++异常处理(try和catch)

在程序设计过程中,我们总是希望自己设计的程序是天衣无缝的,但这几乎又是不可能的。即使程序编译通过,同时也实现了所需要的功能,也并不代表程序就已经完美无缺了,因为运行程序时还可能会遇到异常。例如,当我们设计一个为用户计算除法的程序时,用户很有可能会将除数输入为零,又例如当我们需要打开一个文件的时候确发现该文件已经被删除了……类似的这种情况很有很多,针对这些特殊的情况,不加以防范是不行的。我们通常希望自己编写的程序能够在异常的情况下也能作出相应的处理,而不至于程序莫名其妙地中断或者中止运行了。在设计程序时应

2021-12-13 15:05:44 2548

原创 C++ new的delete操作符

在 C语言中,动态分配和释放内存的函数是 malloc、calloc 和 free,而在 C++语言中,new、new[]、delete 和 delete[] 操作符通常会被用来动态地分配内存和释放内存。需要注意的是,new、new[]、delete 和 delete[] 是操作符,而非函数。new 和 delete 是 C++ 的关键字。操作符 new 用于动态分配单个空间,而 new[] 则是用于动态分配一个数组,操作符 delete 用于释放由 new 分配的空间,delete[] 则用于释放 n

2021-12-13 14:32:48 897

原创 C++-内联函数

C++语言新增关键字 inline,用于将一个函数声明为内联函数。在程序编译时,编译器会将内联函数调用处用函数体替换,这一点类似于 C语言中的宏扩展。采用内联函数可以有效避免函数调用的开销,程序执行效率更高。使用内联函数的缺点就是,如果被声明为内联函数的函数体非常大,则编译器编译后程序的可执行码将会变得很大。另外,如果函数体内出现循环或者其它复杂的控制结构的时候,这个时候处理这些复杂控制结构所花费的时间远大于函数调用所花的时间,因此将这类函数声明为内联函数的意义不大,反而会使得编译后可执行代码变长。在程

2021-12-13 14:27:03 658

原创 C++-强制类型转换

在 C++语言中新增了四个关键字 static_cast、const_cast、reinterpret_cast 和 dynamic_cast。这四个关键字都是用于强制类型转换的。我们逐一来介绍这四个关键字。static_cast在 C++语言中,static_cast 用于数据类型的强制转换,强制将一种数据类型转换为另一种数据类型。例如将整型数据转换为浮点型数据。//在C语言中的强制转换int a = 10;int b = 10;double result = (double)a / (dou

2021-12-13 00:28:53 2068

原创 C++-引用

引用引用(Reference)是 C++语言相对于 C语言的又一个扩充,类似于指针,只是在声明的时候用&取代了*。引用可以看做是被引用对象的一个别名,在声明引用时,必须同时对其进行初始化。引用的声明方法如下:类型标识符 &引用名 = 被引用对象//C++引用实例int a = 10;int &b = a;//b的地址指向了a,相当于b中存放了a的地址cout<<a<<" "<<b<<endl;cout<<&

2021-12-12 23:45:21 503

原创 C++-输入输出(cout&cin)

在 C语言中,通常会采用格式化输入输出函数 printf() 和 scanf() 用于输入或输出数据或信息。在 C++语言中,C语言的这一套输入输出库我们仍能使用,但是 C++语言又自定义了一套新的、更容易使用的输入输出库。在 C++程序中,输入与输出可以看做是一连串的数据流,输入即可视为从文件或键盘中输入程序中的一串数据流,而输出则可以视为从程序中输出一连串的数据流到显示屏或文件中。在编写 C++程序时,如果需要使用输入输出时,则需要包含头文件<iostream>。<iostream

2021-12-12 23:12:05 531

原创 C++-命名空间

C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace。通常一个程序需要多个人开发,但是在开发过程中会遇到一些定义了相同变量,在C语言中就难以区分,在C++中引入了命名空间的方式来解决这个问题。int flag = 1; //小李声明的变量bool flag = true; //小韩声明的变量如上面的代码:如果这样的两个声明放在同一函数的时候,编译器会提出flag变量重新定义的错误。不处理的的话,编译无法通过。下面是引入命名空间解

2021-12-12 23:03:32 366

原创 C++-布尔类型

布尔类型(bool)是 C++ 新增的一种基本数据类型。在标准的 C语言中并未定义 bool 类型,如果需要使用 bool 类型,程序员可以通过宏定义来自定义一个 bool 类型,定义语句如下:#defin bool int#define false 0#define true 1也就是将 int 型定义为 bool 型,将 int 型的 0 和 1 两个值分别定义为 bool 类型的两个值 true 和 false。但是C++中不用麻烦,已经对bool类型作出了定义。bool 类型取值范围仅

2021-12-12 22:49:52 1276

原创 uboot主makefile分析

uboot主makefile分析uboot version确定(1)uboot的版本号分3和级别:VERSION:主版本号PATCHLEVEL:次版本号SUBLEVEL:再次版本号,EXTRAVERSION:另外附加的版本信息,可以自己定义的这4个用 . 分隔开共同构成了最终的版本号。(2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号(3)include/version_autogenerated.h文件是编译过程中自

2021-12-12 20:53:54 264 1

原创 U-Boot初识

X210官方uboot配置编译实战X210官方uboot配置编译实践(1)源头的源代码是uboot官网下载的。这个下载的源代码可能没有你当前使用的开发板的移植,甚至找不到当前开发板使用的Soc对应的移植版本(2)Soc厂商在退出一款Soc之后,厂商的工程师回去uboot官网下载一个uboot,根据自己的Soc芯片厂商出的开发板就叫S5PV210芯片厂商出的开发板就叫SMDKV210,所以三星的工程师移植的uboot是根据他们自己的SMDKV210开发板移植的。(3)具体的开发板供应商(譬如X210的

2021-12-11 11:18:11 545

原创 高级C语言-链表&状态机和多线程

单链表&双向链表&多线程引入&状态机是什么?

2021-12-10 21:30:44 831

原创 高级C语言-离散的小问题

argc,argv与main函数的传参给mian传参是怎样实现的?(1)给main传参通过argc和argv这两个C语言预定的参数来实现(2)argc是int类型,表示运行程序的时候给main函数传递了几个参数:argv是一个字符串数组,这个数组用来存储多个字符串,每个字符串就是我们给main函数传的一个参数。argv[0]就是我们给main函数的第一个传参,argv[1]就是传给main的第二个参数…本质上:给main传参是怎样实现的?(1)程序调用有各种各样的方法,但是本质上都是父进程fork

2021-12-06 19:01:32 127

原创 shell和Makefile

shell介绍shell是操作系统的终端命令行(1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式(2)我们可以使用shell和操作系统,uboot等软件系统进行交互。具体来说就我们通过shell给软件系统输入命令然后回车执行,执行完后又回到shell命令行可以再次输入命令执行(3)上述的操作方式很好,但是有一定的缺陷。如要新建100个.c文件。最好的做法就是把创建的过程写成一个shell脚本,然后执行这个shell脚本程序,执行这个程序的效果和手工在命令行输入

2021-12-05 15:19:43 2696

原创 高级C语言-存储类&作用域&生命周期&链接属性

概念解析

2021-12-03 23:00:18 296

原创 Uboot前传

为什么要有ubootPC机的启动过程(1)典型得到PC机的部署:BIOS程序部署在PC机主板上(随主板出厂时已经预制),操作系统部署在硬盘上,内存在掉电时无作用,CPU在掉电时不工作。(2)启动过程:PC上电后先执行BIOS程序(实际上PC的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了)典型嵌入式linux系统启动过程(1)嵌入式系统的部署和启动时参考PC机,

2021-12-02 14:48:20 185

原创 C++数组

5.1 概述所谓数组,就是一个集合,里面存放了相同类型的数据元素特点1:数组中的每个数据元素都是相同的数据类型特点2:数组是由连续的内存位置组成的5.2 一维数组一维数组定义的三种方式:(1)数据类型 数组名{ 数组长度 };(2)数据类型 数组名[ 数组长度 ] = {值1,值2…}(3)数据类型 数组名 【 】 = { 值1,值2…}5.2.2 一维数组组名(1)可以统计整个数组在内存中的长度(2)可以获取数组在内存中的首地址#include<iostream>us

2021-11-30 10:26:26 516

原创 C++程序流程结构

C/C++支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构(1)顺序结构:程序按顺序执行,不发生跳转(2)选择结构:依据条件是否满足,有选择的执行相应功能(3)循环结构:依据条件是否满足,循环多次执行某段代码4.1 选择结构if语句:执行满足条件的语句;if语句的三种形式(1)单行格式if语句(2)多行格式if语句(3)多条件的if语句1.单行格式if语句:if(条件)(条件满足执行的语句)2.多行格式if语句:if(条件)(条件满足执行语句)else(条件不满足执行的语句

2021-11-29 13:26:05 115

原创 C++运算符

3.1 算术运算符作用:用于处理四则运算3.2 赋值运算符作用:用于将表达式的值赋给变量3.2 比较运算符作用:用于表达式的比较,并返回一个真值或假值3.3 逻辑运算符作用:用于根据表达式的值返回真值或假值#include<iostream>using namespace std;int main(){ //在C++里面除了0都是真 int a = 10; int b = 20; int c = 0; int d = 0;.

2021-11-29 00:13:08 430

原创 高级C语言-宏定义与预处理,函数和函数库

C语言预处理理论源码到可执行程序的过程(1)源码.c->(预处理)->预处理过得.i源文件->(编译)->汇编文件.s->(汇编)->目标文件.o->(链接)->elf可执行程序(2)预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具加上其他一些额外的工具合起来叫编译工具链。gcc就是一个编译工具链预处理的意义(1)编译器本身的主要目的是编译源代码,将C的源代码转化成.S的汇编代码。编译器聚焦核心功能后,剥离出一些编译前的杂事(

2021-11-28 23:17:53 362

原创 C++数据类型

2.1 整形C++规定在创建一个变量或常量是,必须给出相应的数据类型,否则无法给变量分配内存作用

2021-11-28 11:13:55 3547

原创 C++基础入门

1 C++初识1.1 第一个C++程序编写一个C++程序总共分为4个步骤创建项目>>>创建文件>>>编写代码>>>运行程序

2021-11-28 00:21:51 398

原创 SPI通信协议详解

SPI协议

2021-11-27 16:02:35 32164

原创 高级C语言-数组&字符串&结构体&共用体&枚举

程序中内存哪里来1

2021-11-27 11:55:30 365

原创 高级C语言-复杂表达式与指针

指针数组与数组指针

2021-11-24 23:59:30 222

原创 高级C语言-指针

指针

2021-11-22 20:16:55 170

原创 高级C语言-位操作

位操作符

2021-11-21 10:04:38 270

原创 高级C语言-内存

内存(1)程序运行的目的程序的目的就是为了去运行,程序运行是为了得到一定的结果,计算机就是为了计算,所有的计算机就是为了计算,计算数据。计算机程序 = 代码 + 数据。宏观理解:代码就是动作,就是加工数据的动作,数据就是数字,就是代码加工的东西。代码 + 数据 = 结果用函数来类比:函数的形参就是代加工的数据;函数本体是代码,函数的返回值就是结果,函数体的执行过程的过程。int add(int a,int b){ return a+b;}//这个函数即看重过程也看重结果void add(

2021-11-19 21:46:46 139

原创 RS232和RS485协议原理和应用

RS232和RS485协议原理和应用

2021-11-18 16:43:07 1336

原创 UART通信详解

UART简介Universal Asymchronous Receiver Transmitter 即通用一步收发器,是一种通用的串行,一步通信总线该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。通信基础 - 并行和串行(1)并行通信...

2021-11-17 19:26:37 4492

原创 IIC通信详解

IIC总线:IIC总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机。主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个位移的地址(7bit),且每个器件都可以作为主机也可以作为从机(但同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;IIC总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器。(主机可以作为发送器也可以作为接收器)IIC总线通

2021-11-15 15:50:58 10459

空空如也

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

TA关注的人

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