自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 内联函数与宏定义

用关键字inline修饰的函数就是内联函数。关键字在函数声明和定义的时候都要加上,不写系统还是会当成常规函数;内联函数是直接复制“镶嵌”到主函数中去的,就是将内联函数的代码直接放在内联函数的位置上,这与一般函数不同,主函数在调用一般函数的时候,是指令跳转到被调用函数的入口地址,执行完被调用函数后,指令再跳转回主函数上继续执行后面的代码;而由于内联函数是将函数的代码直接放在了函数的位置上,所以没有指令跳转,指令按顺序执行;利:避免了指令的来回跳转,加快程序执行速度;弊:代码被多次复制,增加了代码量,占用.

2021-09-13 10:55:03 330 1

原创 单片机的大小端

添加链接描述

2021-09-12 20:32:30 318

转载 形参和实参

形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地.

2021-09-12 20:19:33 293

原创 单片机字节对齐

对齐原则:数据存放的地址需要是其类型长度的整数倍;字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是2,4或8)的倍数。这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件设计。对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。可见适当地编排结构体成员地顺序,可以在保存相同信息地情况下尽可能节约内存空间。结构体或者类.

2021-09-12 20:07:47 853

原创 编译和链接!

参考1参考2预编译:每一个源文件(就是.c文件,上图中的程序1)都有对应的零碎文件(就是.h文件),通过预编译(通过#include实现)把.c和.h文件整合成一个组合C文件,这个组合C文件的扩展名为.i;编译:把源程序(.c)转化成机器能识别的机器语言(.o)的过程;链接:把目标文件(.o)与系统提供的组件(比如标准库)结合起来,生成可执行文件的过程,windows后缀为.exe,Linux后缀为.out;...

2021-09-12 16:09:43 86

原创 堆和栈的区别

栈:保护现场、存放局部变量;堆:程序员申请(malloc);添加链接描述

2021-09-11 21:51:30 95

原创 STM32的启动过成

添加链接描述

2021-09-08 23:53:49 83

原创 时钟周期、机器周期、指令周期

添加链接描述

2021-09-08 15:44:53 89

原创 串口的接受中断与发送中断

串口三种方式工作,轮询、中断和DMA;**接收中断:**串口一来数据,立刻中断响应,进入中断服务函数接收;**查询发送:**发送完一个字节,等待发送完,继续发送下个字节,直到整个字符串发送完,在这期间一直占用CPU;**中断发送:**发送完一个字节CPU响应中断将下个字节放到外设寄存器,直到整个字符串发完,发完后再相应中断,补货…,这样的话发送中断就只有在中断时占用CPU资源;...

2021-09-08 15:33:57 6588

原创 STM32启动文件

添加链接描述

2021-09-07 17:01:41 92

原创 串行通信(USART/UART)

USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART接口与外界相连最少只需要三条线:TXD(发送)、RXD(接收)和 GND(地线)**空闲位:**数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。**起始位:**.

2021-09-06 17:36:41 2677

原创 Linux内核启动过程

U-boot设置从网络启动(从服务器端,调试)上电,启动uboot,计时n秒;n秒后,自动运行boot命令,boot读取环境变量bootcmd;//网络挂载根文件系统setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250:/home/liyou/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:255.25

2021-09-05 23:24:22 175

原创 CAN通讯、CAN协议、UDS

CAN协议栈UDSCANTpDBC

2021-09-05 18:25:00 2496

原创 关于单片机的内存使用问题(norFlash、SRAM、nandFlash)

对单片机编程后,程序的代码段,data段,bss段,rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段,bss段,复制到RAM中,并建立好堆栈,开始调用程序的main函数。以后,便有了程序存储器,和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的意义就在于速度更快。ARM采用哈弗结构,SRAM取数据,FLASH取指令,两者同时进行,效率高。********详细请看这里冯.诺依曼体系与哈佛体系的区别:二者的区

2021-09-05 15:49:32 2269

原创 STM32的中断控制器

CM4 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有256 级的可编程中断设置。但 STM32F4 并没有使用 CM4 内核的全部东西,而是只用了它的一部分;STM32F40xx/STM32F41xx 总共有 92 个中断,STM32F42xx/STM32F43xx 则总共有 96 个中断,92 个中断里面,包括 10 个内核中断和 82 个可屏蔽中断,具有 16 级可编程的中断优先级;typedef struct{ __IO uint32_t ISE.

2021-09-05 15:37:28 573

原创 单片机时钟系统

STM32F407:S32k:

2021-09-05 14:41:22 134

原创 中断服务函数和普通函数的区别

相同点两者都需要保护断点(即下一条指令地址)、跳至子程序或中断服务程序、保护现场、子程序或中断处理、恢复现场、恢复断点(即返回主程序)。两者都可实现嵌套,即正在执行的子程序再调另一子程序或正在处理的中断程序又被另一新中断请求所中断,嵌套可为多级。不同点两者的根本区别主要表现在服务时间与服务对象不一样上。首先,调用子程序过程发生的时间是已知和固定的,即在主程序中的调用指令(CALL)执行时发生主程序调用子程序,调用指令所在位置是已知和固定的。而中断过程发生的时间一般的随机的,CPU在执行某一主

2021-09-03 01:10:46 6445 1

原创 同步、异步通讯的区别

添加链接描述

2021-09-03 00:17:58 111

原创 SPI ! ! !

SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD 等设备与MCU 间,要求通讯速率较高的场合,传输速率可达几Mbps水平, I2C 的标准模式速度最高只能到100kbps;优点:支持全双工通信、通信简单、数据传输速率块;缺点:没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷;SPI通信有4种不同的模式,不同的从设备可能.

2021-09-03 00:11:00 293

原创 c语言常用数据类型所占用的字节数

2021-09-01 16:42:18 253

原创 #include< >和#include“ ”的区别

一、引用的头文件不同#include< >引用的是编译器的类库路径里面的头文件。#include“ ”引用的是你程序目录的相对路径中的头文件。二、用法不同#include< >用来包含标准头文件(例如stdio.h或stdlib.h).#include“ ”用来包含非标准头文件。三、调用文件的顺序不同#include< >编译程序会先到标准函数库中调用文件。#include“ ”编译程序会先从当前目录中调用文件。四、预处理程序的指示不同#include

2021-09-01 16:18:50 4832

原创 SPI

有哪几种通讯模式?spi有哪些种类,一次能发多少位数据?传输模式有哪些?一主多从,从机不同极性,如何配置,如何通讯?

2021-08-30 16:46:58 88

转载 VCC、VDD、VSS、VDDA、VSSA、VREF+等标识

2021-08-28 22:05:53 2850

原创 UCOS!!

添加链接描述

2021-08-28 21:58:23 67

转载 static与函数指针

static从本质来讲就两个作用:1、 限定存储域:被static修饰的变量无论是局部变量还是全局变量都将被编译器存放在静态区。而实际上在gcc编译完生成的ELF格式文件中并没有静态区这个概念,所谓静态区是我们在概括讨论程序数据段的一种泛称。实际上编译器会根据具体情况把被static修饰的变量分为两类:当变量被定义并初始化为非零值的时候,变量将放在.data段;当否则为初始化或初始化为零的时候将放在.bss段。我们在不深入讨论的时候暂且可以将此两段概括为静态区。而放在静态区的变量由于存储域的原因导致生命周

2021-08-28 21:56:54 602

转载 指针使用中一些常见问题

添加链接描述

2021-08-25 18:28:27 86

原创 ARM汇编基础

1、GNU汇编语法GNU汇编由一系列的语句组成, 每行一条语句,每条语句有三个可选部分如下:label:instruction @ commentlabel即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意label后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。instruction即指令,也就是汇编指令或伪指令。@符号,表示后面的是注释,就跟C语言里面的“/”和“/”一样,其实在GNU汇编文件中我们也可以使用“/

2021-08-25 18:10:52 214

原创 IIC软件模拟协议

物理层特点:(1) 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C 通讯总线中,可连接多个I2C 通讯设备,支持多个通讯主机及多个通讯从机。(2) 一个I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。(4) 总线通过上拉电阻接到电源。当I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻

2021-08-25 00:01:36 739

原创 单片机程序烧录的3种方式(ISP、ICP、IAP)

添加链接描述

2021-08-24 18:11:23 681

原创 STM32的8种GPIO输入输出模式

添加链接描述

2021-08-24 17:34:45 134

原创 C 中关键字 inline 用法解析

添加链接描述

2021-08-24 17:31:19 74

转载 sizeof与strlen的区别

char str[20]=“0123456789”;int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0’为字符串结束标记。int b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响char *str1=“absde”;char str2[]=“absde”;char str3[8]={‘a’,};char ss[] = “0123456789”;输出:siz

2021-08-24 17:30:26 83

原创 程序、进程、线程、并发、并行、高并发?

添加链接描述

2021-08-24 17:20:45 64

原创 内核初始化优化宏(__init, __devinit)

本文转自:内核初始化优化宏(__init, __devinit)在内核里经常可以看到__init, __devinit这样的语句,这都是在init.h中定义的宏,gcc在编译时会将被修饰的内容放到这些宏所代表的section。其典型的定义如下:#define __init __section(.init.text) __cold notrace#define __initdata __section(.init.data)#define __initconst __sec

2021-08-24 17:17:25 415

原创 linux内核设备树及编译

添加链接描述

2021-08-24 17:12:25 272

原创 (Linux) 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析

添加链接描述

2021-08-24 17:10:52 118

转载 车载ECU在OTA升级过程中,flash driver单独存在的意义

在ECU OTA 程序升级过程中,需要执行一段比较特殊的代码,这段代码实现对自身flash的擦除与写入,又称flash driver。在OTA升级过程中,往往需要在发送app可执行文件之前,向底层先发送一段叫"flash driver"的二进制文件,这里简单总结一下这段“flash driver”二进制文件存在的意义。1、在车载ECU控制器中,为了安全考虑,会尽可能的避免在代码中固化有对flash进行擦除或写入的操作,主要为了避免在程序跑飞时误调用该部分代码,使软件代码部分受到破坏;2、flash d

2021-08-24 17:04:34 994

转载 如何选型MCU

元器件选型基本原则通用性原则:所选的元器件要是被广泛使用验证过的,尽量少使用冷门、偏门芯片,减少开发风险。高性价比原则:在功能、性能、使用率都相近的情况下,尽量选择价格比较好的元器件,降低成本。采购方便原则:尽量选择容易买到、供货周期短的器件。可持续原则:尽量选择寿命周期长的器件。可替代原则:尽量选择pin to pin兼容芯片品牌比较多的元器件。公司兼容原则:尽量选择以前老产品用过的元器件。MCU选型要选好一款处理器,要考虑的因素很多,不单单是纯粹的硬件接口,还需要考虑相关的操作系统、配套

2021-08-24 17:03:19 1647

原创 进程context和中断context

2021-08-14 13:12:24 162

转载 C++中引用(&)的用法

对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,取地址符常常用来用在函数传参中的指针赋值。但是在C++中它却有着不同的用途,掌握C++的&符号,是提高代码执行效率和增强代码质量的一个很好的办法。引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有搞清本源。故在本篇中我将对引用进行详

2021-06-24 17:34:49 6511

空空如也

空空如也

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

TA关注的人

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