- 博客(51)
- 收藏
- 关注
原创 内存、中断管理
freeRTOS中heap1,2,4内存堆的实现是定义了一个大的数组,由编译器决定。特点:适合应用在系统每次申请删除的内存块大小一样的,应用需要调用pvPortMalloc()和vPortFree()来申请释放,而不是调用其他API间接调用。临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。关中断:在portmacro.h中定义,分不带返回值和带返回值两种,不带返回值的关中断函数不能嵌套,不能在中断里面使用。动态:由系统自动分配;
2024-11-10 15:45:16 620
原创 列表的增删改查和遍历
列表的初始化:列表的最后一个列表项是不计入列表项数量的,相当于头结点链表的头结点。(2)值默认初始化为全f。(3)(4)一个项的上下一项都是指向自己,(5)(6)列表项个数初始化为0.剩下两项是初始化列表完整性检查字段。列表遍历过程:从第一个(end->next)开始,如果pxIterm->next不等于end继续遍历,如果等于end则跳过end回到第一个就完成了一次遍历。列表项的初始化只需要把pvContainer初始化为NULL就行,其他函数会初始化如任务创建函数。6. 任务的静态创建。
2023-10-03 17:00:41 679
原创 freertos简介与移植
操作系统的时钟源是滴答定时器,在systick_init里根据芯片时钟初始化操作系统的时钟。基础实验里滴答定时器是APBH的八分频,也就是9MHz,这里要改为72MHz。一个微妙延时函数,两个毫秒延时函数其中ms要引发任务调度,xms不引发任务调度。(普中嗨小易P11)图1(在stm32f10x_it.c文件里面)
2023-10-02 15:30:40 395
原创 c51 --定时器
乘1000 000结果是1/12us,每12个时钟+1的话就是1/12*12为1us+1。16位最大值是65535,我们让他1ms+1就需要把初值设置为65535-1000=64535。每12个时钟+1,系统是12或者11.0592MHZ,我们用12MHZ估算一下,1/12MHz=1/12000 000秒。我们使用16位定时器的模式,所以M1.M0,取0,1。然后开启中断,EA,ET0全部置1,PT0置0开启中断最高优先级。我们是要使用定时器0,定时器1不管只设置定时器0,
2022-09-22 10:02:27 2002 1
原创 c51--矩阵键盘
模块化就是C语言的多文件编译,通过把一个或者几个功能函数写在其他c文件里,在main.c里面通过应用相应的h文件就可以直接调用功能函数,这样main.c文件不至于复杂冗长。如果没学过可以去B站找一下相关视频(推荐翁恺C语言),或者就地找相关文章,例如这位老哥写得比较完善http://t.csdn.cn/z3pV7。矩阵键盘为了减少I/O口采用的是将按键排列成矩阵形式,按逐行或者逐列扫描就能读出任意按键的按下(同一时间只能按下一个)。matrixkey.c文件(函数写一个就行)matrixkey.h文件。
2022-09-19 17:09:00 1698
原创 c51--数码管
解释一下消影:为什么会有影子,在位选-段选-位选-段选过程中中间的数据可能会相互影响,下一个段选还没读进来,时显示的就是上一个的数据。所以我们在每一个显示后面,加一个延时1ms,让他显示完全,否则会很暗,再调用下一次时P0 = 0x00会消除段选数据不会有影子。思路:利用人眼视觉看不出,在要显示的各个位置快速显示,就可以达到同时显示的结果,唯一注意的是消影。这边先建立一个全局数组,把段选数字分别存进去,下标0显示0,1显示1,以此类推。思路:P2-P4输入位选,P0,输入字符段选就行。
2022-09-18 10:56:48 304
原创 c51-软件准备
一般使用stc-isp烧录,这个软件虽然少许复杂,但是功能强大,有很多小工具,能自动生成一些代码,适合各种单片机。一般使用keil5或者keil4编写C语言/汇编的程序,在里面会生成Hex文件。也有些商家卖单片机的时候会赠送厂家自主研发的烧录软件。
2022-09-10 10:14:29 170 1
原创 C语言的高级操作
1、内存碎片:在连续申请一个12字节的数据和一个16字节的数据之后,若把12字节的数据释放以后,再次申请就会在16字节后去申请,除非刚好申请12字节,可能会重新利用到。2、malloc函数申请内存从应用层到内核层,在回到应用层,花费大浪时间。基于此种情况,有天才程序猿发明了内存池:把之前用过的内存不用了先放到一边管理好,之后再申请时先看内存池里面有没有,够不够,再去申请内存程序一开始运行就自动定义的三流:标准输出流:stdin标准输入流:stdout标准错误流:stderr可用Linux的重定向
2022-07-07 13:42:15 452
原创 C语言文件的操作
如果打开成功则返回指向FILE结构的指针,否则返回null固定错误由于系统换行符与C语言不同,所以要区分文本文件和二进制文件,只有Unix是与C语言一样的,不需要区分文件类型。1.“r” 模式:1、读fgetc(FILE*)读取到unsigned char返回int型,如果文件结束或者遇到错误返回EOF,fgetc()与getc()两个功能一致,区别是fgetc()是一个函数,getc()是宏的实现,宏快一点点,但是宏可能反复调用参数,不能使用有副作用的参数如fp++可能调用后变为fp++++++
2022-07-06 13:21:33 485
原创 typedef
typedef给数据类型取别名。可以取多个,与define区分,define是硬性替换,typedef是别名,后者不受运算符优先级影响高阶typedef简化复杂声明
2022-07-05 19:28:09 97
原创 C语言单链表
单链表结构体->结构体==链表声明struct ListNode{ int data; struct ListNode *next;};建立头结点struct ListNode *head;head->next = NULL;//数据不需初始化申请新节点并插入,这里写头插法struct ListNode *p;p = (struct ListNode*)malloc(sizeof(struct ListNode));p->data = 1;p->ne
2022-06-24 16:15:25 78
原创 共用(联合)体
共用体(联合)与结构体区别就是共用体地址是一样的,同一时间只能用一个成员,共用体的占空间大小大于等于成员中最大的数据结构。初始化也只能初始化一个。union 名称{ 成员1; 成员2; 成员3; ...}枚举类型声明enum day{monday,tuesday,wednesday,thursday,friday,saturday,sunday};//这种是枚举常量enum day today;//这个是枚举变量today = monday;//给变量赋值枚举常量对应的数据类
2022-06-24 16:14:58 92
原创 C语言&位域
作用:能把一个字节八个位分开命名并使用,显著提升内存的利用率用处:单片机定义:在结构体定义的时候在成员后边加:写出占的位规定:位域的宽度不能超过所依附的数据类型的长度这里定义的一个结构体,里面a只占2二进制位,b只占1位,整个结构体只占3位,不能超过结构体数据类型长度解释:unsigned int 类型占4个字节,一共32位二进制,你就不能给a赋值占33位。就是没有名字的位域,作用大都是为了调整变量的位置,凑整数整字节支持位域的类型: int、signed int 和 unsigned int,_
2022-06-19 09:53:10 169
原创 【函数的效率】
函数的效率1、用宏定义来替换一些简单的函数以提高效率很明显,这不行,宏定义坑太多,例如上次讲到的运算符优先级问题,就算加了括号还有其他问题,例如如果你是循环迭代调用#define SQUARE(x) ((x)*(x))...int i=0;while(i<=100){ printf("%d\n",SQUARE(i++));//自己试试打印出来是啥,为什么?}.........
2022-06-05 19:20:53 100
原创 C语言的宏定义
宏定义默认全部用大写字母,以示与普通变量的区分开始从你定义开始#define PI 3.14结束默认到程序结束时结束,可以提前结束,用#undef PI宏定义的嵌套#define R 12#define PI 3.14#define S PI*R*R带参数的宏定义作用与函数类似,但是没有函数那么聪明,他是机械的替换,为了避免因运算符优先级问题造成错误,用宏定义计算的时候尽量加小括号#define MAX(x,y) ((x>y)?(x):(y))不加括号问题举例#
2022-06-05 19:04:55 117
原创 C语言动态内存管理
C语言内存管理四大函数1、malloc函数语法:malloc(你要申请内存空间的大小),默认返回void*型指针,不过为了方便看,返回时转换一下类型char * ptr;ptr = (char *)malloc(sizeof(char)*4);由于malloc函数不会帮你初始化申请的空间,所以需要你自己去初始化,也可以使用(string.h)库函数memset(void*,void,sizeof())进行初始化也可以用2、calloc函数语法与malloc完全一样,唯一的区别就是calloc
2022-06-04 22:12:45 88
原创 C语言的指针函数
可变参数函数可变参数函数需要特定头文件,有特定的格式,请看下例:#include <stdio.h>#include <stdarg.h>//首先引用特定头文件//写一个求和函数int sum(int n,...);//声明&定义 n表示参数个数 ...表示参数不定int sum(int n,...){ int i,sum=0; va_list vap;//加载参数列表 va_start(vap,n);//打开参数列表 for(i=0;i<n;i+
2022-05-26 17:29:25 160
原创 递归的应用
递归函数递归就是函数调用自己,要设置退出条件,否则会一直运行直到耗尽内存空间递归的应用1汉诺塔贴一下用python写的汉诺塔代码,思想是一致的,聪明的你肯定会把他写成C语言的代码吧,所以我就不贴代码咯。汉诺塔代码实现递归的应用2快速排序基本思想:分而治之找一个基准数值(随便定一个,习惯是数组中间那个数),分别从左到右寻找大于基准点的数(i是下标)和从右到左寻找小于基准点的数(j是下标),然后令两个数互换,当i超过j时退出循环,此时数组分为两段,左边全部比右边小,然后对两端数组进行递归直到各
2022-05-21 16:38:40 271
原创 函数与参数
函数C语言的函数需要先声明后定义再使用声明(养成良好习惯,写好函数声明)返回值类型 函数名(参数列表);函数声明末尾分号别忘了。定义返回值类型 函数名(参数列表){ 函数体;}其中返回值类型没有就写void,不写默认返回整型,没有参数可以不写,括号必须写,函数末尾没有分号使用像调用库函数一样写函数名(参数)就行函数名(参数);注意这里的参数是用户传入的实参,上面定义是形参函数参数和指针1、传值void swap(int x,int y){ int temp; t
2022-05-20 18:13:46 71
原创 常量与常量指针
常量一般常量数字,字符,字符串当用const修饰变量后可以把变量变为常量const double pi = 3.14;pi = 3.1415926;//如果你想修改值pi,则会报错指向常量的指针由上可知:用const修饰的指针就是指向常量的指针,不可通过解引用来修改其值。const int a = 520;const int *p = &a;*p = 123;//会报错但是此时可以修改指针p的指向。与之相反,有常量指针意为指针的指向不可改变,如果其指向的是变量则可改变其值
2022-05-19 18:16:45 65
原创 特殊指针的一些应用
指针指针和多维数组指针索引和数组下标索引作用相同int a[2][3]={{1,2,3}, {4,5,6}};int (*p)[3] = a;则a[1][2]==*(*(a+1)+2)==*(*(p+1)+2)==6void指针void指针可以指向任意数据类型,可以用来在任意类型指针之间转换,但是不能直接对void指针解引用。int a = 110;int *pa = &a;char *b = 'bbb';void p;//报错,不能用void 定义变量void *
2022-05-17 16:09:42 58
原创 字符处理函数
C语言字符库函数string.h函数使用1.strlen(str*)这个函数功能是读取字符串的长度,读到第一个’\0’结尾。不包含’\0’,注意与sizeof区分。返回值是一个无符号整数,所以比较字符串大小用大于小于,不要相减看正负。...
2022-05-14 11:28:54 96
原创 ubantu中gcc编译C语言小问题
if else问题与字符的表达式括号中的判断最好不要写成'a'<=ch<='z'反正我那个版本是不行的,用个if else不能正常运行第二个判断最好写成这样'a'<=ch && ch<='z'这是测试代码,这样能正常运行ubantu版本20.04...
2022-04-30 15:14:54 748
原创 scanf()函数与getchar()巅峰相见
继上一篇关于getchar()的文章如果你知道要输入的数字个数可以直接用for循环+scanf()读入
2021-12-28 15:07:59 533
原创 函数传递参数的三种情况
函数传参数我们来写一个两个数交换的函数帮助理解:#include <stdio.h>void myswap1(int x,int y){ int t; t = x; x = y; y = t;}void myswap2(int *p1,int *p2){ int t; t = *p1; *p1 = *p2; *p2 = t;}void myswap3(int &x,int &y){ int
2021-12-12 22:54:03 253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人