- 博客(65)
- 收藏
- 关注
原创 嵌入式云平台一些基础概念的理解
我自己的理解就似乎,SDK也就是软件开发工具包,他会为其使用者提供一些封装好的接口,使用者在使用时直接调用想使用的接口就可以去实现相应的功能,无需自己在编写代码。我自己的理解是,IOT就是一个设备平台,通过各种传感器和无线传输技术,将捕捉到的信息上传到特定的服务器或者云中,然后云通过判断这些数据做出一些相应的处理。我们这时候就需要泛化来看这个场景,边缘代理+设备本体是一个物模型,单体的设备本身也是一个物模型,只是单体设备这个物模型是由边缘代理进行管理调度的。->直到一方关闭连接,多是客户端关闭连接。
2023-11-03 08:56:36
348
原创 一些编程规范注意事项
1.说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应 进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的 关系、修改日志等,头文件的注释中还应有函数功能简要说明。1.设计结构时功能结构要单一,不要一个结构实现多个功能,并且每个结构里的功能都是有关联的,弱关联的功能分为一个新的结构里去使用;2.结构中元素的个数应适中。1.:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的 缩写,避免使人产生误解。
2023-11-01 17:47:25
371
原创 SPI通讯简介
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola最先推出的一种同步串行传输规范是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步的串行通信总线SPI有主、从两种模式,通常由一个主模块和一个或多个从模块组成(SPI不支持多主机),主模块选择一个从模块进行同步通信,从而完成数据的交换。SPI通信原理很简单,需要至少4根信号线,单向传输是3根线;
2023-09-27 11:45:21
1916
原创 Boa服务器与Cgi简介
我们想要实现的是网页端下发命令控制A9端,网页端使用的是html,而想要控制a9端则使用的是c语言,想要实现这两种语言的互通就需要借助CGI,CGI会接收html下发的数据并将其转换成A9端可以识别的数据,也可以将A9端的数据转换成html数据供网页端使用。负责html端和cgi互相通信的查找和转发信息,在boa服务器启动后,如果想访问网页端boa就会去其.conf文件里你设定的目录中去查找对应的html文件,cgi文件也是如此。分析数据,并自动校正一些有缺陷的浏览器发来的数据;提供数字字段的边界检查;
2023-08-31 14:55:50
934
原创 Linux设备树简介
减少垃圾代码减轻驱动开发工作量驱动代码和设备信息分离参考Open Fireware设计用来记录硬件平台中各种硬件设备的属性信息。
2023-08-10 13:40:07
325
原创 Linux驱动——input子系统
Linux内核为了两个目的:简化纯输入类外设(如:键盘、鼠标、游戏杆、轨迹球、触摸屏。。。等等)的驱动开发统一输入类外设产生的数据格式(struct input_event),更加方便应用层编程设计了输入子系统事件处理层:接收来自核心层上报的事件,并选择对应的handler(事件处理器 struct input_handler)去处理。内核维护着多个事件处理器对象,每个input_handler对象专门处理一类事件,所有产生同类事件的设备驱动共用同一个handler。
2023-08-10 11:18:44
219
原创 static和volatile关键字的作用
static修饰全局变量时,他的作用域由整个工程都可以使用变成了只能在其所定义的模块中使用,例如我们在将许多个编写好的.c文件编译生成一个可执行文件时,如果这些.c文件中有全局变量定义的名字是相同的,这时候编译就会报错,因为最终要生成的可执行文件不知道要去使用哪个变量。volatile关键字的作用就是告诉编译器该变了是易变得,在编译时不能进行优化,主要使用在arm编程中,防止要读的寄存器中存放的数据由于硬件改变而随之改变后,编译器还按照其优化方式去编译而导致的数据错误。
2023-08-03 18:42:01
630
原创 error: implicit declaration of function ‘xxx’ [-Werror=implicit-function-declar]的解决方法
编译就成功了,并且试了一下声明时加不加extern都是可以编译成功的,也不知道为什么需要再次声明,有懂的大佬也可以为我解答一下。4.这也是我今天遇到的错误原因,头文件没打错,我还去源码中查看了一下这个.h文件结果里面也有对应的声明,后来。而确在引用时不小心敲错或者敲反了几个字母而导致的错误,这种就需要细心程度来降低错误率了。,比如platform_get_resource()函数的头文件引用应该为。,这时只需要找到其对应的头文件并且引用即可,也有可能是。1.首先,最常见的就是我们上面说的使用的。
2023-07-26 14:34:20
4984
1
原创 驱动程序中的原子变量、自旋锁、互斥锁mutex的介绍
的特殊整型变量,他是一种多线程编程中常用的同步机制,它能够确保对共享变量的操作在执行时不会被其他线程的操作干扰,从而避免竞态条件(race condition)和死锁(deadlock)等问题。原子变量可以看作是一种特殊的类型,它具有类似于普通变量的操作,但是这些操作都是原子级别的,即要么全部完成,要么全部未完成。//成功获得自旋锁立即返回,否则自旋在那里直到该自旋锁的保持者释放。//测试addr的第nr位是否为1。自旋锁:他的机制就是他的名字——自旋,也就是一直在获得自旋锁的位置停留直到他被释放。
2023-07-17 12:14:26
329
原创 驱动设备的IOCTL
已知成员的地址获得所在结构体变量的地址:container_of(成员地址,结构体类型名,成员在结构体中的名称)cmd组成dir(direction),ioctl 命令访问模式(属性数据传输方向),占据 2 bit,可以为IOC_NONE、IOC_READ、IOC_WRITE、IOC_READ | _IOC_WRITE,分别指示了四种访问模式:无数据、读数据、写数据、读写数据;
2023-07-16 15:35:10
406
原创 申请和注销设备号的方法
linux的文件种类:-:普通文件d:目录文件p:管道文件s:本地socket文件l:链接文件c:字符设备b:块设备Linux内核按驱动程序实现模型框架的不同,将设备分为三类:字符设备:按字节流形式进行数据读写的设备,一般情况下按顺序访问,数据量不大,一般不设缓存块设备:按整块进行数据读写的设备,最小的块大小为512字节(一个扇区),块的大小必须是扇区的整数倍,Linux系统的块大小一般为4096字节,随机访问,设缓存以提高效率网络设备:针对网络数据收发的设备总体框架图: 内核用设备号来区分同类里不同的设备
2023-07-10 17:16:58
221
原创 字符设备驱动
设备的操作函数如果比喻是桩的话(性质类似于设备操作函数的函数,在一些场合被称为桩函数),则:驱动实现设备操作函数 ----------- 做桩insmod调用的init函数主要作用 --------- 钉桩rmmod调用的exitt函数主要作用 --------- 拔桩应用层通过系统调用函数间接调用这些设备操作函数 ------- 用桩。
2023-06-22 17:55:15
617
1
原创 内核空间与用户空间
为了彻底解决一个应用程序出错不影响系统和其它app的运行,操作系统给每个app一个独立的假想的地址空间,这个假想的地址空间被称为虚拟地址空间(也叫逻辑地址),操作系统也占用其中固定的一部分,32位Linux的虚拟地址空间大小为4G,并将其划分两部分:0~3G 用户空间 :每个应用程序只能使用自己的这份虚拟地址空间3G~4G 内核空间:内核使用的虚拟地址空间,应用程序不能直接使用这份地址空间,但可以通过一些系统调用函数与其中的某些空间进行数据通信。
2023-06-19 20:13:53
1632
原创 内核模块代码解析与模块的传参和依赖
Linux内核的插件机制——内核模块类似于浏览器、eclipse这些软件的插件开发,Linux提供了一种可以向正在运行的内核中插入新的代码段、在代码段不需要继续运行时也可以从内核中移除的机制,这个可以被插入、移除的代码段被称为内核模块。主要解决:单内核扩展性差的缺点减小内核镜像文件体积,一定程度上节省内存资源提高开发效率不能彻底解决稳定性低的缺点:内核模块代码出错可能会导致整个系统崩溃。
2023-06-19 20:13:05
310
原创 向内核模块中添加新功能
即新功能源码与内核其它代码一起编译进uImage文件内新功能源码与Linux内核源码在同一目录结构下给新功能代码配置Kconfig#进入要添加的新功能的同级目录,这里用添加一个名为MY_HELLO的驱动做演示#cd到linux源码中driver文件下的char文件中,修改其Kconfig文件,#在其中可以发现他们长的都差不多,我们在里面添加如下内容,在内容中解析每个都是什么意思config MY_HELLO //添加新功能MY_HELLO。
2023-06-19 20:01:44
332
原创 计算机系统层次结构与操作系统和驱动的定义
狭义的操作系统:给应用程序提供运行环境的裸机程序,也被称为操作系统内核广义的操作系统:一组软件集合,它包含:最核心的一个裸机程序 ----------内核 (kernel)app开发常用的一些功能库(如:C语言标准函数库、线程库、C++标准类库、QT类库等等)一些管理用的特殊app(如桌面、命令行、app包管理器、资源管理器、系统设置、一些常用后台服务程序)英文:Device Driver简称:驱动(Driver)
2023-06-19 19:32:47
858
原创 tftp服务器环境搭建与nfs服务器环境搭建
服务器的工作目录,即客户端要下载的文件需要放到该目录下。服务器的工作目录,即客户端要访问的文件需要放到该目录下。、 打开一个命令行终端,执行如下命令查看是否已安装。、 打开一个命令行终端,执行如下命令查看是已否安装。、 创建服务器工作目录并设置为最高的权限。、 创建服务器工作目录并设置为最高的权限。、 若未安装,执行如下命令安装(确保。、 若未安装,执行如下命令安装(能上网),若已安装直接执行步骤。文件,若获得到则表示安装成功。若显示如下信息表示未安装。),若已安装直接执行步骤。若显示如下信息表示未安装。
2023-06-15 20:14:57
1145
原创 系统移植——将linux系统移植到fs4412上的总结
根文件系统是内核启动后挂载的第一个文件系统,系统引导程序会在根文件系统挂载后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
2023-06-15 20:00:59
687
原创 编译详细过程与交叉编译
而一个程序想在另一个机器上运行就要与他进行适配,就比如我们在linux中使用gcc 生成的文件就只能在X86下运行,如果将其烧到ARM上就无法运行,若想在ARM上运行就需要使用交叉编译工具,也就是编译时要使用arm-none-linux-guneabi-gcc来编译,此时编译的文件才能在ARM下运行。由上图可见,使用gcc编译出的可执行文件实在Intel 80386下也就是x86下才可运行,而使用交叉编译出的可执行文件就是在ARM下运行的可执行文件,在x86下就无法运行了。GCC编译分为四步,
2023-06-11 18:49:03
833
原创 uboot使用基础
使用:mmc read <addr> <blk#> <cnt>使用:setenv 环境变量 环境变量的值。倒计时结束之前按下任意按键。使用:loadb 地址。使用:tftp 地址。
2023-06-11 18:00:24
1047
原创 IIC总线简介及IIC的通信过程与时序
IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线,主要用于近距离、低速的芯片之间的通信;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;IIC总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用。IIC总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生;
2023-06-08 17:12:06
2070
原创 UART帧格式介绍
Universal Asynchronous Receiver Transmitter 即通用异步收发器,是一种通用的串行、异步通信总线 ,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。
2023-06-02 19:35:26
1508
原创 ARM的协处理器指令、伪指令、伪操作以及ATPCS协议
如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈. 按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递.3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回. 4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回. 5.对于位数更多的结果,需要通过调用内存来传递.. 在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。
2023-05-23 17:40:57
1173
原创 ARM的状态传送器指令、软中断指令与协处理指令(软中断具体实现)
Bit[4:0] :不同的电平组合表示不同的模式,[10000]User [10001]FIQ [10010]IRQ [10011]SVC [10111]Abort [11011]Undef [11111]System [10110]Monitor。MRC 将协处理器中寄存器中的数据传送到ARM处理器中的寄存器。MCR 将ARM处理器中寄存器中的数据传送到协处理器中的寄存器。Bit[6]:[0]开启FIQ [1]禁止FIQ。
2023-05-21 13:47:19
978
原创 ARM的读写内存指令与栈的应用
如下图所示,我用大白话形容一下,IA就是先把你要写入的第一条数据先写进R11存放的地址中,然后再将R11的地址增加去存放下一个数据,直到数据全部存完后R11的地址在增加一次指向写入的最后一个数据的下一个地址,IB就是先让R11的地址增加一次,然后再开始写入数据,最后R11的地址会指向所写入的最后一条数据。由其定义可知,我们要操作的地址变成了 基本地址 + 可变地址,如下程序所示,要进行读写操作的内存的地址变成了中括号中的数据的和。原理基本同上,是将R2存放的地址指向的空间中的数据读取到R3寄存器中。
2023-05-20 18:34:33
1664
原创 ARM的基本数据处理指令与条件代码的使用
Bit[30](Z):当运算器中产生了0的结果该位自动置1,否则为0。Bit[31] (N):当运算器中产生了负数的结果该位自动置1,否则为0。
2023-05-19 21:42:54
1282
原创 ARM异常处理
不同的处理器对异常的处理的流程大体相似,但是不同的处理器在具体实现的机制上有所不同;比如处理器遇到哪些事件认为是异常事件遇到异常事件之后处理器有哪些动作、处理器如何跳转到异常处理程序如何处理异常、处理完异常之后又如何返回到被打断的程序继续执行等我们将这些细节的实现称为处理器的异常处理机制。处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生,这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件,异常事件处理完成之后再返回到被异常打断的点继续执行程序。导致异常产生的事件称为异常源。
2023-05-19 10:35:56
1387
原创 ARM处理器概论与组织
能够指示处理器执行某种运算的命令称为指令(如加、减、乘 ...), 指令在内存中以机器码(二进制)的方式存在,每一条指令都对应一条汇编,程序是指令的有序集合,简单来说就是把运算命名便于理解处理器能识别的指令的集合称为指令集,不同架构的处理器指令集不同,指令集是处理器对开发者提供的接口大多数ARM处理器都支持两种指令集:ARM指令集与Thumb指令集所有指令(机器码)都占用32bit存储空间,代码灵活度高、简化了解码复杂度,执行ARM指令集时PC值每次自增4。
2023-05-16 20:26:57
357
原创 计算机硬件基础
CPU能发送的信息的大小与地址总线的宽度有关,比如下面图片的地址总线为2bit,他的处理器的地址空间就是2的2次方也就是4,所以他只能发送二进制的00、01、10、11,也就是只能读取到0x03及其之前的信息,这时我们想要读取0x04中存放的信息是做不到的,如果想读取更多的数据就需要扩宽地址总线。由上图可以看出,外部设备和主存储器的交互大多通过CPU控制的,他们与CPU进行信息传递是需要通过总线来实现,使用DMA总线则可以使主存储器与外部设备的交互不用经过CPU而是在他们俩之间直接进行信息的传递。
2023-05-16 18:13:10
164
原创 linux下网络编程综合项目——在线词典
在线词典,运用c语言与网络编程部分的知识来实现在线的英译英(因为提供的词典为全英文版),在客户端与服务器端连接成功后,客户端输入想查询的单词,服务器端会在词库中寻找这个单词的解释并发送给客户端,从而实现在线查询。
2023-05-15 18:07:59
1769
原创 Linux下的sqlite的几个常用api介绍
下面列出几个简单的api:需要注意的是,在sqlite3的api中二级指针作为参数较为频繁,所以在定义时需要注意其参数的类型。
2023-05-15 15:58:56
207
原创 Linux下的sqlite在命令行中的基本使用
sqlite中没有直接删除一列的命令,所以我们创建一个新表来复制我们要修改的表,再复制时只需要不复制我们想删除的那个字段即可,然后再删除旧表,再把新表的名修改为原来的名字即可。//查询stuinfo表中score字段的值为80的记录。主键是一个特殊的列,它的值必须唯一,并且不能为空。.schema 查看表的结构,也就是查看如何创建的表,范围为数据库中所有的表。在数据库中,主键的作用是保证表中每一行的唯一性,同时也可以用来连接其他表。注意:列名在前,此列所存放的数据的类型在后。3-- 查看数据库记录。
2023-05-10 19:38:11
563
原创 poll和epoll实现IO多路复用
注意这里的第二个参数是结构体的数组,而 ctl 函数里的最后一个参数则是epoll_event的结构体。,epoll_wait 将会把发生被ctl监听的事件对应的文件描述符拷贝到events 数组中。② nfds_t nfds:fds的数量,也就是定义的结构体数组中有多少个fd。epfd: epoll 专用的文件描述符,epoll_create()的返回值。epfd: epoll 专用的文件描述符,epoll_create()的返回值。EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
2023-04-29 23:30:27
158
原创 select实现IO多路复用
select函数参数和返回值:maxfd:监视对象文件描述符数量。readfds:将所有关注“是否存在待读取数据”的文件描述符注册到fd_set变量,并传递其地址值。writefds: 将所有关注“是否可传输无阻塞数据”的文件描述符注册到fd_set变量,并传递其地址值。exceptfds:将所有关注“是否发生异常”的文件描述符注册到fd_set变量,并传递其地址值。timeout:调用select后,为防止陷入无限阻塞状态,传递超时信息。返回值:错误返回-1,超时返回0。
2023-04-27 18:20:54
279
原创 5种IO模型的介绍
什么是IO?IO 是 Input/Output 的缩写,指的是输⼊和输出。在计算机当中,IO 操作通常指将数据从⼀个设备或文件中读取到计算机内存中,或将内存中的数据写⼊设备或文件中。这些设备可以包括硬盘驱动器、网卡、键盘、屏幕等。通常⽤户进程中的⼀个完整I/O分为两个阶段:⽤户进程空间→内核空间内核空间→设备空间I/O分为内存I/O、⽹络I/O和磁盘I/O三种,我们主要介绍网络IOIO操作的两个阶段Linux中进程⽆法直接操作I/O设备,其必须通过系统调⽤请求内核来协助完成I/O操作。
2023-04-26 14:31:48
163
原创 TCP实现可靠传输的原理
源端⼝和⽬的端⼝源端⼝和⽬的端⼝各占 2 字节。端⼝是传输层与应⽤层的服务接⼝;序号序号占 4 字节。TCP 连接中传送的数据流中的每⼀个字节都有⼀个序号,序号字段的值则指的是本报⽂段所发送的数据的第⼀个字节的序号确认号确认号:占 4 字节,是期望收到对⽅的下⼀个报⽂段的数据的第⼀个字节的序号数据偏移数据偏移(即⾸部⻓度):占 4 位,指出 TCP 报⽂段的数据起始处距离 TCP 报⽂段的起始处有多远。单位是 32 位字(以 4 字节为计算单位)保留。
2023-04-25 22:21:29
485
原创 使用UDP实现通信
2. MSG_PEEK:窥视传入的数据。数据被复制到缓冲区中,但不会从输入队列中删除。后两个参数是通信结构体和结构体的宽度,详细使用看最后的代码。3. MSG_OOB:处理带外(OOB)数据。参数与recvfrom基本相同。
2023-04-24 12:47:49
305
原创 Socket套接字和TCP通信的简单实现
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的。
2023-04-20 18:42:29
331
原创 C的简单无管理者线程池
我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设。2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号。通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。1 任务节点,存储需要处理的任务,由工作线程来处理这些任务。,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著。
2023-04-19 12:30:48
45
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人