- 博客(40)
- 收藏
- 关注
原创 【无标题】
51单片机拉高电压,释放总线,总线的电压就由18b20的电压决定。开始处于释放状态,主机低电位一段时间,ds一段时间后释放。读暂存存储器,温度转换(44h)、读暂存(BEh),当电流不足时,减小电阻,增加电流,保证双方。上拉电阻保证双方释放总线后,电平是高电平。上拉电阻:在总线接上一个电阻。
2025-06-19 15:08:01
116
原创 嵌入式自学第四十二天
在嵌入式系统中,xdata是Keil C51编译器中的一个存储类型修饰符,用于指定变量存储在外部RAM(Extended Data Memory)而非内部RAM中。内部RAM容量有限(通常为256字节),而外部RAM可扩展至64KB。通过xdata声明变量,可以避免内部RAM空间耗尽。在嵌入式系统中,xdata是Keil C51编译器中的一个存储类型修饰符,用于指定变量存储在外部RAM(Extended Data Memory)而非内部RAM中。
2025-06-18 21:26:03
535
原创 嵌入式自学第四十一天
定时器中断高于外部中断。最大65535,溢出后中断。中断处理:当cpu处理程序时,有另一个任务到来,cpu立刻运行另一个。定时器:里面有自增型计数器。给计数器一个初值,来达到定时中断的作用。为了消影,可以加个初始化,为了完全导通二极管,可以加个延时。中断向量表vector,一个指针数组,保存中断函数地址。51单片机晶振主频:12MHz 、11.0592MHz。中断允许IE:TCON ET0:1 EX0:1。2、cpu检测是否响应中断及中断源是否被屏蔽。每个寄存器有一个地址,可通过地址访问。
2025-06-17 19:10:34
157
原创 嵌入式自学第四十天
:按位与,用途:指定位清零,其他位不变。可以看到四组这个,对应32个引脚,这就是芯片内部四个八位寄存器:p0,p1,p2,p3。reg |= (1 << n) | (1 << m)p2:10010010八位,1为高电平,0为低电平,最低位是21号引脚。st89c51单片机。st89c52:半圆朝上,左上角是1号引脚,右下角是21号引脚。二极管单向导电,竖线一边是负极,当负极是低电平,就导通。
2025-06-16 19:30:21
389
原创 嵌入式自学之网络编程汇总(6.3-6.6 ,6.9)
②监听性能不随着监听描述 符数的增加而增加,是O(1)的,不再是轮询描述符来探测事件,而是由描述符主动上报事件;④ select返回-1表示错误,返回0表示超时时间到没有监听到的事件发生,返回正数表示监听到的所有事件数(包括可读,可 写,异常),通常在处理事件时 会利用这个返回值来提高效率,避免不必要的事件触发检查。*2、作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标的输入、中断信号等等事件,再比如web服务器如nginx,需要同时处理来来自N个客户端的事件。
2025-06-12 16:06:45
1590
原创 数据库学习第一天(6.10)
sqlite> insert into user3 (NULL,'李四',23,datetime('now',‘+8 hours’));///删除id=1 的数据;2、标准SQL语句:===》通用语法在其他平台可以直接使用。////select。///删除表中所有数据。===>用sqlite3 来打开一个名称为test.db的本地数据库。
2025-06-10 17:43:28
832
原创 嵌入式自学第三十一天
文字可以通过字模工具获取要操作的像素点坐标数组,也可以通过字库进行操作,最原始的图像是位图,文件信息中前54字节是头信息,包含图像的大小等参数,剩下的就是连续了BGRBGR像素点数据,我们可以循环取三字节,再倒序就得到RGB参数了,然后输出。else if (vinf.bits_per_pixel == RGB565_FMT) // 16位色模式。si+=0.01) // 0-360度循环。if (vinf.bits_per_pixel == RGB888_FMT) // 32位色模式。
2025-05-29 19:09:50
531
原创 嵌入式自学第三十天(5.28)
v释放sem_post v释放信号量不阻塞+1 二值信号量。mutex互斥锁在进程pcb块,ret 为0说明别人在用,1说明空闲。初始化:int sem_init(,0线程用1进程用,1);请求与保持条件:一个进程因请求资源而阻塞时,对以获得的资源保持不放。定义:pthread_mutex_t mutex;初始化:man pthread_mutex_init。不剥夺条件:进程以获得的资源,未使用完不能强行剥夺。
2025-05-28 20:51:56
715
原创 嵌入式自学第二十九天(5.27)
线程回收:栈区资源回收:int pthread_join(pthread_t thread,void **retval)(1)非阻塞式,代码继续走,能回收就回收,不能回收继续运行程序,但需要判断子程序返回信号,缺点是cpu占有率高。(2)创建:int pthread_create(*新线程线程号,属性(NULL默认8m),函数名,*参数)(6)设置分离属性,与主线程分离,目的线程消亡,自动回收空间,不能调用join回收。//栈区系统自动回收。线程是平级的,创建新线程时默认有一个主线程,新创建的是次线程。
2025-05-27 20:17:56
460
原创 嵌入式自学第二十八天(5.26)
pcb里的退出状态:man wait查看wstatus,正常结束传exit的值,随意写,被信号关闭,传信号值,64个信号。else if (WIFSIGNALED(status)) //异常结束。else if(WIFSIGNALED(status)) //异常结束。if (WIFEXITED(status)) //子进程正常结束。//如果有注册有清理函数,只能调用exit,if(WIFEXITED(status)) //子进程正常结束。
2025-05-26 20:30:58
689
原创 嵌入式自学第二十七天
调度算法:sched 非实时系统(SHCHED_OTHER,batch,idle),实时系统(SCHED_FIFO,rr)一个程序可以运行多次,变成多个进程,比如开启多个终端,一个进程可以运行一个或多个程序比如打开钉钉,聊天直播都被打开。pcb进程控制块,位于kernal(内核),是一个结构体,包含进程标识符、进程状态、内存分配、返回地址等信息。(1)进程:正在运行的程序,会去分配内存空间,并受到cpu的调度。linux中的状态,运行态,睡眠态,僵尸,暂停态。c函数exit()程序结束,资源释放。
2025-05-25 22:29:41
481
原创 嵌入式自学第二十六天(5.22)
time_t a = time(time_t *tloc)传NULL 或者long返回秒数。(5)目录操作:opendir、readdir、closedir。注意:关闭文件采用fclose,因为封装的比没封的功能全一些。printf("目录文件\n");printf("普通文件\n");printf("其他文件\n");printf("块设备\n");(2)文件流转文件描述符:fileno。(3)文件描述符转文件流:fdopen。注意:目录流DIR* dir指向目录。DT_LNK 符号链接,软链接 l。
2025-05-22 18:34:44
646
原创 嵌入式自学第二十五天(5.21)
注意:int fseek(文件流,偏移量,起始位置),位置可以为:SEEK_SET头,SEEK_END结尾, SEEK_CRT经过读写后的当前位置。文件模式:flags:O_REONLY, O_WRONDY, O_RDWR对应位置1。刷新条件:缓冲区满刷新、程序正常结束刷新,fflush刷新 fflush(fp)返回值为0说明读完了,返回值大于零表示读的字节数,返回值-1表示出错。返回写入的字节数,0表示未写入(操作设备时可能未写入),-1表示错。返回读到的字节数,读完后0表示文件读完,-1表示错误。
2025-05-21 18:50:57
624
原创 嵌入式自学第二十四天(5.20)
FILE *是一个文件流指针,包括文件内容、大小、创建时间等等,这里主要用到文件内容。(2)操作系统主要管理硬件,封装了大量接口(大量函数),利用好这些接口就可以实现对硬件的操作。./a.out 1 2 3 4 5 6,函数中参数argv[i]对应的1到6。写w 读写w+目标文件不存在会先创建,已存在会清空原内容。读:fgetc/fgets:前者一次读一个单词,后者一次读一行。写:fputc/fputs:前者一次写一个单词,后者一次写一行。(1)系统编程:包括四部分文件操作、进程、网络、数据库。
2025-05-20 19:25:39
787
原创 嵌入式自学第二十四天
3,完全二叉树,对于一颗有n个结点的二叉树按层序编号,如果编号i(1<=i<=n)的结点于同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这可树为完全二叉树。n个结点的有限集合,集合要么为空树,要么由一个根结点和两棵互不相交,分别称谓根结点的左子树和右子树的二叉树组成。中序,左根右,先从根开始(不是先访问根),从左开始访问,在访问根,在访问右结点。1,斜树,所有的结点都只有左子树,左斜树,所有结点都只有右子树,右树。/* 结点数据 */树的度数是指,这棵树中,最大的结点的度数,称谓树的度数。
2025-05-19 19:20:48
829
原创 嵌入式自学第二十三天
队列是只允许在一段进行插入,而在另一端进行删除操作的线性表。3.判断是否为空栈 IsEmptySeqStack。4.判断是否为满栈 IsFullSeqStack。栈是限定仅在表尾进行插入和删除操作的线性表。2.销毁 DestroySeqStack。允许插入的称谓队尾,允许删除的一端队头。1.创建 CreateSeqStack。5.压栈 PushSeqStack。6.出栈 PopSeqStack。栈底:不允许操作的一端。常用操作,入队,出队。栈顶:允许操作的一端。
2025-05-18 21:32:04
408
原创 嵌入式自学第二十二天(5.15)
int InsertPosDouLinkList(struct DouLinkList*dl,struct DATATYPE*data,int pos)//双向链表指定位置插入元素。int ModifyDouLinkList(struct DouLinkList* dl,char *name,struct DATATYPE* data)//修改元素。int InsertTailDouLinkList(struct DouLinkList*dl,struct DATATYPE*data)//双向链表尾插。
2025-05-15 18:33:44
899
原创 嵌入式自学第二十一天(5.14)
简单的来说,就是将原来单链表中最有一个元素的next指针指向第一个元素或头结点,链表就成了一个环,头尾相连,就成了循环链表。今天还学习了剩下几个链表操作,尾部插入元素、指定位置插入元素、元素替换、和链表清空。n执行下一命令,若有函数,下一命令就是函数执行完的下一命令,s跟进自定义函数。b n.c:行数 :设置断点,运行到这个位置,程序暂停。函数功能,参数介绍,返回值qq。链表, 不需要预先分配,大小可变,动态分配。gcc -g 调试版本,体积大,有源码。
2025-05-14 20:34:42
546
原创 嵌入式自学第二十天(5.13)
为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,除了存储其本身的信息外,还需要存一个指示器直接后续的信息。把存储元素信息的域叫数据域,把存储直接后继位置的域叫指针域。特点:,线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。今天学了链表创建、判断链表是否为空、头插入元素、获取链表长度、遍历链表、查找元素、删除元素,程序如下。如图,链表每个元素都包含数据和指针两部分,指针指向下一个元素,元素间不一定连续存储。
2025-05-13 19:42:56
648
原创 嵌入式自学第十九天
/指定位置插入元素。复杂度:O(1)<O(logn)<O(N)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!例如数组元素的有序性,中间元素前后都有唯一一个元素。如果存在多个元素,首元素无前驱,尾元素无后继,其他元素都有前驱后继。输入命令sudo vi /etc/network/interfaces。
2025-05-12 19:51:34
798
原创 嵌入式自学第十八天(5.9)
Week变量的值只能是列举出的成员值,这些成员值默认从0开始,依次累加,也可以声明时候赋值,但各成员值不能一样,未赋值成员默认为上一成员值加一。3、把每个成员按照声明顺序依次存入内存,偏移量/sizeof(成员)必须能够整除。2、从结构体中的成员查找最大字节成员,最终大小为最大字节整数倍。位运算符:与&,或|,异或^,取反~,左移<<,右移>>。与运算指定位置零,或运算指定位置1,异或运算指定位翻转。右移低位舍弃,高位根据符号位正补0,负补1。此时,成员值是最后一个赋值成员的值。&s->id,左边是地址。
2025-05-09 20:27:29
325
原创 嵌入式自学第十七天(5.8)
void *malloc(size_t size):申请大小为size字节的内存空间,如果申请成功,返回空间首地址,失败就返回空指针。(1)指针函数:返回值是指针的函数。(注意:返回值不能指向局部变量,因为被调函数运行完,局部变量就被销毁,返回值就是野指针了)(7)指针数组:char *s[3] = {"111", "222", "333"},数组元素都是地址。(6)指针的指针:指向指针的地址,可以用于在被调函数中修改主调函数指针的地址。(3)入口地址:函数第一条指令地址,函数的函数名就是入口地址。
2025-05-08 17:31:15
151
原创 嵌入式自学第十六天(5.7)
(1)匿名数组:字符串:它的值是首元素地址,是const char*型,即只读类型,不能通过指针改变元素值。(3)字符串只要一个元素不同,地址就不同,比如"hello"和"hello."地址就不同。(6)数组指针:int(*p)[10]指向长度为10的整型数组的指针。二维数组名相当于指向长度为一维数组长度数组指针,一维数组名相当于指针。指针数组:*p[10]:一次定义了10个指针变量。void *:可以接收任意类型地址,但不能进行指针运算。(4)字符串加一,表示地址值加一个字节。
2025-05-07 17:30:44
191
原创 嵌入式自学第十五天(5.6)
快速排序法:以首元素为基准,从右往左找第一个比基准数小的数,从左往右找第一个比基准数大的数,找到后两个数互换,当地址重合循环终止,交换当前地址元素与首元素,然后以重合元素为分界线,两边分别重复上述操作,直到最后分界线与基准元素重合。*指针变量赋值时,地址运算的变量需要跟指针类型一致,否则会报警,可以通过强制类型转换符来保证类型一致,但这时就存在隐式转换问题要注意。*两个地址加法会报错,减法表示两个地址间的距离,结果是整型,基类型相同才可以相减,否则会报错。*定义函数时,当函数为指针类型时,返回值为地址。
2025-05-06 18:15:26
445
原创 嵌入式自学第十四天
未赋值的指针,不知道指向哪里,直接访问会导致程序崩溃,这就是野指针、疯指针。*在使用取地址&和指针运算符*时,二者可以相互抵消,但*操作数必须是指针。2)头文件在当前文件夹或其他文件夹里: 若在当前文件夹:#include".h头文件",1)头文件在/usr/include/中: #include<.h文件>。如果定义了标识符,if后面的语句输出,否则,else后面的语句输出。跟计算机系统有关:比如64位系统,地址是8字节,所以指针大小8字节。预处理时将标识符换成字符串,并把字符串的参数替换为给定参数。
2025-05-03 15:14:41
307
原创 嵌入式自学第十三天(4.29)
static:1)用来修饰静态局部变量,虽然周期是静态,但作用域还是在函数范围内。2)限制全局变量只在本文件有效。*窗口分割:水平:vsp 文件名,垂直:sp 文件名。解除鼠标限制:set mouse=a。2、全局作用域:在从定义处到程序结束都有效,如函数、全局变量。*编译多个c文件:gcc 文件1 文件2。1、局部作用域:只在花括号内有效,如局部变量。1、定义:变量从被开空间到空间被销毁的过程。*extern:声明变量或函数。静态生存期:变量在程序运行全过程存在。动态生存期:从调用函数到函数结束存在。
2025-04-29 21:43:51
190
原创 自学嵌入式第十二天(4.28)
上例陷入死循环原因就是:函数每次调用都需要往栈里存返回地址,栈的空间是有限的,所以由于死循环导致栈空间耗尽,从而造成程序运行崩溃。*指针大小与硬件有关,cpu有8位、16位、32位、64位,对应n根地址总线,那么指针大小对应就是n/8字节。*由于函数递归调用每次都要入栈出栈操作,所以导致程序运行效率较低,所以循环操作最好用几种循环结构来写。接下来看看两个函数编写练习:atoi与itoa(即字面意思字符转整型,整型转字符)上例就是一个递归调用,但该调用会导致程序运行时陷入死循环,程序会崩溃。
2025-04-28 18:13:35
768
原创 自学嵌入式第十一天(4.27)
(返回地址就是在程序调用完后,回到主调函数的位置地址,这就是出栈,也称回复现场,相应的还有入栈,当进入被调函数前,把当前主调函数执行的地址放入栈区)。*程序运行过程,通过寄存器pc(程序计数器),来指向下一条指令,此时上一条指令正在运行。指向的第一条指令就是函数的入口地址。*函数名最好与函数功能相关,函数要保证低耦合性,不要写入与函数功能不相干的内容。*函数类型需要跟返回值类型一致,如果函数不需要返回值,可以定义为void类型。*函数传递是值传递,所以不能通过被调函数来改变主调函数中变量的值。
2025-04-27 17:55:12
279
原创 嵌入式自学第十天(4.25)
puts函数参数除了可以放一维数组名,也可以放一个字符串,例:char a[][3] = {"112","1wd","12e"},puts(a[2])或者puts("1wd")。(2)初始化:int a[][3] = {1,2,3,4,5,6,7,8,9},这是一个三行三列的整型数组,初始化时行数可以省略,列数不可以省略,如果没初始化必须标明行数。char a[][100] = {"aads","adsa","1234"},定义了字符数组,包含三个数组元素(即字符串),每个数组元素包含若干有效字符。
2025-04-25 18:50:33
159
原创 自学嵌入式第九天(4.24)
4)strcmp(s1,s2):比较两个元素大小,返回值为正则s1大于s2,反之s1小于s2,若等于0,则s1等于s2。3)strcat(s1,s2):将数组s2的元素连到s1后面去。2)strcpy(s1,s2):将s2元素拷贝到s1中去。*补充:a代表数组首元素地址,即字符串首字符地址。初始化:char a[100] = "awdaf";1)strlen(a):获取a的有效字符个数;引用元素:char s = a[i];定义:char a[100];
2025-04-24 18:27:36
415
原创 嵌入式自学第八条(4.23)
5)插入排序:以升序为例:先把第二个元素赋给一个变量,然后变量与第一个对比,如果第二个元素小于变量,就把第一个元素的值赋给第二个,然后把变量值赋给第一个,然后把第三个元素的值赋给变量,变量与第二个元素对比,如果第二个元素大于变量,就把第二个元素的值赋给第三个元素,然后第一个元素跟变量对比,如果第一个元素大于变量,就把第一个元素的值赋给第二个元素,最后变量赋给第一个元素,当某一次比较,变量大一些,就直接把变量赋值给上一次对比的元素,如此反复进行到最后一个元素就完成了升序。*数组大小为元素个数乘元素类型大小。
2025-04-23 20:37:21
1082
原创 自学嵌入式第七天(4.22)
使用break语句,想知道程序是正常结束还是直接跳出循环,可以查看循环变量的值,如果满足循环条件,说明是跳出循环,反之是正常结束。当a < 4时,输出s,然后执行a++,再判断a<4是否成立,成立则输出s,再执行a++,再判断,如此循环。(1)goto循环:给一个语句命名,然后goto 标识符,就可以无条件跳转到标识符处执行后面的语句。*为了避免陷入死循环,循环语句必须包含循环变量初始化,循环条件语句,使循环趋于结束的语句。(6)continue语句:执行后结束所在循环的本轮循环,直接执行下轮循环。
2025-04-22 17:30:34
379
原创 嵌入式自学第六天(4.21)
(逻辑表达式中按照从左到右执行,在与表达式,只要左值为0,整个表达式值为零,不进行后面表达式的计算,在或表达式中,只要左表达式为1,整个表达式的值就为1,不进行后面的表达式计算)if(表达式一){语句一} else if(表达式二){语句二} else{语句三}:表达式一成立执行语句一,表达式二成立执行语句二,否则执行语句三。语句二 :语句三,是一个三目运算符,语句一值为真执行语句二,否则执行语句三。if(表达式){语句一} else {语句二}:表达式逻辑值为1执行语句一,否则执行语句二。
2025-04-21 19:04:30
412
原创 嵌入式自学第一周总结(4.20)
那么什么是Linux发行版呢,这就的谈谈Linux操作系统的发展历史了,在很久很久以前,有人发明了Unix内核,前期开源(就是在教室给人展示查看),后面以版权售卖形式卖给别人,这个内核使用起来很难,韩国奸商就给这个Unix加上外套,可以较为简单使用Unix,众人开始效仿,各种收费版本就出现了,这就是Linux发行版,而GNU组织也制作了一个Linux发行版ubantu,供大家免罚使用,到这大家应该对ubantu有些了解了,当然不用对这些东西钻牛角尖,会使用Linux操作系统就行了。
2025-04-20 23:16:53
1239
原创 自学嵌入式第四天(4.18)
这个肯定溢出了,如果输出会输出-1,原理是这,首先它会从0到32767,还剩下65535-32767=32768.然后相当于循环一样回到-32768,把剩下的32768个数表示,直到最后一个输出,而最后一个就是-1。占位符就是格式符,包括:%d、i、o、u、x、X等。缓冲区:当一个高速设备遇到低速设备,高速设备会等低速设备,造成性能损失,这时候就需要缓冲区,键盘敲入的字符先进入缓冲区,是一个队列数据结构,按回车后CPU就会来处理数据,当数据正确,CPU就会取走数据,数据错误,数据就不会离开缓冲区。
2025-04-18 19:06:45
666
原创 自学嵌入式第三天(4.17)
隐式转换,编译器自动进行,按下表进行,比如’A‘+10自动转Int型,’A‘+10+0.1f自动转化为双精度。自增++自减--:底层逻辑,编译器发现前置加加会把存储空间的值立刻加一,后置加加实际上把i++的值放在临时变量,而i所在存储空间值已经加一了,因此前置效率高一些。ctrl+shift+t可以在终端开另一个窗口,按alt+数字1、2可以切换窗口,保证两个窗口目录一致的前提下,可以一个窗口编代码:w保存后,另一个窗口运行。要背下来,没有捷径。类型是抽象的,变量是具体的,人是抽象的,张三、李四是具体的。
2025-04-17 18:48:18
681
原创 自学嵌入式第二天(4.16)
为什么英雄联盟新英雄很难入手,因为练得少,当你天天玩这个英雄就会熟练掌握了,同理,天天学C语言基础、写代码迟早会熟练掌握的,当你掌握后,就基本不会忘了,就跟英雄一样,过多久都不会忘记它的技能。x = (-1)^s × (1.M) × 2^(E-偏移值),其中,s是符号位,M是尾数(不包括隐含的1),E是阶码,偏移值对于32位浮点数是127,对于64位浮点数是1023。整型在计算机按照补码存储,负数的补码是原码按位取反加一,第一位是符号位不变,正数补码是本身。C语言是面向过程语言,
2025-04-16 18:34:47
749
原创 自学嵌入式第一天(4.15)
身边各方面都涉及嵌入式,包括智能手机、摄像头、冰箱、空调等,这些设备都有一个共同点,低功耗,而arm处理器就符合这个特点,相比之下x86处理器就适合大型设备,比如电脑。编辑文件,vi+文件名。刚进入默认命令模式,输入i进入编辑模式(INSERT),按ESC回到命令模式(NORMAL),输入:w命令保存,:q退出文件,:q!复制粘贴:命令模式,移动光标到要复制的行,按n(行数)yy,表示粘贴n行,将光标移动到要粘贴的位置上一行,按pp,完成粘贴。ls列出当前目录下的内容(白色是文件名,蓝色是文件夹)
2025-04-15 20:06:31
260
空空如也
这个程序结果是什么?
2022-11-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人