- 博客(15)
- 收藏
- 关注
原创 单片机程序结构——消息系统
对于裸机的单片机来说好的程序结构至关重要,好的程序结构非常重要。给大家分享一个单片机消息系统。void Send_MSG(unsigned char msg){ *pWrite_MSG++=msg;//其实程序是这样滴 *(pWrite_MSG++);*与++的优先级别是一样的,但是结合性是自右向左 if(pWrite_MSG>&gMSGBuf[MSGBuf_size-1])//判断是否超出了缓存的地址 pWrite_MSG=&gMSGBuf;}vo
2020-11-03 18:28:37
695
原创 C语言中_align()关键字的作用与内存对齐的原理
cpu在访问内存的时候是以一个字(字节)进行传输的(计算机中,一个机器字长就是cpu位数,32位cpu,四个字节为一个字)。也就是说cpu读取数据每次都是四个字节四个字节的读取,计算机最初是从地址0开始寻址,那么寻址也就是4个字节4个字节的地址依次往后找。如果我们只需要读取一个字节的char型变量,那么计算机也是读取它所在的4个字节出来,然后提取出那个目标字节就行了,因为32位计算机每次都是4字节为操作单位。 如果不指定对齐方式,默认单字节对齐,即最自然的变量申请和存放方式,这样不会造成内存空隙浪费,但.
2020-10-24 18:06:59
4105
2
转载 电量曲线的插值法
前段时间做了一款充电宝的项目,电量要0-100%实时显示,由于自己的原因,这个项目被严重延期,自己想想从这个项目收获很多......其他不说了进入正题。设计电量曲线的时候可以根据不同需求设置不同的掉电电量的下降的速度,可以分块来设计,相当于用折线来拟合曲线,如下设计电量和对应的百分比值。static const float Set_Voltage[] = { Voltage_Table1,Voltage_Table2, Voltage_Table3, Volt.
2020-10-22 19:46:56
378
原创 简单谈C++为什么是面向对象的程序设计
C++与C语言相对,最主要的优越性是C++面向对象的方法设计和建立程序,这是程序能更加的形象地模拟现实,从而是程序更加理解、表达和维护。 **啥?这是啥???** 这句话是书上写得,一开始也非常的迷惑C++为什么是面向对象,啥是对象? 本质而言,面向对象的程序设计方法就是一种面向数据的程序设计方法,本质的目的就是让**程序更加理解、表达和维护**。 它谋求的是设计结果与问题在结构上保持一致。 **它认为问题系统就是由一个个对象及其相互联系、相互作用而构成的。** 它以数据为中心,将数据(或称为.
2020-10-19 16:28:53
2423
原创 单片机程序员必须掌握的堆栈
之前一看到堆栈、数据结构了什么的总觉得“高大上”,可望而不可即的高度。但是作为一个嵌入式开发的程序员来说必须深入的了解单片机平台的存储器的结构,堆栈一些知识,否则你根本不了解这个平台。对于只用C语言的开发者来说,编译器为我们做了大部分呢的工作,编译时全局变量,静态变量已经分配好内存空间,只学会简单的编程只是刚刚步入了大门而已。使用汇编语言开发则需要对数据结构、存储器、入口地址、堆栈要有更深层次的掌握,能用汇编语言开发你才算掌握了这款单片机。如果了解一点汇编编程话,就可以知道,堆栈是内存中一段连续...
2020-10-17 18:47:05
1367
3
转载 存储器容量计算及相关概念
存储容量的定义 :存储容量是指主存能存放二进制代码的总位数存储器容量计算公式:按位计算 (b) : 存储容量 = 存储单元个数 x 存储字长按字节计算(B): 存储容量 = 存储单元个数 x 存储字长 / 8存储单元 :CPU访问存储器的最小单位,每个存储单元都有一个地址。存储字长 :存储器中一个存储单元(存储地址)所存储的二进制代码的位数。例题:一个存储器有16根地址线,8根数据线,求此存储器存储容量?答:按位求取 2^16 x 8位 =64K x 8位
2020-10-15 14:34:35
8314
3
转载 C语言中宏定义中的do {...} while(0)的微妙之处
在C源代码一些官方的代码和Liunx中内核中会很多的宏定义中使用了do {…} while(0)这样的语法,当时觉得很奇怪,感觉这样的语法并没有意义,后来在网上查了相关的资料才发现它的微妙之处。假如我们有这样一个例子:#define FUNC(x) func1(x);func2(x)int main(){ int x = 0; FUNC(x);}那么在编译的预处理的过程中,编译器会对宏进行展开:int main(){ int x = 0; func1(x)
2020-09-29 15:44:20
583
转载 枚举类型enum用法
枚举常量是枚举类型中的值,即枚举值。枚举类型是一种用户定义的类型,只有用户在程序中定义它后才能被使用。用户通常利用枚举类型定义程序中需要使用的一组相关的符号常量。枚举类型的定义格式为:enum <枚举类型名> {<枚举表>}; 它是一条枚举类型定义语句,该语句以enum保留字开始,接着为枚举类型名,它是用户命名的一个标识符,以后就直接使用它表示该类型,枚举类型名后为该类型的定义体,它是由一对花括号和其中的枚举表所组成,枚举表为一组用逗号分开的由用户命名的符号常量,每个
2020-09-24 22:08:25
5362
转载 Source Insight 4.0中文乱码的解决方法
单个文件乱码解决办法: 菜单栏中【File】 > 【Reload As Encoding...】 > 【Chinese Simplified (GB2312)】 > 选择后,点击load就OK了!所有文件乱码解决办法:菜单栏中 【Options】 > 【Preferences】 >File标签中,最下面的“Default encoding” :改成System Default(Windows ANSI) 或者Chinese Simplified(GB2312) CP
2020-09-24 21:31:28
524
原创 _attribute_((weak))分析
A,B两个模块,A模块调用了不确定B模块是否提供了函数,但是又不得不调用,这个时候在A模块中再申明一个弱符号函数,即用weak,如果外部提供了调用外部的,如果没提供调用申明的。
2020-09-24 09:35:51
133
转载 STM32结构体_强行地址转换
对于STM32固件库中的地址强行地址转换#define GPIOA ((GPIO_typedef *) GPIOA_BASE此预处理将 GPIOA 变成 GPIO_typedef 类型的结构体指针,默认指向了GPIOA的基地址首。在调用->指向不同结构体成员时,指针就会根据成员变量类型的大小跳不同的步进,进而访问到不同的成员地址,对不同成员地址(其实就是GPIO的各功能寄存器)赋值处理就完成操作GPIO。...
2020-09-20 09:41:59
1842
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人