- 博客(23)
- 收藏
- 关注
原创 CanTp学习记录(待完善)
CanTP位于PDU Router和CAN Interface module之间。CAN TP 模块的主要用途是分段和重新组装长度超过 8 字节的 CAN I-PDU 或长度超过 64 字节的 CAN FD。传输方向的数据分段在接收方向重新组装数据数据流控制检测分段会议中的错误传输取消接收取消尽管 CAN 传输协议主要用于车辆诊断系统,但它的开发也是为了满足其他基于 CAN 的系统对传输层协议的要求。
2024-07-22 15:50:22 728
原创 如何学习数据结构效率更高?
2.文字资料与视频资料,两者结合来学习(严蔚敏老师的《数据结构(C语言版)》以及她录制的一整套数据结构视频资料很不错,另外《大话数据结构》、《数据结构与算法分析》等资料,同时慕课(mooc)上也有很多讲解数据结构和算法的视频资料)这意味着,想要学好数据结构,除了找一套适合自己的学习资料和学习方法外,更要有一种“死磕”的精神,有句话说的很好,“不逼自己一把,永远不知道自己有多大的潜力”。为了删除存有元素 3 的结点,先要找到它的前驱结点,也就是结点 2,并用一个指针 p 来标记;
2022-09-09 01:23:48 497 1
原创 数据结构与算法的区别与联系
关于数据结构,与其说它是一门研究存储数据以及数据之间关系的学科,还可以这样概括:它是一门研究数据存储结构和逻辑结构的学科。通过研究数据的物理结构,可以掌握存储数据的方法;通过研究数据的逻辑结构,可以掌握存储数据之间关系的方法。数据的存储结构有 2 种,分别是集中存储和分散存储。如果想集中存储数据,就选择顺序存储结构;如果想分散存储数据,就择链式存储结构。数据的逻辑结构有 4 种,分别是“无关系”、“一对一”、“一对多”和“多对多”。无逻辑关系的数据可以选用查找表存储结构;
2022-09-09 01:07:38 530
原创 系统调用与库函数的区别
譬如对于文件的操作,我们可以使用open()、read()、write()、close()这些系统调用实现,当然我们也可以使用fopen()、fread()、fwrite()、fgets()、fclose()这些库函数来实现,只有对比了解他们各自的特性我们针对不同的情况作出一个最优的选择。系统调用作为内核提供给用户程序的接口,它的执行效率是比较高效而精简的, 但有时我们需要对获取的信息进行更复杂的处理,或更人性化的需要,我们把这些处理过程封装成一个函数再提供给程序员,更方便于程序猿编码。
2022-08-20 17:37:16 358
原创 结构体对齐
我们知道结构体是一种构造数据类型,里面可以有不同数据类型的成员。在这些成员中,不同的数据类型所占的内存空间是不同的。那么系统是怎么给结构体变量的成员分配内存的呢?或者说这些成员在内存中是如何存储的呢?
2022-08-20 17:06:25 147
原创 static 关键字
我们知道在局部函数定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。即使函数返回,它的值也会保持不变。
2022-08-19 23:38:19 111
原创 MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的”轻量级”通讯协议,MQTT 协议是应用层协议,工作在 TCP/IP 四层模型中的最上层(应用层),构建于 TCP/IP协议上(主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了),由IBM在1999年发布。
2022-08-19 23:16:23 2278
原创 epoll详解
在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术,在大数据、高并发、集群等一些名词唱得火热之年代,select和poll的用武之地越来越有限,风头已经被epoll占尽。那究竟什么是epoll呢?epoll 是 Linux 内核的可扩展 I/O 事件通知机制,其最大的特点就是性能优异。...
2022-07-26 22:16:48 4288
原创 获取数据库空表内容时如何进行判断
在用socket写客户端获取温度时,在获取数据库数据时,由于我将序列号,温度,时间三个变量的类型都设置为 char *类型,此时如果数据库的表为空,我将获取到的数据写到Buf中去,再将Buf的内容打印出来将会得到,“null,null,null”,这种情况我们想判断获取到的内容是否为空,我们只需要判断strlen(Buf)==0?如下图: 然而在我做MQTT温度上报时,我需要从数据库的表中获取三个数据,分别是:ip地址,时间,温度,然而我将变量温度的类型设置为:float类型,这就意味着我再用上次的方法将
2022-07-25 16:56:05 706
原创 程序的编译过程
1.预编译--gcc -E xx.c -o xx.i(预处理器cpp对#做替换:头文件、宏,去掉注释,条件编译)2.编译--gcc -S xx.i -o xx.s(编译器ccl对程序进行语法及词法分析)3.汇编--gcc -c xx.s -o xx.o(汇编器as将汇编代码转换机器码 )4.链接--gcc xx.o -o xx(链接器ld将.o文件链接到一起生成可执行程序).c .i .s 均为文本文件,.o为二进制文件链接的时候需要链接到库,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。静
2022-07-11 17:09:37 2848
原创 进程三态与五态是什么?
进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即就绪态,运行态,阻塞态。在五态模型中,进程分为新建态、就绪态,运行态,阻塞态,终止态。进程状态转换的三态模型:运行态(Running):进程占有处理器正在(Running)运行。即进程正在执行。当时间片结束后,运行态转换为就绪态,等待CPU等资源的分配就绪态(Ready):进程具备运行条件,等待系统分配处理器以便运行。当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立
2022-07-03 23:49:01 2028
原创 什么是内核态和用户态? 内核到用户的转换
用户态和内核态是操作系统的两种运行状态。内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般处于特权级 0 的状态我们称之为内核态。用户态:处于用户态的 CPU 只能受限的访问内存,并且不允许访问外围设备,用户态下的 CPU 不允许独占,也就是说 CPU 能够被其他程序获取。那么为什么要有用户态和内核态呢?这个主要是访问能力的限制的考量,计算机中有一些比较危险的操作,比如设置时钟、
2022-07-03 23:46:30 748
原创 什么是可重入函数, 不可重入函数? 哪些原因导致函数不可重入?
在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。相反,肯定有一个安全的函数,这个安全的函数又叫可重入函数。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。不可重入(non-reentrant)函数
2022-07-03 23:45:34 3585
原创 什么是软链接, 什么是硬链接
指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户 就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和 其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说
2022-07-03 23:42:42 4835
原创 Linux 如何查看磁盘分区大小, 如何查看、修改网卡配置
首先:linux下切换到root用户磁盘 /dev/sda代表系统所具有的硬盘标号,表示系统含有一个系统内部识别为磁盘 /dev/sda的硬盘(就是咱们的磁盘)/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。有tmpfs字样的是临时文件系统,系统断电后数据不保存实际这两个命令具有一样的作用,区别是显示的容量单位不一样,-h就是以适当单位显示,当然也可以直接使用明df -lh。这样我们可以直观的看到当前系统分区(包括交
2022-07-03 23:34:35 5202
原创 内存分配的方式
内存分配有三种方式:一:从全局存储区域(静态存储区)分配:这是内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如:全局变量、static静态变量。二:从栈区分配:在执行函数的时候,函数中的局部变量的存储单元都可以从栈中分配,函数执行结束后这些存储单元都会被自动释放,实现从栈中分配存储单元运算操作内置于处理器的指令集中,效率很高 但是分配的内存容量有限。三:从堆中分配:也称为动态内存分配,在程序运行期间,可以使用malloc和new申请任意数量的内存单元,由程序员决定在什么时候使用free和
2022-07-03 22:49:33 1784
原创 gcc常见选项
(1)-E:只进行预处理(.i)gcc -E demo.c > demo.i :将预处理信息放到.i文件中(2)-S:只激活预处理和编译,就是指把文件编译成为汇编代码。(.s/.S)(3)-c:只激活预处理,编译,和汇编,也就是他只把程序做成obj文件(.o)(4)-o:制定目标名称(5)-g 生成调试信息。GNU 调试器可利用该信息。(6)-I+路径:指定头文件的第三方搜索路径#include “stdio.h”和#include 的区别:搜索路径不同:在系......
2022-07-03 22:38:48 350
原创 简述头文件的作用, 如何解决头文件重复包含导致的问题?
h文件作用:1.方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明;2.使函数的作用域从函数声明的位置开始,而不是函数定义的位置(实践总结);3 .提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h)。4、加强类型检查,提高代码的类型安全性;5、减少代码的重复书写,提高编写和修改程序的效率;4、提供保密和代码复用的手段,用户只需要按照头文件的接口声明来调用库功能,编译器会从库中提取相应的代码。...
2022-07-03 22:36:47 784
原创 每一个变量的地址是什么时候确认的?
谭浩强老先生的《C程序设计》中关于变量名的描述:“变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。”总结:变量名就是编译期存在于编译器中的一个符号地址,编译或链接的时候,编译器或者链接器会给每个变量确定内存地址或偏移,并且通过符号表的方式将变量名和地址的映射关系保存起来,当代码中进行变量访问时,实际上是编译器通过变量名找到对应的内存地址,将变量名操作替换为内存地址操作,运行时程序访问该内
2022-07-03 22:34:15 841
原创 堆与栈的区别?
堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式;(2)数据结构场景下,堆与栈表示两种常用的数据结构。栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。int main(){int b; //栈char s[] = “abc”; //栈char p2; //栈}其中函数中定义的局
2022-07-03 22:31:32 194 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人