自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 STM32F103VET6 定时器开发基础

STM32常见的定时器资源系统滴答定时器SysTick集成在cortex M3内核中的定时器,他并不属于芯片厂商外设,即使用ARM内核的不同厂商都拥有结构相同的系统定时器。主要目的是给RTOS提供时钟节拍做时间校准看门狗定时器 WatchDog实时时钟RTC基本定时器:TIM6 TIM7通用定时器:TIM2 TIM3 TIM4 TIM5在基本定时器的基础上,实现输出比较、输出捕获、PWM生成、单脉冲模式输出等功能,使用最广泛高级定时器:TIM1 TIM8STM32通用定时器的重要知识点S

2020-11-18 16:57:00 3444

原创 linux进程

gcc -v 打印编译信息file a.out 查看本质 链接架构等./a.out 抛给加载器 运行时的加载器是操作系统中的程序,当我们去执行一个程序时,加载器负责将这个程序加载到内存中去执行这个程序。程序在编译链接时用链接器,运行时用加载器,这俩队程序运行原理非常重要程序结束: return exit _exit非正常终止:自己或他人发信号终止进程(类似ctrl c)atexit 注册进程终止处理函数多个注册时,先进后出 先注册的后执行用_exit时,不执行atexit注册

2020-10-16 19:48:08 195

原创 malloc和free使用的一些注意事项

#include<stdlib.h>malloc只关心申请的内存大小,单位是字节。申请的是一个连续的内存。该函数申请的一定是一个连续的内存空间,可能申请到的内存比实际申请的大,也可能申请不到,若申请不到返回NULL,一定要用if语句判断一下返回值类型为指针类型,可以根据实际情况返回成所需要的的指针类型显式初始化。堆区不会自动在分配时做初始化的,包括清零。所以你要自己进行初始化。freevoid free(void *ptr);函数的参数是ptr,指的是需要释放的内存的起始地址,且

2020-10-09 17:00:00 420

原创 IO

操作系统API:API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用。应用层程序通过调用API来调用操作系统中的个各种功能来干活。学习一个操作系统,其实就是学习使用这个操作系统的APIlinux常用文件IO接口:open close write read lseek文件操作的一般步骤:先open打开一个文件,得到一个文件描述符,然后对文件进行读写,最后close文件文件平时是存放在块设备的文件系统中的,我们把这种文件叫静态文件。当我们open一个文件时,linux内核:

2020-10-08 16:46:48 199

原创 双链表

单链表的局限性:是对数组的扩展,解决了数组的大小比较死板不容易扩展的问题。使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单向链接。链表中各个节点内存不相连,有利于碎片化的内存单链表各个节点之间只由一个指针单向链接,局限在只能由指针单向移动双链表:有效数据+两个指针单链表节点:有效数据+指针(指针指向后一个节点)双链表节点:有效数据+两个指针(一个指向后一个节点,另一个指向亲一个节点)...

2020-10-07 19:05:20 86

原创 单链表算法

遍历:就是把单链表中的各个节点挨个拿出来,就叫遍历遍历要点:不能遗漏,不能重复,追求效率方法:从头指针+头节点 ,顺着链表挂接指针依次访问链表的各个节点,取出这个节点的数据,然后再往下一个节点,知道最后一个节点,结束返回#include<stdio.h>#include<stdlib.h>#include<strings.h>//构建一个链表的节点struct node{ int data; //有效数据 struct node *pnext; /

2020-10-06 19:43:25 264

原创 链表

链表就是一个元素个数可以实时变大/变小的数组链表就是被锁链链接起来的表。这里的表指的是一个一个的节点,节点内的一些内存可以用来存储数据;这里的锁链指的是链接各个表的方式,C语言中用指针来链接2块内存链表是由若干个节点组成的,节点由有效数据和指针组成(节点结构完全类似),有效数据用来存储信息完成任务的,指针区域用于指向链表的下一个节点而构成链表总结链表本质上就是用来解决数组的大小不能动态扩展的问题,所以链表其实就是当数组用的。链表就是用来存储数据的,链表用来存数据相对于数组来说有点就是灵活性,需要多

2020-10-05 21:18:39 254 1

原创 函数库

函数库:事先写好的函数的集合函数是模块化的,因此可以被复用。我们写好写好了一个函数,可以被反复使用

2020-10-04 20:44:24 899

原创 递归函数

递归函数就是函数中调用了自己的函数典型:阶乘 斐波那契数列//递归方式 阶乘#include<stdio.h>int jiecheng(int n);//函数声明int main(void){ int a = 5; printf("%d的阶乘是:%d\n",a,jiecheng(a)); return 0;}int jiecheng(int n){ if(n<1) { printf(" n必须大于等于1\n"); return -1; }

2020-09-29 21:24:13 258

原创 函数的本质

整个程序分为多个源文件:一个文件分成多个函数,一个函数分成多个语句,这是整个程序的组织形式这样组织的好处:分化问题,便于编写程序。便于分工函数的出现是程序员和架构师的需要,而不是编译器、cpu的需要函数的目的是实现模块化编程,说白了就是为了提供程序的可移植性函数是动词,变量是名词函数将来被编译成可执行代码段,变量(主要指全局变量),经过编译后变成数据或者在运行时变成数据,一个程序的运行需要代码和数据两方向的结合才能完成代码是为了加工数据,数据必须借助代码来起作用函数的实质:数据处理器程序的主

2020-09-29 16:03:42 1889

原创 宏定义

宏定义的规则 :在预处理阶段由预处理器进行替换,这个替换是原封不动的替换宏定义替换会递归进行,知道替换出来的值不再是一个宏宏定义分为三部分: #define 宏名 剩下的部分#define GGG (36524243012) //可行,可是数字太大 默认为int类型#define GGG (36524243012UL) //转成无符号数字带参宏和带参函数的区别(宏定义的缺陷)...

2020-09-29 10:33:47 220

原创 C语言预处理理论

C语言预处理理论由源码到可执行程序的过程源码-(编译)-目标文件.0-(链接)-elf可执行程序源码.c-(预处理)-与处理过的.i源文件-(编译)-汇编文件.s-(汇编)-目标文件.0-目标文件.0-(链接)-elf可执行程序gcc就是一个编译工具链预处理的意义编译器本身的主要目的是编译源代码,将C的源代码转化成.S的汇编代码。编译器聚焦核心功能后,就剥离了一些非核心的功能到预处理器去了预处理器帮编译器做一些编译前的杂事预处理:#include #(注释) #if #elif #en

2020-09-28 17:52:37 90

原创 枚举

枚举在C语言中其实是一些符号常量集。枚举定义了一些符号,这些符号的本质就是int类型的常量。每个符号和一个常量绑定。这个符号就表示一个自定义的一个识别码,编译器对枚举的认知就是符号常量所绑定的那个int类型的数字#include<stdio.h>//这个枚举表函数的返回值 对还是错//枚举值常量是全局的enum return_value{ ERROR, RIGHT,};enum return_value func1(void);int main(void){ e

2020-09-28 12:04:52 78

原创 大小端模式

大端模式(big endian) 小端模式(little endian)

2020-09-28 10:41:51 502

原创 共用体union

共用体类型的定义、变量定义和使用union和struct很相似#include<stdio.h>struct mystruct{ int a; char b;};typedef union myunion{ int a; char b;}GGG;int main(void){ //test 1 struct mystruct s1; s1.a=23; printf("s1.b = %d\n",s1.b); // 0 无关的 union my

2020-09-26 20:52:24 169

空空如也

空空如也

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

TA关注的人

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