- 博客(55)
- 资源 (10)
- 收藏
- 关注
原创 ADC采样内部原理及ADC实现高分辨率采样
该方案有一个缺陷,就是每次ADC中断都需要CPU参与,在过采样率很高的情况下,上述方案消耗很多CPU资源,那么如果单片机内存资源足够的情况下可以考虑采用DMA模式,采集很多数据并将数据暂存下来,然后再做累加平均抽取。这是空间换时间的策略的体现。这个编代码也很容易,只需要申请一片内存区,内存区的大小可以定为256的倍数,这是因为在提升4位分辨率情况下,一个16位的输出样本需要256个12位样本。对信号进行过采样,然后在所需的采样周期内收集足够的样本以对它们进行平均,现在可以将16位输出数据用于16位测量。
2025-04-16 20:00:00
1293
原创 嵌入式硬件平台内存分区
但由于其具有掉电后数据可保持不变的优点,因此常用也存放一次性写入的程序和数据,比如主版的BIOS程序的芯片就是ROM存储器。由前面的分析我们知道,代码区和常量区的内容是不允许被修改的,ROM(STM32就是Flash Memory)也是不允许被修改的,所以代码区和常量区的内容编译后存储在ROM中。在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段。
2025-04-14 11:30:00
968
1
原创 C 语言指针-深度解析
这里只是描述地址总线的概念,实际的计算机中地址计算方式要复杂的多,比如:虚拟内存中采用分段、分页、偏移量来定位实际的物理内存,在分页中还有大页、小页之分,感兴趣的同学可以自己查一下相关资料。如果指针中存储的地址值是一个随机值,或者是一个已经失效的值,此时操作指针就非常危险了,一般把这样的指针称作。语言中的基本数据类型是预定义的,结构体是用户定义的,在指针的使用上可以进行类比,唯一有区别的就是在结构体指针中,需要使用。来安排程序中的各种地址,例如:加载到内存中的地址、代码段的入口地址等等,同时编译器也会。
2025-04-12 11:24:24
662
原创 C语言 strcmp、strncpy、sprintf、strncmp函数总结
C语言 strcmp、strncpy、sprintf、strncmp函数总结
2022-05-11 19:24:34
823
原创 Free RTOS 中断优先级配置
#define configPRIO_BITS 4#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //系统可管理的最高中断优先级#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_
2022-02-22 12:19:45
3286
原创 C语言操作寄存器的方法总结
1、C语言位操作操作寄存器操作位有两种方法,一种是位字段,另一种是使用按位运算符。下表为几种位操作符及其含义:不改变其他位的值的状况下,对某几个位进行设值。在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器:当我们要设置第0位bit0的值为1时,可能会这样进行设置:TEST = 0x01;但是,这样设置是不够准确的,因为这时候已经同时操作到了
2021-11-23 17:35:25
18274
原创 C语言volatile的应用举例
volatile 本意为“易变的”,它的作用是,当程序以一种编译器不知道的方式更改变量时,防止编译器对其进行任何优化(需要注意的是编译器的优化等级)。用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。volatile变量的例子:1、中断的发生,1.char flag = 0;2.3.int main(void)4.{5. ...6. while(1)7. {8. if (flag)9.
2021-11-22 17:57:22
1022
原创 C语言const的应用举例
一、常规用法关键字const用来定义只读变量,被const定义的变量它的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量,这也就意味着必须在定义的时候就给它赋初值。用const修饰变量的格式通常为1 const type name = value;代码示例;(第一种方式)1 const int Max;也可以写成下面这种(第二种方式)1 int const Max;通常情况下使用第一种方式(建议将被const修饰的变量的首字母大写),被 const
2021-11-22 17:24:13
546
原创 C语言内存泄漏剖析
大家都知道,在堆上分配的内存,如果不再使用了,就应该及时释放,以便后面其他地方可以重用。而在 C 语言中,内存管理器不会自动回收不再使用的内存。如果忘了释放不再使用的内存,这些内存就不能被重用了,这就造成了内存泄漏,内存泄露只可能出现在堆上。内存泄漏几乎是很难避免的,但是掌握了一定方法还是能很好的降低内存泄露的风险。也许对一般的应用软件来说,这个问题似乎不是那么突出与严重。一两处内存泄漏通常并不致于让程序崩溃,也不会带来逻辑上的错误,而且在进程退出时,系统会自动释放所有与该进程相关的内存(共享内存除外)
2021-11-13 13:11:37
444
原创 C语言结构体的深度剖析
1、(声明结构体类型仅仅是声明了一个类型,系统并不为之分配内存,就如同系统不会为类型 int 分配内存一样。只有当使用这个类型定义了变量时,系统才会为变量分配内存。所以在声明结构体类型的时候,不可以对里面的变量进行初始化。)typedef struct student{ int num;}STUDENT;typedef struct student STUDENT;typedef给struct student起了个新名字叫STUDENT。2、typedef struct tagNode
2021-11-12 09:40:50
1563
原创 C语言动态申请内存造成的内部碎片和外部碎片
C语言支持动态申请内存,就是我们常见的malloc 和 free函数。动态申请内存理论上会极大的节省内存空间。但在用的时候一定注意内存碎片,否则后果不堪设想。所以说动态申请内存的官方函数在没有足够的知识储备前慎用。内存碎片又分为内部碎片和外部碎片:内部碎片:由于申请的时候申请的不是4字节的倍数造成的,例如申请了17个字节,但是系统不会给你分配17个而可能是20个字节,这就造成了内部碎片的产生。解决办法:尽量申请4的倍数的字节,或者对于大内存的单片机来说,可以规定申请的单位是k,就可以避免这个问题
2021-11-11 11:17:29
2001
原创 嵌入式之地址重映射分析
写STM32程序时,遇到一个困惑,STM32的Flash在MDK里被设置为起始地址0x0800 0000,而CM4手册规定芯片复位时要从0x0000 0000地址开始取出**中断向量表** ,那STM32怎么样执行代码呢?**地址重映射**?或者在0x0000 0000里有对应有实际存储器?仔细阅读手册,发现这件事是因为STM32设计的**Flash起始地址**是在0x0800 0000位置开始的。全部代码都只能从这里开始存储。这样就还有一个问题,理论上,CM4中规定上电后CPU是从0地址开始
2021-09-18 16:06:37
1456
1
原创 关于单片机栈空间的总结
1、如果定义成全局数组,则此数组就会自动初始化为0但如果定义成局部数组,则必须要先初始化2、 局部变量一定要初始化局部变量初始化”是指在使用这个局部变量前,要对其进行初始化。这是因为局部变量是从内存堆中分配的,用完就还给内存堆,所以被分配的局部变量并不一定是0,而很可能是其他地方用过的一个值,因此在使用这个变量之前,要对它进行显示初始化。3、栈空间最大原则,所有子函数中局部变量、数组、函数参数占用的空间中取最大值作为栈空间的最大值。...
2021-07-22 15:41:44
505
单片机最经典的算法汇总.zip
2020-06-09
初学者单片机例程(36例).zip
2020-06-09
黑客攻防实战
2018-12-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人