- 博客(74)
- 资源 (3)
- 收藏
- 关注
转载 动态链接 & 静态链接(区别及优缺点)
1.静态链接与动态链接的区别在C语言中,我们知道要生成可执行文件,要经历预编译、编译、汇编、链接,在链接过程中,静态链接和动态链接就出现了区别。静态链接的过程就已经把要链接的内容已经链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;而动态链接这个过程却没有把内容链接进去,而是在执行的过程中,再去找要链接的内容,生成的可执行文件中并没有要链接的内容,所以当你删除动态库时,可执行程序就不能运行。动态链接生成的可执行文件要比静态链接生成的文件要小一些。2.动态库与静态库的区别就
2022-05-27 15:06:02 4058
原创 电子量产工具:输入系统-输入管理单元测试
软件总框图:输入管理单元测试添加input_test.c,内容如下#include <sys/mman.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <linux/fb.h>#include <fcntl.h>#include <stdio.h>#include <str.
2022-05-11 17:24:13 673
原创 电子量产工具:输入系统-输入管理器-环形缓冲区
软件总框架:输入管理怎样避免丢失数据环形缓冲区图解环形缓冲区实现#define BUFFLEN 20static int g_iRead;static int g_iWrite;static InputEvent g_tInputEvent[BUFFLEN];static int IsInputBufferFull(void){ return (g_iRead == ((g_iWrite + 1) % BUFFLEN));}stati
2022-05-11 15:06:50 241
原创 电子量产工具:输入系统-输入管理器框架
软件总框架输入管理:读取多个设备的数据在工程目录input文件夹下增加input_manager.c,完成输入管理器框架#include "input_manager.h"#include <pthread.h>#include <stdio.h>#include <unistd.h>#include <semaphore.h>#include <string.h>static PInputDe.
2022-05-11 14:12:46 174
原创 数字量产工具:输入系统-网络输入单元测试
软件总框架:网络输入单元测试main 函数:int main(int argc, char **argv){ InputEvent event; int ret; g_tNetinputDev.DeviceInit(); while (1) { ret = g_tNetinputDev.GetInputEvent(&event); if (ret) { printf
2022-05-10 16:10:48 258
原创 数字量产工具:输入系统-网络编程
软件总框架输入系统:网络输入编程需要实现网络输入设备结构体static InputDevice g_tNetinputDev = { .name = "netinput", .GetInputEvent = NetinputGetInputEvent, .DeviceInit = NetinputDeviceInit, .DeviceExit = NetinputDeviceExit,};netinput.c 代码#include...
2022-05-10 14:20:31 460
原创 数字量产工具:输入系统-触摸屏单元测试
软件总框图触摸屏单元测试编写一个main函数,使用下面结构体进行测试static InputDevice g_tTouchscreenDev = { .name = "touchscreen", .GetInputEvent = TouchscreenGetInputEvent, .DeviceInit = TouchscreenDeviceInit, .DeviceExit = TouchscreenDeviceExit,};main函数部分.
2022-05-10 10:14:25 206
原创 数字量产工具:输入系统-触摸屏编程
触摸屏编程部分需要使用tslib实现下方结构体:static InputDevice g_tTouchscreenDev = { .name = "touchscreen", .GetInputEvent = TouchscreenGetInputEvent, .DeviceInit = TouchscreenDeviceInit, .DeviceExit = TouchscreenDeviceExit,};touchscreen.c内容:#includ...
2022-05-09 18:04:07 428
原创 数字量产工具:输入系统-数据结构抽象
总框图:数据结构抽象:1.上报的数据格式#define INPUT_TYPE_TOUCH 1#define INPUT_TYPE_NET 2/* 上报的数据格式 */typedef struct InputEvent{ struct timeval tTime; //加入时间管理 int iType; //网络事件或者触摸事件类型 int iX; //触摸事件x坐标 int iY; //触摸事件y坐.
2022-05-09 16:52:36 449
原创 c语言链表示例
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该
2022-05-09 14:06:28 2409 1
原创 电子量产工具:显示系统-单元测试
1、将代码工程化,添加display、include、unittest文件夹,将相关文件添加进各文件夹,在unittest文件夹新增disp_test.c。2、各级目录添加Makefile,添加后目录结构如下3、编写disp_test.cdisp_test.c#include <sys/mman.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#.
2022-05-08 23:02:06 319
原创 电子量产工具:显示系统-显示管理
总框图显示管理:我们需要在上层代码和底层代码之间抽象出一个管理层代码(disp_manager.c),它的作用如下承上启下 底层将各个模块(LCD或Web DispOpr结构体)注册进disp_manager.c 上层APP选择使用哪个模块(LCD或Web) 可以提供一些函数,比如PutPixel(描点),然后将修改过的区域刷到LCD或Web上disp_manager.c内容:#include "disp_manager.h"/* 链表:管理底层的LCD WEB *
2022-05-08 18:23:27 477
原创 电子量产工具:显示系统-Framebuffer编程
1、实现DispOpr结构体首先需要实现DispOpr结构体/* *可以返回LCD的Framebuffer,以后上层APP可以直接操作LCD,可以不用FbFlushRegion *也可以malloc返回一块无关的buffer,要使用FbFlushRegion */static char *FbGetBuffer(int *pXres, int *pYres, int *pBpp){}static int FbFlushRegion(PRegion ptRegion, char
2022-05-08 13:13:07 340
原创 电子量产工具:显示系统-数据结构抽象
软件总框架:使用场景目的:1、上层APP在这个Buffer中绘制图片2、可以更新某个区域,比如“按钮2”.然后将该区域Flush到LCD或者web上。需要抽象出的内容:name:通过名字取得不同的结构体(比如:Framebuffer或者web显示) GetBuffer:绘制图片,需要获得一个buffer,返回内存的起始地址,还可以得到分辨率和每个像素的位数 FlushRegion:刷新区域,比如按钮2 ptNext:可能支持多个输出设备(Framebuffer或者web显示)
2022-05-08 11:18:05 305
原创 使用 FFmpeg 推流,使用 VLC 软件进行拉流
1、移植Nginx到开发板,使用 Nginx 来搭建 RTMP 流媒体服务器。2、执行如下命令进行推流:ffmpeg -re -i /run/media/mmcblk1p1/testVideo.mp4 -c:av copy -f flv rtmp://192.168.0.126/live/mytest-i 表示输入视频数据,这里我们使用了一个 mp4 视频文件;rtmp://192.168.0.126/live/mytest 表示将视频流通过 RTMP 推给流媒体服务器,这里因.
2022-05-06 18:48:30 4582
原创 FFmpeg移植到IMX6ULL arm开发板(含x264编译步骤)
1、FFmpeg简介FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。主要功能:视频采集功能 视频格式转换功能 视频截图功能 给视频加水印功能2、编译ffmpeg中已有H.264的解码,但没有编码,所以需要先编译libx264,它是自由的H.264编码库,是x264项目的一部分。2.1 编译x264源码下载地址:Index of /pub/videolan/x264/snapshots/解压、配置、编译过程如下:1、tar -vx
2022-05-06 16:44:11 2445 2
转载 scp命令使用方法
scp命令是用于通过 SSH 协议安全地将文件复制到远程系统和从远程系统复制文件到本地的命令。使用 SSH 意味着它享有与 SSH 相同级别的数据加密,因此被认为是跨两个远程主机传输文件的安全方式。 基本语法下面提供了 SCP 命令的基本语法:$ scp [option] /path/to/source/file user@server-ip:/path/to/destination/directory/path/to/source/file– 这是打算复制到远程主机的源文件。...
2022-04-26 19:03:11 10679
原创 正点原子IMX6ULL开发板设置静态IP
正点原子IMX6ULL开发板出厂时每次都会自动获取IP,需要启动时使用固定的ip,可以采用下述方法设置静态ip。1、vi /etc/rc.local2.在下面位置添加以下内容,ip需要根据自己的路由器和实际情况设置。PATH=/sbin:/bin:/usr/sbin:/usr/binifconfig eth0 192.168.0.24 netmask 255.255.255.0route add default gw 192.168.0.1echo "nameserver 114.114.
2022-04-26 13:46:56 3283
原创 正点原子IMX6ULL开发板禁用出厂QT界面
正点原子IMX6ULL开发板出厂时自动开启QT的GUI界面,在测试时如果需要关闭GUI界面可以采用如下操作。1.vi /etc/rc.local2.将以下三行加#屏蔽,需要开启时,去除#即可#/opt/qt5.5.1/apps/pointercals/auto-cover-pointercal.sh#source /etc/profile#/opt/qt5.5.1/apps/QDesktop/QDesktop >/dev/null 2>&1 &..
2022-04-26 12:51:19 2271
原创 Linux 应用编程之stat 函数
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat(const char *pathname, struct stat *buf);pathname:用于指定一个需要查看属性的文件路径。 buf:struct stat 类型指针,用于指向一个 struct stat 结构体变量。调用 stat 函数的时候需要传入一个 struct stat 变量的指针,获取到的文件..
2022-04-22 12:03:50 3929
原创 Linux 应用编程之fseek()、ftell()函数
1、fseek()函数库函数 fseek()用于设置文件读写位置偏移量。#include <stdio.h>int fseek(FILE *stream, long offset, int whence);stream:FILE 指针。 offset:偏移量,以字节为单位 whence:用于定义参数 offset 偏移量对应的参考值,该参数为下列其中一种(宏定义):⚫ SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算);⚫ SEEK_CUR
2022-04-22 11:21:44 2192
原创 Linux应用编程之fopen()、fclose()、fread()、fwrite()函数
1、fopen()函数调用fopen()函数可以打开或创建一个文件。#include <stdio.h>FILE *fopen(const char *path, const char *mode);path:参数 path 指向文件路径,可以是绝对路径、也可以是相对路径。 mode:参数 mode 指定了对该文件的读写权限,是一个字符串。 返回值:调用成功返回一个指向 FILE 类型对象的指针(FILE *),该指针与打开或创建的文件相关联, 后续的标准 I/O 操作将围绕
2022-04-22 10:37:24 6046
原创 Linux应用编程之截断文件
使用系统调用 truncate()或 ftruncate()可将普通文件截断为指定字节长度。#include <unistd.h>#include <sys/types.h>int truncate(const char *path, off_t length);int ftruncate(int fd, off_t length);这两个函数的区别在于:ftruncate()使用文件描述符 fd 来指定目标文件,而 truncate()则直接使用文件路 径 path
2022-04-21 19:24:56 1623
原创 Linux应用编程之fcntl函数
fcntl()函数可以对一个已经打开的文件描述符执行一系列控制操作,譬如复制一个文件描述符(与 dup、 dup2 作用相同)、获取/设置文件描述符标志、获取/设置文件状态标志等,类似于一个多功能文件描述符管理工具箱。#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ )fd:文件描述符。 cmd:操作命令。此参数表示我们将要对 fd 进行什么操作,cmd
2022-04-21 19:00:47 1829
原创 Linux应用编程之dup函数和dup2函数
在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限,譬如使用旧的文件描述符对文件有读写权限,那么新的文件描述符同样也具 有读写权限;在 Linux 系统下,可以使用 dup 或 dup2 这两个系统调用对文件描述符进行复制。我们来学习下两个函数的用法以及它们之间的区别。复制得到的文件描述符与旧的文件描述符都指向了同一个文件表,.
2022-04-21 16:28:08 2890
原创 Linux应用编程之多次打开同一文件进行读写操作与 O_APPEND 标志
重复打开同一个文件,进行写操作,譬如一个进程中两次调用 open 函数打开同一个文件,分别得到两 个文件描述符 fd1 和 fd2,使用这两个文件描述符对文件进行写入操作,那么它们是分别写(各从各的位置 偏移量开始写)还是接续写(一个写完,另一个接着后面写)?因为这两个文件描述符所对应的读写位置偏移量是相互独立的,所以是分别写。示例代码:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>.
2022-04-21 15:43:01 1615
原创 Linux应用编程之多次打开同一个文件
同一个文件可以被多次打开,譬如在一个进程中多次打开同一个文件、在多个不同的进程中打开同一个文件。⚫ 一个进程内多次 open 打开同一个文件,那么会得到多个不同的文件描述符 fd,同理在关闭文件的时候也需要调用 close 依次关闭各个文件描述符。多次打开同一个文件测试代码 1#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#..
2022-04-21 12:56:30 3697
原创 Linux 应用编程之O_APPEND标志
如果 open 函数携带了 O_APPEND 标志,调用 open 函数打开文件, 当每次使用 write()函数对文件进行写操作时,都会自动把文件当前位置偏移量移动到文件末尾,从文件末尾开始写入数据,也就是意味着每次写入数据都是从文件末尾开始。示例代码:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include &.
2022-04-21 11:27:40 1098
转载 Linux创建指定大小文件
概述: 日常工作做我们需要创建大文件来满足日常测试等一些需求,那么有哪些方法呢?我们以创建10M大小文件来做示范:(1)fallocate 命令生成方法:fallocate -l 10000000 test.log(2)truncate 命令生成方法:truncate -s 25M test.log(3)dd 命令生成方法: dd if=/dev/urandom of=test.log bs=10MB count=1 dd if=/...
2022-04-21 09:48:47 5563
原创 Linux应用编程之O_TRUNC 标志
O_TRUNC 这个标志的作用非常简单,如果使用了这个标志,调用 open 函数打开文件的时候会将文件原本的内容全部丢弃,文件大小变为 0。示例代码:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <string.h>#include <stdlib.
2022-04-21 09:44:25 11427
原创 Linux应用编程之空洞文件
空洞文件(hole file)的描述:使用 lseek 可以修改文件的当前读写位置偏移量,此函数不但可以改变位置偏移量,并且还允许文件偏移量超出文件长度,这是什么意思呢?譬如有一个 test_file,该文件的大小是 4K(也就是 4096 个字节),可以通过 lseek 系统调用将该文件的读写偏移量移动到偏移文件头部 6000 个字节处。接下来使用 write()函数对文件进行写入操作,也就是说此时将是从偏移文件头部 6000 个字节处开始写 入数据,也就意味着 4096~6000 字节之间.
2022-04-20 23:06:35 1808
原创 Linux应用编程之exit、_exit、_Exit函数
当程序在执行某个函数出错的时候,如果此函数执行失败会导致后面的步骤不能在进行下去时,应该在出错时终止程序运行,不应该让程序继续运行下去,那么如何退出程序、终止程序运行呢?有过编程经验的 读者都知道使用 return,一般原则程序执行正常退出 return 0,而执行函数出错退出 return -1。在 Linux 系统下,进程正常退出除了可以使用 return 之外,还可以使用 exit()、_exit()以及_Exit()。#include <unistd.h>void.
2022-04-20 22:24:40 378
原创 Linux应用编程之perror函数
调用此函数不需要传入 errno,函数内部会自己去获取 errno 变量的值,调用此函数会直接将错误提示字符 串打印出来,而不是返回字符串,除此之外还可以在输出的错误提示字符串之前加入自己的打印信息。#include <stdio.h>void perror(const char *s);s:在错误提示字符串信息之前,可加入自己的打印信息,也可不加,不加则传入空字符串即可。返回值:void 无返回值。示例代码:#include <sys/types.h&g
2022-04-20 22:04:14 1678
原创 Linux 应用编程之strerror函数
linux 下多点电容触摸驱动的编写框架和步骤。需要用到以下知识点和框架。①、多点电容触摸芯片的接口,一般都为 I2C 接口,因此驱动主框架肯定是 I2C。 ②、linux 里面一般都是通过中断来上报触摸点坐标信息,因此需要用到中断框架。 ③、多点电容触摸属于 input 子系统,因此还要用到 input 子系统框架。 ④、在中断处理程序中按照 linux 的 MT 协议上报坐标信息。多点电容触摸驱动编写框架以及步骤如下:1、I2C 驱动框架 驱动总体采用 I2C..
2022-04-20 21:50:51 1013
原创 Linux Regmap API 重要知识点
基于代码复用的原则,Linux 内核引入了 regmap 模型,regmap 将寄存器访问的共同逻辑抽 象出来,驱动开发人员不需要再去纠结使用 SPI 或者 I2C 接口 API 函数,统一使用 regmapAPI函数。这样的好处就是统一使用 regmap,降低了代码冗余,提高了驱动的可以移植性。regmap 模型的重点在于: 通过 regmap 模型提供的统一接口函数来访问器件的寄存器,SOC 内部的寄存器也可以使 用 regmap 接口函数来访问。regmap 是 Lin.
2022-04-20 11:08:39 794
原创 Linux I2C 驱动示例
I2C 是很常用的一个串行通信接口,用于连接各种外设、传感器等器件。1、Linux I2C 驱动框架Linux 内核将 I2C 驱动分为两部分: ①、I2C 总线驱动,I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。 ②、I2C 设备驱动,I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动一般 SOC 的 I2C 总线驱动都是由半导体厂商编写的,设备驱动开发者只要专注于 I2C 设备驱动即可。I2C 设备驱动重点关注两个数据结构:i.
2022-04-19 13:16:28 1861
原创 Linux input子系统驱动示例
input 就是输入的意思,因此 input 子系统就是管理输入的子系统。比如按键输入、键盘、鼠标、触摸屏等 等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息, 鼠标和触摸屏代表坐标信息,因此在应用层的处理就不同,对于驱动编写者而言不需要去关心应用层的事情,我们只需要按照要求上报这些输入事件即可。input 子系统分为 input 驱动 层、input 核心层、input 事件处理层,最终给用户空间提供可访问的设备节点,input 子系统框 架如图所示:
2022-04-18 19:38:27 416
原创 Linux MISC驱动示例
misc 的意思是混合、杂项的,因此 MISC 驱动也叫做杂项驱动,也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。MISC 驱动其实就是最简单的字符设备驱动,通常嵌套在 platform 总线驱动中,实现复杂的驱动。1、misc_register函数以前我们需要自己调用一堆的函数去创建设备,比如在以前的字符设备驱动中我们会使用如下几个函数完成设备创建过程:1 alloc_chrdev_region(); /* 申请设备号 */2 cdev_init()..
2022-04-18 18:48:20 516
网上学单片机入门最好教程
2013-06-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人