- 博客(52)
- 资源 (10)
- 收藏
- 关注
原创 C语言 strcmp、strncpy、sprintf、strncmp函数总结
C语言 strcmp、strncpy、sprintf、strncmp函数总结
2022-05-11 19:24:34
816
原创 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
3219
原创 C语言操作寄存器的方法总结
1、C语言位操作操作寄存器操作位有两种方法,一种是位字段,另一种是使用按位运算符。下表为几种位操作符及其含义:不改变其他位的值的状况下,对某几个位进行设值。在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器:当我们要设置第0位bit0的值为1时,可能会这样进行设置:TEST = 0x01;但是,这样设置是不够准确的,因为这时候已经同时操作到了
2021-11-23 17:35:25
17967
原创 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
1007
原创 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
538
原创 C语言内存泄漏剖析
大家都知道,在堆上分配的内存,如果不再使用了,就应该及时释放,以便后面其他地方可以重用。而在 C 语言中,内存管理器不会自动回收不再使用的内存。如果忘了释放不再使用的内存,这些内存就不能被重用了,这就造成了内存泄漏,内存泄露只可能出现在堆上。内存泄漏几乎是很难避免的,但是掌握了一定方法还是能很好的降低内存泄露的风险。也许对一般的应用软件来说,这个问题似乎不是那么突出与严重。一两处内存泄漏通常并不致于让程序崩溃,也不会带来逻辑上的错误,而且在进程退出时,系统会自动释放所有与该进程相关的内存(共享内存除外)
2021-11-13 13:11:37
433
原创 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
1550
原创 C语言动态申请内存造成的内部碎片和外部碎片
C语言支持动态申请内存,就是我们常见的malloc 和 free函数。动态申请内存理论上会极大的节省内存空间。但在用的时候一定注意内存碎片,否则后果不堪设想。所以说动态申请内存的官方函数在没有足够的知识储备前慎用。内存碎片又分为内部碎片和外部碎片:内部碎片:由于申请的时候申请的不是4字节的倍数造成的,例如申请了17个字节,但是系统不会给你分配17个而可能是20个字节,这就造成了内部碎片的产生。解决办法:尽量申请4的倍数的字节,或者对于大内存的单片机来说,可以规定申请的单位是k,就可以避免这个问题
2021-11-11 11:17:29
1966
原创 嵌入式之地址重映射分析
写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
1436
1
原创 关于单片机栈空间的总结
1、如果定义成全局数组,则此数组就会自动初始化为0但如果定义成局部数组,则必须要先初始化2、 局部变量一定要初始化局部变量初始化”是指在使用这个局部变量前,要对其进行初始化。这是因为局部变量是从内存堆中分配的,用完就还给内存堆,所以被分配的局部变量并不一定是0,而很可能是其他地方用过的一个值,因此在使用这个变量之前,要对它进行显示初始化。3、栈空间最大原则,所有子函数中局部变量、数组、函数参数占用的空间中取最大值作为栈空间的最大值。...
2021-07-22 15:41:44
494
原创 记录一个小细节导致的惨痛教训!!!
如上图所示:数组的下标为不确定数,这个容易忽略的小细节导致数据没有去对,后续的算法都无法实现,将数组下标设为固定数或无下标,问题解决。看来一定要注重基础呀。或者用动态数组的方式实现都是可以的。comp* h;comp* g;comp* pComp;i=1;do { i*=2;} while (i<N+M-1);L = i;h = (comp*)calloc(L,sizeof(comp));g = (comp*)calloc(L,sizeof(comp));pCom.
2021-06-08 18:18:04
103
原创 涂鸦BT3L蓝牙模组和单片机通信
1、单片机串口的发送函数(按字节发送)和接收中断配置清楚。2、先调试涂鸦APP的下发功能,然后调试上报功能,具体可以用涂鸦官方的调试助手。3、涂鸦SDK的移植按官方的文档即可。4、每次蓝牙模组更换不同APP界面,必须清楚一遍配置。5、两路串口中断同时使用时,串口初始化函数必须分开写,他的那个API的输入参数儿有的是结构体,有的是指针什么的,然后你都用的是同一个参数,然后输入进去之后,可能是不是它的API把这些结构体啊或者参数给改了,出来之后在初始化第二个的时候,他那个参数都不对了。
2021-05-18 17:44:55
1848
单片机最经典的算法汇总.zip
2020-06-09
初学者单片机例程(36例).zip
2020-06-09
黑客攻防实战
2018-12-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人