自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2022-07-05 PCB接地技术详解

单板接地技术详解

2022-07-05 10:53:16 1760 1

原创 2021-07-28 C语言学习函数编写规范

一、每一个函数都必须有注释,即使函数短到可能只有几行。头部说明需要包含包含的内容和次序如下:/************************************************************************* Function Name : nucFindThread* Create Date : * Author/Corporation : your name/your company name**Description : Find a proper thre

2021-07-18 23:15:33 604

原创 2021-06-21 C语言指针与数组(续1)

能否向函数传递一个数组?void fun(char a[10]){char c = a[3];}intmain(){char b[10] = “abcdefg”;fun(b[10]);return 0;}函数参数需要的是一个char*类型的参数,而实际参数为char 类型,不匹配。第一:b[10]并不存在,在编译的时候由于没有去实际地址取值,所以没有出错,但是在运行时,将计算b[10]的实际地址,并且取值。这时候发生越界错误。第二:编译器的警告已经告诉我们编译器需要的是一个c

2021-07-06 22:45:53 151

原创 2021-06-20 CAN总线基础知识一

1】CAN总线为什么要有两个120Ω的终端电阻?高频信号传输时,信号波长先对传输线较短,信号在传输线终端会形成放射波,干扰原信号,所以需要在传输线末端加终端电阻,使信号到达传输线末端后不放射。对于低频信号则不用。2】CAN总线远距离通讯接120Ω的终端电阻,有时候通讯不上?CAN的终端要加120Ω,那是短距离的阻抗匹配结果,如果在长距离上还是加120Ω是会对信号有极大危害的,因为CAN收发器的驱动能力是一定的,传了5公里后,回路线阻抗(CAN_H+CAN_L)将近250Ω,如果加上120Ω电阻,那么终

2021-07-06 22:45:33 1978

原创 2021-06-21STM32F4 DMA映射表

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210621112610555.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNzk5NzAzNjU1,size_16,color_FFFFFF,t_70

2021-07-06 22:45:14 338

原创 2021-06-01 C语言指针数组深入分析

指针内存大小一个基本的数据类型(包括结构体等自定义类型)加上“”号就构成了一个指针类型,**指针大小是一定的,与“”号前面的数据类型无关。“*”号前面的数据类型只是说明指针所指向的内存里存储的数据类型。所以,在32 位系统下,不管什么样的指针类型,其大小都为4byte。****int p = NULL 和 p = NULL 有什么区别?...

2021-07-06 22:45:00 131

原创 2021-05-13 FREERTOS 状态信息查询

FREERTOS可屏蔽中断#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 4 //系统可管理的最高中断优先级#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //中断最低优先级在需要用到 taskENTER_CRITICAL(); //进入临界区 系统会自

2021-07-06 22:40:37 156

原创 2021-04-27 C语句

空语句NULL;FOR建议for 语句的循环控制变量的取值采用“半开半闭区间”写法半开半闭区间写法 闭区间写法for (n = 0; n < 10; n++) for (n = 0; n <= 9; n++)循环要尽可能的短,要使代码清晰,一目了然,。一般来说循环内的代码不要超过20行。把循环嵌套控制在3 层以内.voidvoid表示空类型,void *可以

2021-07-06 22:40:00 44

原创 2021-04-21 STM32串口DMA接收

//接收完成中断void DMA2_Stream5_IRQHandler(void)//空闲中断void USART1_IRQHandler(void)接收完成DMA中断与串口空闲中断配置不同的中断优先级,会影响这两个中断函数进入。空闲中断的优先级高于DMA中断,则DMA中断不会进入该中断函数,空闲中断中后读SR,然后读DR寄存器才能清除本次中断,之后则不能进入DMA中断。如果DMA中断的优先级高于空闲中断,则先进入DMA中断函数, DMA_Cmd(DMA2_Stream5, DISABLE

2021-07-06 22:39:30 206

原创 2021-04-18 函数指针参数

在指针做参数传递给函数的时候:只能保留指针指向的对象(*P)改变的值。不能保留指针本身(P)所做得修改。在需要修改指针本身的时候,需使用指向指针的指针作为参数,也便是传值与传址的差别所在#include<stdio.h>void fun(int *p){ int b=100; p=&b;}main(){ int a=10; int *q; q=&a; printf("%d\n",*q); fun(q); prin

2021-07-06 22:39:14 97

原创 2021-03-29 一阶滞后滤波算法

#define a 0.01 // 滤波系数a(0-1) char value; //滤波后的值 char new_value; // 新的采样值 char filter() { char new_value; new_value = get_ad(); return 0.01*value + (1-0.01)*new_value; } 取a=

2021-07-06 22:38:12 940

原创 2021-06-28 C语言内存管理(续1)

堆栈、静态存储区堆栈就是指栈,堆就是堆。内存可以分为3个区:堆、栈、静态存储区静态存储区:存储的是程序里的全局变量与Static修饰的局部变量或全局变量。静态区的内容在程序的整个生命周期内都是 存在的,由编译器在编译的时候分配。栈:栈是指保存的局部变量,栈里的内容只能在函数范围内存在,函数运行结束,这些局部变量就是自动销毁,其特点是效率高,但是空间大小有限。堆:堆是由malloc或者new函数分配的内存,生命周期由Delete或者free函数决定,在没有释放之前是一直存在的,直到程序结束。其特点是使

2021-07-06 22:30:03 77

原创 2021-05-31 C语言预处理全集

#undef 是用来撤销宏定义的,用法如下:#define PI 3.141592654…// code#undef PI//下面的代码就不能用PI 了,它已经被撤销了宏定义。条件编译第一种形式:#ifdef 标识符程序段1#else程序段2#endif它的功能是,如果标识符已被#define 命令定义过则对程序段1 进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else 可以没有,即可以写为:#ifdef 标识符程序段#endif第二种形.

2021-06-01 23:20:33 63

原创 2021-05-27 C语言符号全集

C语言符号全集

2021-05-28 12:12:18 479

原创 2021-05-26 C语言关键字全集

C语言关键字全集1、Register 关键字该关键字声明某个变量时,请求编译器尽可能将该变量存储在CPU内部的寄存器中而不是内存中,以提高速率。是尽可能,不是绝对的,因为寄存器的数量是有限的,只有这么几十个。虽然寄存器的速度非常快,但是使用register 修饰符也有些限制的:register 变量必须是能被CPU 寄存器所接受的类型。意味着register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。而且register 变量可能不存放在内存中,所以不能用取址运算符“&”来获

2021-05-27 17:17:34 236

原创 2021-05-25 FREERTOS 内存管理

FREERTOS 内存管理/***************************************************************************************************************//* FreeRTOS与内存申请有关配置选项 *//***********************

2021-05-25 22:08:39 144

原创 2021-05-24 FREERTOS空闲任务

空闲任务空闲任务钩子函数

2021-05-24 22:45:58 396

原创 2021-05-24 FREERTOS任务通知—模拟事件标志组

任务通知—模拟事件标志组描述:使用任务通知模拟事件标志组也时通过操作一个32位任务通知值的位来实现的,只不过是间接操作的,比事件标志组操作要繁琐一点,个人建议使用事件标志组替代任务通知模拟。#include "event_groups.h" //头文件EventGroupHandle_t EventGroupHandler;//事件标志组句柄声明#define EVENTBIT_0 (1<<0)//事件标志位 0#define EVENTBIT_1 (1<<1

2021-05-23 21:34:40 148

原创 2021-05-23 FREERTOS任务通知-模拟消息邮箱

任务通知-模拟消息邮箱描述:模拟邮箱大概就是向任务发送数据,但是不同与队列的是,任务邮箱发送消息受到了很多限制。1、只能发送一个32位的值。2、消息邮箱的值被保存为一个任务的通知值,而且只能保存一个任务的值,相当于队列长度为1.消息邮箱发送通知#define xTaskNotify( xTaskToNotify, ulValue, eAction ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ),

2021-05-23 20:50:28 221

原创 2021-05-23 FREERTOS 任务通知—模拟二值信号量—模拟计数型信号量

任务通知—模拟二值信号量描述:每一个任务都有一个32位的任务通知值,任务控制块中的成员变量ulnotifiedValue就是这个值。任务通知时一个事件,某个任务因为等待接收事件而阻塞的话,则接收到任务通知之后则会解除阻塞。**特点:**比普通二值信号量的解除阻塞时间快50%,减少了大量代码,减少了内存占用。**缺点:**任务的接收通知只能是指定的一个任务接收,不能多个任务接收。接收通知可以进入阻塞状态,发送通知不会进入阻塞状态。**vTaskNotifyGiveFromISR();**发送通知

2021-05-23 16:43:48 215

原创 2021-05-21 FREERTOS事件标志组

FREERTOS事件标志组描述:事件位:一个事件发生后就置1,当没有发生这个事件就置0;事件组:一个事件组表示多个事件位组成的事件,BIT0表示一个事件0,BIT1表示事件1,BIT2表示事件2这些事件可以通过事件标志位来管理,可以置0或者置1,可以等待多个任务全部置1然后再处理,也可以读取事件标志位的值。事件标志组相当于裸机的多个全局变量取&|关系,但是裸机没有阻塞这一功能,必须轮询全局变量的值,而且中断服务函数中的全局变量与主函数同步不及时,所以处理裸机的多个全局变量的|| || &a

2021-05-21 23:50:22 177

原创 2021-05-19 FREERTOS 互斥信号量

互斥信号量描述:几个任务使用同一个信号量时如二值信号量时,信号量的释放与获取会导致任务的优先级翻转。互斥信号量即可以缓解这个问题,但是不能根本解决这个问题。互斥信号量拥有优先级继承的特点。一个互斥信号量正在被一个低优先级的任务使用时,此时有一个高优先级的任务尝试获取该信号量时,则会造成阻塞,不过该高优先级的任务可以通过将低优先级任务的优先级提高到和高优先级相同,以减少阻塞时间,这个过程称为优先级继承,优先级翻转可以降到最低。互斥信号量不能用于中断服务函数中。原因:互斥信号用拥有优先级继承的关系,所

2021-05-20 00:18:52 200

原创 2021-05-19 FREERTOS优先级翻转

优先级翻转如下图:优先级 任务H>任务M>任务L总结:任务L先获取到信号量,则优先执行,未执行完成一直占用着信号量,并没有释放信号量,任务H优先级是最高的则可以剥夺任务L的CPU使用权,即使任务L还未运行完成。但是任务H开始运行时发现信号量被占用,所以只能处于阻塞状态(挂起状态?),接着任务L开始接着运行,刚运行时任务M的优先级高于L,则任务M抢占CPU,任务M开始运行,直到任务M运行完成(没有优先级更高的任务,H已经处于挂起状态)。接着任务L运行完成释放信号量,则任务H才开始运

2021-05-19 15:58:37 242

原创 2021-05-19 FREERTOS计数信号量

计数型信号量描述:计数型信号量相当于队列项目大于1的队列,不用设置队列的存储内容,只管队列的计数值大小。用处:1.事件计数型信号量一个任务或者中断可以释放该计数信号量,即写入信号量。初始值为0,写入一次加1.设置信号量的最大值为MAX,MAX一般为最大255.写入的值不能大于该MAX,大于该MAX则写入失败。其它单个任务包含多个任务都可以获取该计数信号量,可以等待该计数信号量的值,获取成功则执行该任务,获取失败则处于阻塞状态,多个任务同事阻塞,则优先级高的任务优先获取计数型信号量,获取之后数值减

2021-05-19 12:26:35 292

原创 2021-05-18 FREERTOS 二值信号量

二值信号量介绍:二值信号量表示只有一个队列项的队列。每个队列项的大小不用设置,这个队列项只能是空的或者是满的,所以定义为二值信号量。在任务和中断中不用管该队列存什么消息,只用设置两个状态即可,例如:在中断中写队列,在任务中读队列,他们是同步的。例如:裸机的循环程序中有一个函数为一直判断是否有中断数据来,这样会造成CPU资源占用。此时相当于中断中有一个全局变量,在主程序中可以判定该全局变量是否有效。那么二值信号就替代这个全局变量,在中断中该二值信号写入,其它任务中读取该二值信号,设置读取时间为绝对阻塞

2021-05-19 01:04:23 306

原创 2021-04-11 C语言抽象数据类型

断言void assert( int expression );assert宏的原型定义在<assert.h>中,其作用是先计算表达式 expression ,如果expression的值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。#include <stdio.h>#include <assert.h>int main( void ){ int i; i=1; assert(i++

2021-05-13 18:00:40 87

原创 2021-05-11 FREERTOS 队列

FreeRTOS 队列使用对FreeRTOS来说,队列是一种很基本数据结构,其中计数信号量,二值信号量等都是利用队列来做的;在FreeRTOS中,队列用于任务与任务之间,任务与中断服务子程序之间的数据传输,其作用类似于裸机编程时使用的全局变量,与全局变量不同的是,队列有阻塞超时时间;任务之间使用队列要遵循FIFO的特性当一个任务读取空队列时,这个任务将进入阻塞态(不消耗cpu,cpu会去运行其他任务),直到队列不为空或者阻塞时长超过设定的阻塞时间,将进入就绪态。当一个任务向满队列写时,这个任务会进入阻

2021-05-13 18:00:12 242

原创 2021-04-16 FREERTOS任务优先级

FreeRTOS任务优先级FreeRTOS任务优先级:任务优先级数值越小,任务优先级越低。一、 FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的 configMAX_PRIORITIES 进行配置的,用户实际可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1。比如我们配置此宏定义为 5,那么用户可以使用的优先级号是 0,1,2,3,4,不包含 5。二、用户配置任务的优先级数值越小,那么此任务的优先级越低,空闲任务的优先级是 0。

2021-04-16 00:38:59 5432

原创 2021-04-14 C语言存储区类型

***char p=“abcdef” 与char p[ ]=“abcdef”{ char *p="abcdef"; //很多书上说:p在栈,“abcdef”在数据区 p[2]='W'; printf(p); getchar(); return 0;}这个程序编译通过,但是程序运行会出错。{ char s[]="abcdef";//s在栈,“abcdef”在数据区 s[2]='W'; printf(s); g

2021-04-15 23:29:34 50

原创 2021-04-10 C语言预编译

条件编译#define DEBUG 1#if与#endif#if DEBUG a=b;#endif条件编译嵌套语句#if expression1 statement1#elif expression2 statement2#elif expression3 statement3#else statement4#endif以上两个条件编译语句判断表达式expression是否为真,为真则执行相应的语句,为假则跳过执行

2021-04-11 22:10:02 155

原创 2021-03-21 C语言结构体指针

uniontypedef union{ char s[4]; int value;}udio; udio mydata; mydata.s[0]=0x12; mydata.s[1]=0x21; mydata.s[2]=0xa1; mydata.s[3]=0x5e; printf("%d\r\n",mydata.value);输出结果为 1587618066char 占用1字节,int为4字节在上个union中char s[4]为4字节。

2021-03-22 01:02:47 125

原创 2021-03-19 C语言指针函数与函数指针

指针函数和函数指针

2021-03-19 17:00:26 74

原创 2021-03-17 C语言结构体

定义一个结构体typedeftypedef struct student{ int no; char name[12];}STU1, STU2;声明变量的时候可以使用 STU1 LIMING; STU2 LILI; STU1与STU2为student的别名struct Student{ int no; char name[12];}Stu;声明变量时使用 struct Student LIMING 或者 struct Stu LILI;typedef s

2021-03-18 17:56:11 122

原创 2021-03-15 C语言字符串学习

strlen size_t strlen( const char* str)功能:计算字符串长度,不包含’\0’返回值:返回字符串的字符数说明:strlen() 函数计算的是字符串的实际长度,遇到第一个’\0’结束;参数指向的字符串必须以 ’ \0 ‘结束函数返回值一定是size_t ,是无符号的如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到’\0’停止sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符

2021-03-16 09:12:10 68

原创 2021-03-12 C语言指针学习

int a=100;int *b=&a;int *c=b;则a b c 都为100

2021-03-15 14:19:33 60

空空如也

空空如也

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

TA关注的人

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