- 博客(92)
- 资源 (3)
- 收藏
- 关注
原创 C语言基础之指针详解
C语言指针应用一、指针是什么指针是一个特殊的变量,它存的是内存里的一个地址。指针四要素:1.指针的类型把指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型如下:(1)intp;//指针的类型是int(2)charp;//指针的类型是char(3)intp;//指针的类型是int(4)int(p)[3];//指针的类型是int()[3](5)int*(p)[4]...
2023-07-08 13:06:43 647
原创 Keil报错failed to execute 'd:\Keil\C51\BIN\C51.EXE'
Keil报错failed to execute ‘d:\Keil\C51\BIN\C51.EXE’关于老师发的keil软件报错如下:— Error: failed to execute ‘d:\Keil\C51\BIN\C51.EXE’错误是因为老师直接拷贝的安装目录,里面的TOOLS.INI配置文件仍然保留了他电脑的路径,与你放置Keil的实际路径不符。解决办法:找到自己的keil安装...
2019-04-24 11:47:32 27910 16
原创 C语言基础之链表的最基础的使用
C语言最简单使用链表方法数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素...
2019-04-02 20:41:27 183
原创 Linux 字符设备驱动
write 方法是字符设备驱动中的一个文件操作函数,用于处理用户空间程序通过系统调用 write 向设备文件写入数据时的操作。在字符设备驱动中,write 方法通常用于接收用户空间传递的数据,并进行相应的处理,可能包括将数据写入设备硬件、缓存或内核数据结构中。llseek 方法是字符设备驱动中的一个文件操作函数,用于处理用户空间程序通过系统调用 lseek 对设备文件的文件位置进行定位时的操作。设备注册时,必须注册主设备和次设备号,主设备标这个设备,次设备用作本地设备列表检索。
2023-12-09 20:11:22 134
原创 gPTP协议
车载领域要求网络中设备保持时间同步,不再纠结原因。需要解决以下问题:1、时间基准,即主时钟。2、主时钟定期发布同步信号。3、其他时钟根据同步信号同步自己的本地时钟。同步本地时钟有两方面:a、绝对时间同步,又称为相位同步。(即两个表的指针位置一模一样)b、频率同步。(即两个表的指针转的一样快)
2023-10-22 18:14:30 2264
原创 AUTOSAR Adaptive【一】平台功能架构
Adaptive平台的方法论作为Classsic平台的扩展,引入了新的概念:Adaptive平台是一个面向服务的软件架构(SOA),面向服务的通信统一使用服务接口(ServiceInterface)来定义。服务接口由事件(Events)、方法(Methods)和字段(Fields)组成。与Classsic平台相比, Adaptive平台软件的实例是在进程(Process)的上下文中执行。
2023-10-22 18:02:19 306
转载 System V信号量
System V信号量不是用来在进程间传输数据的,相反,他们是用来同步进程的动作,信号量的一个常见用途时同步对一块共享内存的访问以防止出现一个进程在访问共享内存的同时另一个进程更新这块内存。一个信号量是一个由内核维护的整数,其值被限制为大于或等于0;在一个信号量上可以执行各种操作(即系统调用),包括:将信号量设置为一个绝对值,在信号量的当前值的基础上加上一个数量在信号量当前值的基础上减去一个数量等待信号量的值等于0。
2023-09-21 14:18:53 242
原创 Linux 命令行解析
一般简单的可以直接使用即可。那么负责多变的直接用if else来区分显得乱。那我们我们可以用 Linux 命令行解析函数getopt()、getopt_long()、getopt_long_only()当解析C程序的命令行参数时,使用 argc 和 argv 这两个参数。argc 表示命令行参数的数量,而 argv 是一个字符串数组,包含了这些参数的值。argc 表示命令行参数的数量,而 argv 是一个字符串数组,包含了这些参数的值。通过遍历 argv 数组,可以逐个访问和处理每个参数。
2023-09-15 12:34:43 168
原创 红黑树详情
红黑树是一种自平衡的二叉搜索树,它在整个树保持平衡的同时也具备较快的查找、插入和删除操作的性能。红黑树得名于红色和黑色两种节点的特征。由于红黑树的特性,它被广泛应用于各种数据结构和算法实现中,比如C++ STL中的map和set等。红黑树的自平衡特性使其成为一种高效的数据结构用于存储和访问有序的数据。树的高度保持在对数级别,使得查找、插入和删除操作的时间复杂度都能保持在O(log n)。从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。每个叶子节点(NIL节点或空节点)都是黑色。
2023-09-01 16:20:01 211
原创 Gcc内置原子操作
Gcc 4.1.2版本之后,对X86或X86_64支持内置原子操作。就是说,不需要引入第三方库(如pthread)的锁保护,即可对1、2、4、8字节的数值或指针类型,进行原子加/减/与/或/异或等操作。接口说明内存访问栅,确保所有对内存的操作都完成,防止乱序执行原子获取操作,获取指针 ptr 指向的内存值原子设置操作,如果原值和新值不一样,则设置新值((typeof原子交换操作,如果被设置,则返回旧值,否则返回设置值((typeof。
2023-08-31 20:28:26 733
原创 Linux中的位图(bitmap)
它可以高效地表示大量的布尔值,并且在许多情况下可以提供快速的位操作。例如,一个位图可以用于跟踪某个设备的各个寄存器的状态,每个位对应于一个寄存器,位值表示寄存器的状态。一个32位的整数可以表示32个布尔值,而实际的位图数据结构可能需要更多的存储空间。每个位对应于内存中的一块区域,位值为1表示该区域已被分配,位值为0表示该区域空闲。每个位对应于文件系统中的一个块,位值为1表示该块已被分配,位值为0表示该块空闲。可读性:使用整数来表示位图可能会降低代码的可读性,因为位运算的操作可能不够直观。
2023-08-31 15:35:48 849
原创 C语言函数指针
将函数指针数组的元素类型声明为 void* 是一种常见的做法,因为 void* 是一种通用指针类型,可以用来指向任何类型的数据,包括函数指针。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。如下是常见例子,使用epoll接受数据,将接受的数据传给回调函数,而回调函数是用户定义的,那么用户就是使用接受的数据做业务了。由上可以,函数指针变量,就是一种变量(用于存函数地址),那么变量可使用的形式,函数指针也可。就是存放函数的内存地址的变量。
2023-08-20 10:02:41 307
原创 C++[第五十章]--工厂模式(factory)
工厂模式是用工厂方法代替new操作的一种模式。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量(降低耦合)。
2023-07-31 09:14:22 105
原创 C++[第五十二章]--适配器模式(AdapterPattern)
适配器(Adapter):将不兼容的接口转换成兼容的接口,实现了目标接口,并持有需要适配的对象的引用或指针。目标接口(Target):客户端期望的接口,该接口与现有的类库或第三方库的接口不兼容。需要适配的类(Adaptee):需要被适配的现有类,其接口与目标接口不兼容。客户端(Client):调用目标接口来实现其业务逻辑的应用程序。
2023-07-31 09:14:14 61
原创 C++[第五十一章]--装饰器模式(DecoratorPattern)
装饰器模式是一种结构型设计模式,它允许在运行时动态地添加行为或功能到一个对象上,而无需修改该对象的实现。在C++中,可以使用继承来实现装饰器模式。
2023-07-31 09:14:04 115
原创 C++[第四十九章]--观察者模式(Observer Pattern)
观察者模式(Observer Pattern)是一种行为型设计模式,用于对象之间的一对多依赖关系。当一个对象状态发生改变时,所有依赖它的对象都会收到通知并自动更新。
2023-07-31 09:13:57 53
原创 C++[第四十八章]--策略模式(Strategy Pattern)
上下文(Context):持有一个策略对象,并在需要时调用策略对象的方法。策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们之间可以相互替换,以使得算法的变化独立于使用算法的客户端。策略模式让算法独立于使用它的客户端,具体策略实现类(Concrete Strategy):实现了策略接口,封装了不同的算法实现。策略接口(Strategy):定义了所有具体策略实现类的公共接口。可以在不修改客户端代码的情况下,更换算法或者增加新的算法。
2023-07-31 09:13:09 54
原创 C++[第四十七章]--单例模式
由于Singleton模式的目的是保证一个类只有一个实例,因此该类的构造函数必须是私有的,不能直接被其他代码所调用。因此,Singleton模式的实现方式通常是将类的构造函数设为私有的,并提供一个公有的静态方法来返回类的唯一实例。其他代码只能通过该静态方法来获取该类的实例,而不能直接调用类的构造函数。
2023-07-31 09:13:01 48
原创 C++[第四十六章]--程序设计原则
这样可以使代码更加灵活和可扩展,因为当需要添加新功能时,我们可以通过添加新的子类来扩展程序的行为,而不需要修改现有代码。这个原则指出,一个类应该对扩展开放,对修改封闭。这样可以使代码更加健壮和可维护,因为当需要添加新功能时,我们不需要修改现有代码,只需要添加新的代码即可。这样可以使代码更加可维护和可扩展,因为如果一个类负责的职责过多,当需要修改其中一个职责时,就可能影响到其它职责的代码,导致代码变得复杂难以维护。这样可以使代码更加可扩展和灵活,因为当我们需要添加新的功能时,我们只需要实现需要的接口即可。
2023-07-31 09:12:53 71
原创 C++[第三十七章]--array容器
array 容器以类模板的形式定义在 头文件,并位于命名空间 std 中T 用于指明容器中的存储的具体数据类型,N 用于指明容器的大小,需要注意的是,这里的 N 必须是常量,不能用变量表示在创建 array 容器的实例时,也可以像创建常规数组那样对元素进行初始化。
2023-07-31 09:12:26 68
原创 C++[第三十六章]--序列容器
是一个长度可变的、由 T 类型元素组成的序列,它以双向链表的形式组织元素,在这个序列的任何地方都可以高效地增加或删除元素(时间复杂度都为常数阶 O(1)),但访问容器中任意元素的速度要比前三种容器慢,这是因为 list 必须从第一个元素或最后一个元素开始访问,需要沿着链表移动,直到到达想要的元素。和 vector 非常相似,区别在于使用该容器不仅尾部插入和删除元素高效,在头部插入或删除元素也同样高效,时间复杂度都是 O(1) 常数阶,但是在容器中某一位置处插入或删除元素,时间复杂度为 O(n) 线性阶;
2023-07-31 09:12:17 46
原创 C++[第四十五章]--常见算法函数
find_if_not() 函数和 find_if() 函数的功能恰好相反,通过上面的学习我们知道,find_if() 函数用于查找符合谓词函数规则的第一个元素,而 find_if_not() 函数则用于查找第一个不符合谓词函数规则的元素。可以将前两个正向迭代器参数指定的序列中的元素复制到第三个参数指定的目的序列中,并忽略和第 4 个参数相等的元素。transform() 可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。
2023-07-30 18:29:19 53
原创 C++[第四十四章]--哈希容器(无序关联形容器)
不再以键值对的形式存储数据,而是直接存储数据元素本身(当然也可以理解为,该容器存储的全部都是键 key 和值 value 相等的键值对,正因为它们相等,因此只存储 value 即可)。另外,该容器存储的元素不能重复,且容器内部存储的元素也是无序的。存储键值对 类型的元素,其中各个键值对键的值不允许重复,且该容器中存储的键值对是无序的。1、无序容器内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键,无序容器的底层实现采用的是哈希表的存储结构。
2023-07-30 18:29:11 102
原创 C++[第四十三章]--multimap和set
set 容器存储的各个元素的值必须各不相同。更重要的是,从语法上讲 set 容器并没有强制对存储元素的类型做 const 修饰,即 set 容器中存储的元素的值是可以修改的。但是,C++ 标准为了防止用户修改容器中元素的值,对所有可能会实现此操作的行为做了限制,使得在正常情况下,用户是无法做到修改 set 容器中元素的值的。注意,由于 retSet() 函数的返回值是一个临时 set 容器,因此在初始化 copyset 容器时,其内部调用的是 set 类模板中的移动构造函数,而非拷贝构造函数。
2023-07-30 18:29:03 35
原创 C++[第四十二章]--map
map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。map 容器定义在头文件中,并位于 std 命名空间中。
2023-07-30 18:28:48 66
原创 C++[第四十一章]--关联容器
在存储元素值的同时,还会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C++ 基础数据类型或自定义类型的元素),它的功能是在使用关联式容器的过程中,如果已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。
2023-07-30 18:28:40 39
原创 C++[第四十章]--vector
vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。
2023-07-30 18:28:31 54
原创 C++[第三十九章]--list
双向链表容器,即该容器的底层是以双向链表的形式实现的list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。list 容器中各个元素的前后顺序是靠指针来维系的,每个元素都配备了 2 个指针,分别指向它的前一个元素和后一个元素。其中第一个元素的前向指针总为 null,因为它前面没有元素;同样,尾部元素的后向指针也总为 null。list 容器以模板类 list(T 为存储元素的类型)的形式在头文件中,并位于 std 命名空间中。
2023-07-30 18:28:17 35
原创 C++[第三十八章]--deque容器
deque 容器以模板类 deque(T 为存储元素的类型)的形式在 头文件中,并位于 std 命名空间中。注意:deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。
2023-07-30 18:27:59 37
原创 C++[第三十二章]--小知识3(编译可见性)
使用__attribute__((visibility(“default”)))可以指定动态链接库中符号的可见性为默认,也就是仅在动态链接库内部可见。此外,还可以使用其他的可见性选项,例如hidden和protected等,来进一步限制符号的可见性。我们使用了__attribute__((visibility(“default”)))来将myfunc()的可见性限制在动态链接库内部。
2023-07-29 16:46:24 371
原创 C++[第二十九章]--lambda匿名函数
外部变量方位方式说明符] :[ ] 方括号用于向编译器表明当前是一个 lambda 表达式,其不能被省略,通过捕获列表来确定匿名函数调用时使用哪些外部变量。] 默认以值得形式捕获指定的多个外部变量(用逗号分隔),如果引用捕获,需要显示声明(使用&说明符)noexcept/throw():可以省略,如果使用,在之前的 () 小括号将不能省略(参数个数可以为 0)[=, &x] 变量x以引用形式捕获,其余变量以传值形式捕获。[&, x] 变量x以值的形式捕获,其余变量以引用形式捕获。
2023-07-29 15:05:12 73
原创 C++[第二十八章]--constexpr
我们知道,函数的使用分为“声明”和“定义”两部分,普通的函数调用只需要提前写好该函数的声明部分即可(函数的定义部分可以放在调用位置之后甚至其它文件中),但常量表达式函数在使用前,必须要有该函数的定义。如果 constexpr 修饰的模板函数实例化结果不满足常量表达式函数的要求,则 constexpr 会被自动忽略,即该函数就等同于一个普通函数。想自定义一个可产生常量的类型时,正确的做法是在该类型的内部添加一个常量构造函数。修饰函数的返回值,这样的函数又称为“常量表达式函数”
2023-07-29 15:02:45 48
原创 C++[第二十七章]--auto和decltype
auto 不能作用于类的非静态成员变量(也就是没有 static 关键字修饰的成员变量)中。exp 中调用函数时需要带上括号和参数,但这仅仅是形式,并不会真的去执行函数代码。用法:decltype(exp) varname = value;auto和decltype结合使用得到返回类型。auto 不能在函数的参数中使用。auto 关键字不能定义数组。auto 不能作用于模板参数。
2023-07-29 14:59:54 114
libmodbus-3.1.6
2023-07-08
gsm发送短信
2018-07-02
stm8串口通信
2018-07-02
nrf2410无线通信
2018-07-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人