- 博客(61)
- 收藏
- 关注
原创 c51 --串口发送与接收数据
电源控制寄存器我们直接给0,波特率不加倍。然后配置一下定时器1,借鉴一下之前的模式,手册就不放了,图比较难截的全,注意这是定时器1,上次是定时器0,位置换一下就行,模式这次是8位自动重装,之前是16位,这俩点变一下就行。然后后面的我们置零,我们现在只发送不接收。所以SCON配置为0100 0000,即0x40;配置串口控制寄存器SCON,工作方式是选的方式1,用8位UART,先把这次要用的文件复制好。然后写好主函数的模板。
2026-03-19 14:18:02
50
原创 OPENHarmony
4.0原版源码+编译产物需要150G内存 编译的结果就是一个系统镜像、SDK、一个模块或者一个应用,一个系统全套编译大概4-5小时。build:subsystem_config.json编译配置文件里面包括了编译的子系统类别,可以经行裁剪。每个文件夹下面必须有一个名为BUILD.gn的文件,按照gn的语法写出该文件夹的编译过程。安装:下载的harmony源码文件里有一个文件,运行则帮你下载安装相关的模块。编译八个过程:预生成 预加载 加载 预生成Gn脚本。build.py build.sh 编译脚本文件。
2026-03-19 14:11:54
51
原创 任务创建(RTOS)
定义就绪列表:List_t pxReadyTaskLists[configMAX_PRIORITIES];32个优先级的就序列表。参数:任务函数,任务名,栈大小,任务形参,优先级,任务句柄,任务控制块,还有个和mpu相关,没用到,传null。参数:任务函数,任务名称,栈大小,任务形参,任务优先级,任务栈起始地址(数组),任务控制块指针。通过vListInsertEnd()函数插入任务到就绪列表末尾。调度器:实现任务的切换,选个优先级高的任务执行。启动调度器:条件编译为1是静态,否则执行动态。
2026-03-18 09:49:58
32
原创 微信小程序初学
整个目录是你的项目文件夹,包括cloudfunctions(云开发环境调用云函数用的)、miniprogram是你的小程序前端页面相关内容包括但不限于components(组件)、images(图片)、pages(前端页面),一个页面文件夹index包括js,json,wxml,wxss四个文件。新建的页面文件包括那四个文件,但是json和js不能是空的,你至少在js里面写一个空函数,在json里面写个空大括号,否则模拟器无法显示你写的wxml页面。在写js函数时里面调用的函数不能用大写字母开头否则报错。
2026-03-18 09:49:33
171
原创 消息队列介绍
队列是一种常用于任务间通信的数据结构,队列可以在任务与任务间,中断和任务间传递消息,实现了任务接受来自其他任务或者中断的不固定长度的消息。支持先进先出FIFO,支持异步读写读写队列都支持超时机制消息支持后进先出方式牌堆,往队首发送消息LIFO可以允许不同长度(不超过队列节点最大值)的任意类型消息一个任务能够从任意个消息队列接收和发送消息多个任务能够从同一个消息队列接受和发送消息队列使用结束后,可以通过删除队列函数进行删除。
2026-03-17 10:06:50
27
原创 信号量简介
信号量是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步或者互斥实现临界资源的保护,信号量可以实现这个功能。二值信号量二值信号量既可以用于临界资源的访问也可以用于同步功能。创建的时候置为空,可以看成只有一个长度为1的队列。引用场景:同步、互斥。计数信号量计数信号量可以被认为长度大于1的队列,信号量使用者依然不必关心存储在队列中的消息,只需要关心是否有消息即可。使用计数信号量时应该置相关宏定义为1.
2026-03-17 10:05:51
150
原创 事件-软件定时器
注意事项:如果有俩定时器(都从零开始计)的任务在同一时间节拍如5000,一个是1000周期,另一个是5000单次,先执行的一个在5000,后执行的可能在5003(5000多几个节拍),如果周期那个后执行,则后面也是整千节拍执行,而不是6003,7003。xTimerStart(),参数1,是创建定时器的句柄,参数2是软件定时器的启动命令,在头文件里面已经有宏定义。时间是一种实现任务间通讯的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。
2026-03-17 10:05:04
288
原创 任务通知(RTOS)
freeRTOS从v8.2.0版本开始提供任务通知这个功能,每个任务都有一个32位的通知值,在大多数情况下,任务通知可以替代二值信号量,计数信号量,事件组,也可以替代长度为1的队列(可以保存一个32位整数或指针值)。xTaskNotifyGive()和vTaskNotifyGiveFromISR()参数1:被通知的任务句柄,参数2:通知值,参数3:通知方式,参数4:返回值。发送通知函数 xTaskGenericNotify()等待任务通知xTaskNotifyWait()任务通知可以代替事件组。
2026-03-17 10:04:01
152
原创 内存、中断管理
freeRTOS中heap1,2,4内存堆的实现是定义了一个大的数组,由编译器决定。特点:适合应用在系统每次申请删除的内存块大小一样的,应用需要调用pvPortMalloc()和vPortFree()来申请释放,而不是调用其他API间接调用。临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。关中断:在portmacro.h中定义,分不带返回值和带返回值两种,不带返回值的关中断函数不能嵌套,不能在中断里面使用。动态:由系统自动分配;
2024-11-10 15:45:16
1009
1
原创 列表的增删改查和遍历
列表的初始化:列表的最后一个列表项是不计入列表项数量的,相当于头结点链表的头结点。(2)值默认初始化为全f。(3)(4)一个项的上下一项都是指向自己,(5)(6)列表项个数初始化为0.剩下两项是初始化列表完整性检查字段。列表遍历过程:从第一个(end->next)开始,如果pxIterm->next不等于end继续遍历,如果等于end则跳过end回到第一个就完成了一次遍历。列表项的初始化只需要把pvContainer初始化为NULL就行,其他函数会初始化如任务创建函数。6. 任务的静态创建。
2023-10-03 17:00:41
766
原创 freertos简介与移植
操作系统的时钟源是滴答定时器,在systick_init里根据芯片时钟初始化操作系统的时钟。基础实验里滴答定时器是APBH的八分频,也就是9MHz,这里要改为72MHz。一个微妙延时函数,两个毫秒延时函数其中ms要引发任务调度,xms不引发任务调度。(普中嗨小易P11)图1(在stm32f10x_it.c文件里面)
2023-10-02 15:30:40
504
原创 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
2395
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
1885
原创 c51--数码管
解释一下消影:为什么会有影子,在位选-段选-位选-段选过程中中间的数据可能会相互影响,下一个段选还没读进来,时显示的就是上一个的数据。所以我们在每一个显示后面,加一个延时1ms,让他显示完全,否则会很暗,再调用下一次时P0 = 0x00会消除段选数据不会有影子。思路:利用人眼视觉看不出,在要显示的各个位置快速显示,就可以达到同时显示的结果,唯一注意的是消影。这边先建立一个全局数组,把段选数字分别存进去,下标0显示0,1显示1,以此类推。思路:P2-P4输入位选,P0,输入字符段选就行。
2022-09-18 10:56:48
481
原创 c51-软件准备
一般使用stc-isp烧录,这个软件虽然少许复杂,但是功能强大,有很多小工具,能自动生成一些代码,适合各种单片机。一般使用keil5或者keil4编写C语言/汇编的程序,在里面会生成Hex文件。也有些商家卖单片机的时候会赠送厂家自主研发的烧录软件。
2022-09-10 10:14:29
244
1
原创 C语言的高级操作
1、内存碎片:在连续申请一个12字节的数据和一个16字节的数据之后,若把12字节的数据释放以后,再次申请就会在16字节后去申请,除非刚好申请12字节,可能会重新利用到。2、malloc函数申请内存从应用层到内核层,在回到应用层,花费大浪时间。基于此种情况,有天才程序猿发明了内存池:把之前用过的内存不用了先放到一边管理好,之后再申请时先看内存池里面有没有,够不够,再去申请内存程序一开始运行就自动定义的三流:标准输出流:stdin标准输入流:stdout标准错误流:stderr可用Linux的重定向
2022-07-07 13:42:15
533
原创 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
616
原创 typedef
typedef给数据类型取别名。可以取多个,与define区分,define是硬性替换,typedef是别名,后者不受运算符优先级影响高阶typedef简化复杂声明
2022-07-05 19:28:09
138
原创 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
114
原创 共用(联合)体
共用体(联合)与结构体区别就是共用体地址是一样的,同一时间只能用一个成员,共用体的占空间大小大于等于成员中最大的数据结构。初始化也只能初始化一个。union 名称{ 成员1; 成员2; 成员3; ...}枚举类型声明enum day{monday,tuesday,wednesday,thursday,friday,saturday,sunday};//这种是枚举常量enum day today;//这个是枚举变量today = monday;//给变量赋值枚举常量对应的数据类
2022-06-24 16:14:58
134
原创 C语言&位域
作用:能把一个字节八个位分开命名并使用,显著提升内存的利用率用处:单片机定义:在结构体定义的时候在成员后边加:写出占的位规定:位域的宽度不能超过所依附的数据类型的长度这里定义的一个结构体,里面a只占2二进制位,b只占1位,整个结构体只占3位,不能超过结构体数据类型长度解释:unsigned int 类型占4个字节,一共32位二进制,你就不能给a赋值占33位。就是没有名字的位域,作用大都是为了调整变量的位置,凑整数整字节支持位域的类型: int、signed int 和 unsigned int,_
2022-06-19 09:53:10
229
原创 【函数的效率】
函数的效率1、用宏定义来替换一些简单的函数以提高效率很明显,这不行,宏定义坑太多,例如上次讲到的运算符优先级问题,就算加了括号还有其他问题,例如如果你是循环迭代调用#define SQUARE(x) ((x)*(x))...int i=0;while(i<=100){ printf("%d\n",SQUARE(i++));//自己试试打印出来是啥,为什么?}.........
2022-06-05 19:20:53
156
原创 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
184
原创 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
147
原创 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
210
空空如也
CSDN写文章无法保存
2026-03-20
微信小程序调用开放平台api报错401?
2025-02-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅