![](https://img-blog.csdnimg.cn/4b35cfd61c4c4a70b14a4cc34db26b4c.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
应用开发
文章平均质量分 87
嵌入式Linux开发
苦梨甜
嵌入式全栈ing
展开
-
libjpeg库使用实例细节分析
这段代码是一个使用libjpeg库进行JPEG文件解析的模块。以下是代码的主要功能和结构:MyErrorMgr结构体定义了自定义的错误管理器,用于处理libjpeg库的错误。isJPGFormat函数用于判断给定的文件是否为JPEG格式。它使用libjpeg库的函数来读取文件头并检查是否为有效的JPEG文件。CovertOneLine函数用于将从JPEG文件中提取的一行像素数据转换为可以在显示设备上使用的格式。根据输入和输出的像素位数,它将像素数据转换为24位、16位或32位的格式。原创 2023-06-27 16:08:42 · 838 阅读 · 0 评论 -
标准输入stdin与屏幕输入tslib实例细节分析
其他线程通过调用GetInputEvent函数获取输入数据,线程会在没有输入数据时进入休眠状态,直到输入模块的子线程读取到数据并唤醒它们。总结来说,该函数的作用是从标准输入中读取一个字符,并将输入事件的类型设置为标准输入,时间戳设置为当前时间。此外,还定义了一个名为 g_tTouchScreenOpr 的触摸屏输入模块结构体,并初始化了其中的成员,包括模块名称、设备初始化函数和获取输入数据函数等。GetInputEvent函数用于获取输入数据,它会使当前线程休眠,等待输入模块的子线程读取到数据后唤醒它。原创 2023-06-23 11:31:06 · 336 阅读 · 0 评论 -
FreeType使用实例细节分析
然后,函数计算 GBK 编码值的区位码。该函数的作用是利用 FreeType 库加载指定字符的字形图像,并提取其中的位图信息,包括位置、尺寸、像素位数、行间距和数据缓冲区。这段代码实现了字体管理器的功能,包括注册字体模块、显示支持的字体模块、获取指定字体模块、设置字符尺寸、获取字符尺寸、获取字符位图、设置字体模块信息和初始化字体模块等操作。然后定义了一些静态变量,包括文件描述符 g_iFdHZK,指向字库文件的内存映射指针 g_pucHZKMem,以及指向字库文件结尾的指针 g_pucHZKMemEnd。原创 2023-06-23 11:10:42 · 639 阅读 · 0 评论 -
socket编程应用案例详细分析
pthread_mutex_lock 和 pthread_mutex_unlock 函数用于获取和释放互斥锁,确保在访问共享资源之前和之后的临界区域被正确保护。g_tNetDbgSendConVar 是一个静态变量,被声明为 pthread_cond_t 类型,用于在发送线程和其他线程之间实现等待和唤醒的操作。g_tNetDbgSendMutex 是一个静态变量,被声明为 pthread_mutex_t 类型,用于在发送线程和其他线程之间实现互斥访问。线程首先进入休眠状态,等待被唤醒。原创 2023-06-20 21:33:02 · 630 阅读 · 0 评论 -
Linux下实现自己的printf函数
在函数内部,我们首先使用 va_start 宏初始化一个 va_list 对象,然后使用 vprintf 函数和该对象来输出格式化字符串和参数列表中的值。iNum = vsprintf(strTmpBuf, pcFormat, tArg):使用格式化字符串和可变参数列表将数据格式化到临时缓冲区strTmpBuf中,并返回格式化后的字符串长度。如果当前结构体的isCanUse标志为1,表示该结构体可用,则调用该结构体的DebugPrint函数打印调试信息,传入的参数为pcTmp。原创 2023-06-16 14:33:55 · 981 阅读 · 0 评论 -
mjpg-streamer实现细节分析
如果调整后的格式不受支持,或者请求的格式为MJPEG并且设备不支持MJPEG模式,或者请求的格式为YUV并且设备不支持YUV模式,则打印错误消息,并跳转到fatal标签。将缓冲区 vd->buf 清零,并设置缓冲区的类型为视频捕获 (V4L2_BUF_TYPE_VIDEO_CAPTURE),内存类型为内存映射 (V4L2_MEMORY_MMAP)。如果输入格式为 V4L2_PIX_FMT_MJPEG,检查当前缓冲区的大小是否小于等于 HEADERFRAME1(宏定义的值),如果是,则输出警告信息并返回。原创 2023-05-25 14:01:28 · 1221 阅读 · 0 评论 -
mjpg-streamer框架分析
总体而言,该函数在一个独立的线程中运行,用于接受客户端的连接请求,并为每个连接创建一个新线程来处理客户端请求。其中,根据输入插件名称打开相应的动态链接库,获取插件的初始化、停止和运行函数指针,并调用初始化函数进行初始化。它接受一个整数id作为输入,表示服务器的ID。pthread_detach函数将线程标记为可分离的,这意味着线程的资源将在退出时自动释放,无需等待主线程的显式回收。总体来说,这个函数是一个简单的命令行程序,用于控制输入和输出插件的启动和运行,并提供一些选项来配置程序的行为。原创 2023-05-25 13:55:00 · 1669 阅读 · 0 评论 -
socket聊天室---sqlite3的简单使用
回调函数方法实现的代码,需要实现一个回调函数:callback。函数sqlite3_exec()在解析命令"select * from student" ,每获取到一行数据就会调用一次回调函数。准备sql语句,执行select语句或者要使用parameter bind时,用这个函数(封装 了sqlite3_exec)这个相当于ODBC的Command对象,用于保存编译好的SQL语句。在调用sqlite3_prepare后,使用这个函数在记录集中移动。取text类型的数据。取blob类型的数据。原创 2023-03-06 21:13:19 · 513 阅读 · 0 评论 -
电话号码管理--链表的简单使用
需要注意的是,该函数在释放内存时,必须保证链表中至少有一个节点。注意,该函数删除的是第一个匹配的节点,如果有多个节点匹配,则只删除第一个匹配的节点。删除操作首先将指针 ptr 指向需要删除的节点,然后将链表中该节点的前一个节点的 next 指针指向该节点的后一个节点,即删除该节点。接下来的代码是在链表的尾部插入新节点,它使用一个循环将指针 head 移动到链表的末尾,即指向最后一个节点。这段代码是一个函数,名称为 init,它接收一个指向 PHONE 指针的指针,用于指向一个链表的头节点。原创 2023-03-05 13:46:22 · 470 阅读 · 0 评论 -
socket聊天室--socket的建立
这个套接字与 socket()函数返回的套接字并不同, socket()函数返回的是服务器的套接字(以服务器为例),而accept()函数返回的套接字连接到调用 connect()的客户端,服务器通过该套接字与客户端进行数据交互,譬如向客户端发送数据、或从客户端接收数据。所以,理解 accept()函数的关键点在于它会创建一个新的套接字,其实这个新的套接字就是与执行connect()(客户端调用 connect()向服务器发起连接请求)的客户端之间建立了连接,这个套接字代表了服务器与客户端的一个连接。原创 2023-03-06 21:27:50 · 413 阅读 · 0 评论 -
设备树dtb文件的格式分析
last_comp_version表示向后兼容的版本,17版本向后兼容16版本,所以last_comp_version的值为16。原创 2023-05-11 20:28:51 · 680 阅读 · 0 评论 -
dump_stack分析函数调用关系实例及其实现
在内核态使用的都是 svc mode 的堆栈,那如何把不同线程的堆栈分开呢,实际上内核针对不同线程会分配不同的堆栈地址,而堆栈地址都被存在 task_struct中,这样每次线程调度时就可以把相应的地址设置给 SP 寄存器,由此实现不同内核线程堆栈的切换。kstack_end 是判断是否到达栈底的函数,一个线程堆栈大小为 THREAD_SIZE,SP 寄存器存储的是栈顶,由此可以找到对应的栈底,如果没有到堆栈底部,则每次持续打印出相关的函数调用列表。所以可知使用的是finit_module。原创 2023-05-08 15:08:48 · 1062 阅读 · 0 评论 -
xawtv涉及的vivid系统调用分析
/ 在队列里获得有数据的缓冲区 ret = __vb2_get_done_vb(q, &vb, b, nonblocking);// 获取已完成的缓冲区 // 把它从队列中删掉 list_del(&vb->queued_entry);15.for()ioctl(4, VIDIOC_QUERYCTRL查询属性,如亮度最大,最小值,默认值,对比度等。4.for(){ioctl(4, VIDIOC_ENUM_FMT列举出摄像头支持的格式}// 有那么多缓冲区,APP如何知道哪一个缓冲区有数据?原创 2023-05-07 18:53:17 · 703 阅读 · 0 评论 -
测试虚拟驱动vivi
安装自带vivid及依赖,这里先使用modprobr加载vivid,会将其依赖一并加载,然后再卸载vivid,最后加载上我们编译的vivid.ko。但是在正则表达式去搜索文件定义的时候发现vivid目录下所有文件都没有定义过,所以我直接选择进行出问题的地方进行注释。修改Makefile,也就是加入vivid-cec.o,因为如果不加入的话,会提示缺少符号。1.让VMWAER处于前台,接上USB摄像头,可以看到生成了/dev/video0。在这个网站创建新的sources.list。原创 2023-05-07 18:35:51 · 526 阅读 · 0 评论 -
freetype用法
/ FreeType 库 FT_Face face;// 字体 int error;// 错误码 FT_Vector pen;// 绘制笔 FT_GlyphSlot slot;// 字形插槽 int i;// 循环计数器 FT_BBox bbox;// 字符串边界框 int line_box_ymin = 10000;// 行边界框最小 y 坐标 int line_box_ymax = 0;// 行边界框最大 y 坐标 int line_box_width;原创 2023-05-03 22:31:59 · 1360 阅读 · 0 评论 -
移植Zlib,Libpng,FreeType详细步骤
进入到 zlib 库的安装目录:头文件目录 include 以及库文件目录 lib。至此, zlib 库就已经编译好了,接下来我们需要把编译得到的库文件拷贝到开发板。进入到 libpng 安装目录同样包含了 bin、 include、 lib 这些目录。原创 2023-05-03 22:24:18 · 1108 阅读 · 1 评论 -
文字的显示
数字=>代表什么->显示为什么GBK国标拓展下列代码用不同编码方式保存utf-8.c ansi.cutf-8ansi源文件用不同的编码方式编写,会导致执行结果不一样。怎么解决?编译程序时,要指定字符集font_8x16.cinclude/uapi/linux/fb.h3.显示中文“中”和“A”show_font.c结果原创 2023-05-03 22:13:06 · 720 阅读 · 0 评论 -
根文件系统移植:bulidroot根文件系统搭建详细步骤
使用 busybox 构建文件系统, busybox 仅仅只是帮我们构建好了一些常用的命令和文件,像 lib 库、 /etc 目录下的一些文件都需要我们自己手动创建,而且 busybox 构建的根文件系统默认没有用户名和密码设置。在后续的实验中,我们还要自己去移植一些第三方软件和库,比如 alsa、 iperf、 mplayer 等等。那么有没有一种傻瓜式的方法或软件,它不仅包含了 busybox 的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。原创 2023-04-13 12:52:27 · 992 阅读 · 6 评论 -
驱动代码使用Makefile的宏
EXTRA_CFLAGS替换 KBUILD_CFLAGS_MODULE。KBUILD_CFLAGS_KERNEL编译进内核使用宏。KBUILD_CFLAGS_MODULE编译成模块使用宏。再Makefile中定义DEBUG宏(注意格式+)原创 2023-03-31 18:34:49 · 293 阅读 · 0 评论 -
手把手移植物联网项目到arm开发板笔记
首先我使用的交叉编译器为。原创 2023-03-27 20:37:20 · 756 阅读 · 0 评论 -
交叉编译环境搭建
ARM 裸机、 Uboot 移植、 Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,交叉编译器就是:1、它肯定是一个GCC 编译器。2、这个GCC 编译器是运行在X86 架构的 PC 上的。3、这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯片上运行的交叉编译器有很多种,我们使用 Linaro 出品的交叉编译器。原创 2023-03-26 12:57:33 · 2305 阅读 · 0 评论 -
服务器boa移植
• ServerName:指定服务器的名称,当客户端使用gethostname + gethostbyname时返回给客户端。注意文件www,我的为根目录下,其中为网址界面的html文件,需要自行修改或编写。• DocumentRoot:HTML文件的根目录(也就是网站的目录)。• Group表示连接到服务器的客户端的组,可以是组名或GID。• User:连接到服务器的客户端的身份,可以是用户名或UID。• ScriptAlias:指定脚本路径的虚拟路径(cgi)。打开Ubuntu内的浏览器。原创 2023-03-22 10:27:40 · 501 阅读 · 0 评论 -
目录的操作
说明: readlink()会将参数 path 的符号连接内容存到参数 buf 所指的内存空间, 返回的内容不是以 NULL 作字符串结尾, 但会将字符串的字符数返回. 若参数 bufsiz 小于符号连接的内容长度,过长的内容会被截断. 执行成功则传符号连接所指的文件路径字符串, 失败则返回-1, 错误代码存于 errno.它包含以下字段:d_ino 是文件序列号,d_off 是目录文件开头到此目录项的偏移量,d_reclen 是此记录的长度,d_name 是以空字符结尾的文件名组件。原创 2023-03-21 10:44:50 · 205 阅读 · 0 评论 -
移植mjpg_streamer使其支持拍照功能
如果出现make: Nothing to be done for ‘all’.那么先清理掉之前编译的内容,然后再编译。拍照成功,连拍时,由于我的电脑性能,及其网络环境,连拍太卡,实际连拍一次拍10多张,我这因配置没能体现。拍照保存的照片位于/www/pice。重新打开一个终端来实现拍照功能。执行脚本文件start.sh。下面是修改之后的完整代码。原创 2023-03-18 13:20:06 · 233 阅读 · 1 评论 -
多线程具体实现
修改文件夹下所有文件的权限filename为要修改的文件夹名字。-R应该是表示递归修改filename文件夹下所有文件的权限。其实整个命令的形式是。原创 2023-03-14 20:12:52 · 426 阅读 · 0 评论 -
进程间通信IPC(共享内存,消息队列,信号灯)和信号的具体实现
常用的进程间通信方式• 传统的进程间通信方式无名管道(pipe)、有名管道(fifo)和信号(signal)• System V IPC对象共享内存(share memory)、消息队列(message queue)和信号量(semaphore)• BSD套接字(socket)当前目录下路径指定要加上“.”ftok (“./app”, ‘i’)才可以“./”才是当前路径,“/“根目录路径。原创 2023-03-14 15:32:55 · 208 阅读 · 0 评论 -
正点原子阿尔法IMX6ULL开发板移植mjpg_streamer
mjpg-streamer 是一个命令行应用程序, 可通过网络将 JPEG 文件从网络摄像头流传输到各种类型的查看器, 例如浏览器, mplayer 等其他能够接收 MJPG 流的软件。–prefix=/home/alientek/tools/mjpg/install/: 为上步创建的文件夹路径, 根据实际填写。将.so 文件拷贝到开发板的/lib/目录下, mjpg_streamer 文件夹拷贝到开发板的/bin/目录下, www 拷贝。更据1中安装的MJPG 库目录来,自行修改,下同。原创 2023-03-14 15:14:11 · 559 阅读 · 0 评论 -
进程系统调用
fork()执行后当前进程会被克隆一遍,克隆之后子进程会有一个与原来相同的代码,父进程与子进程之间是独立调度的,即操作系统独立调度父进程和子进程,先调度谁,后调度谁有一定随机性,此处先调度了父进程,父进程看到的是子进程的pid,3518,然后父进程打印自己的pid和ppid,父进程运行完之后进程结束了,操作系统接着调度子进程,调度子进程的时候,也从fork()返回,但子进程看到的pid是0,所以子进程打印else内容,然后打印自己的pid和ppid。在子进程中,这两个变量的值和地址与父进程相同。原创 2023-03-11 21:10:49 · 345 阅读 · 0 评论 -
POSIX文件I/O编程
POSIX是可移植操作系统接口的简写,英文全程是Portable Operating System Interface。最初由IEEE(Institute of Electrical and Electronics Engineers,IEEE)开发,目的是为了提高UNIX环境下的应用程序可移植性。实际上POSIX并不局限于UNIX,只要符合此标准的操作系统的系统调用是一致的,例如Linux和Microsoft Windows NT。POSIX是一组操作系统调用的规范,本节介绍其中的文件I/O编程规范。原创 2023-03-11 20:57:49 · 944 阅读 · 0 评论 -
ANSI C文件管理
本节重点讲解ANSI C文件库。包括文件指针的概念;文件和流之间的关系;文本和二进制文件;和文件的基本操作。ANSI的C标准文件库封装了文件的系统调用,为了提高效率还加入了文件缓冲机制,提供记录的方式读写文件,并且具有良好的可移植性和健壮性,是Linux C语言最基本的文件编程。原创 2023-03-11 20:51:26 · 405 阅读 · 0 评论 -
文件IO常用函数
在LINUX下,有着 一切皆文件的定义,所谓文件IO就是指文件的 输入和 输出。原创 2023-03-11 20:46:39 · 341 阅读 · 0 评论 -
内核链表分析
依此类推,每次插入的新节点都是紧挨着 header_task 表尾,而插入的第一个节点 my_first_task 排在了第一位, my_second_task 排在了第二位,可得出:先插入的节点排在前面,后插入的节点排在后面, “先进先出,后进后出” ,这不正是队列的特点吗(First in First out)!获取下一个宿主结构的地址。我们真正更关心的是包含 list_head 这个结构体字段的宿主结构体,因为只有定位到了宿主结构体的起始地址,我们才能对对宿主结构体中的其它有意义的字段进行操作。原创 2023-03-10 19:41:08 · 716 阅读 · 0 评论 -
搭建Samba服务器
搭建Samba服务器是为了实现Linux共享目录之后,在Windows可以直接访问该共享目录。原创 2023-03-08 16:42:20 · 628 阅读 · 2 评论 -
Linux驱动操作地址(寄存器)的一些方式
让程序跳转到绝对地址是0x100000去执行。对绝对地址0x100000赋值操作。使用typedef可以更直观。原创 2023-03-08 10:14:35 · 1255 阅读 · 0 评论 -
用户空间与内核空间通信方式
get_user和put_user相对于copy_from_user和copy_to_user,这两个函数主要用来完成一些简单类型变量(char、int、long等)的拷贝任务,对于一些复合类型的变量,如数据结构或者数组类型,get_user和put_user函数则无法胜任:函数内部将对ptr所指向的对象长度进行检查,大部分平台只支持长度为1,2,4的变量。get_user将用户空间ptr指向的数据拷贝到内核空间的变量x中,函数如果成功则返回0,否则返回-EFAULT。原创 2023-03-06 22:04:56 · 380 阅读 · 0 评论 -
Linux开发环境配置详细过程--正点原子阿尔法开发板
编辑->虚拟网络编辑器设置->更改设置->添加网络VMnet0并设置为桥接模式->保存后还原默认设置。上述设置后Ubuntu中会有两个网卡的信息,一个用来让Ubuntu上网,另一个用于为开发板提供网络。配置ens38网卡信息与前面虚拟网络编辑器中NAT模式的网卡信息在同一子网下。编辑虚拟机设置->添加->网络适配器->设置添加的网络适配器为NAT模式。设置开发板为sd卡启动,上电启动uboot,进入uboot命令模式。如图所示,网卡ens38让虚拟机上网,ens33为开发板提供网络。重新加载网络配置文件。原创 2023-03-06 21:46:03 · 1936 阅读 · 0 评论