当前位置: 首页 > news >正文

量产工具——复习及改进(后附百问网课程视频链接)

目录

一、函数的使用

1.显示系统

 1.1 mmap函数

2.输入系统 

2.1 ts_setup()函数

2.2 ts_read()函数

2.3 socket()函数

2.4 bind()函数

2.5 recvfrom()函数

2.6 inet_aton()函数

2.7 sendto()函数

 2.8 pthread_create()函数

  2.9 pthread_cond_signal()函数

 2.10 pthread_mutex_lockl()函数

 3.文字系统

3.1 笛卡尔坐标系转换为LCD坐标系

3.2 atol()函数

二、错误记录

三、改进

3.1 按钮文字

3.2 支持配置文件的command

课程链接


一、函数的使用

1.显示系统

 1.1 mmap函数

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
  • 入参
    • addr: 入参,如果这个地址为null那么内核将自己为你指定一个地址,如果不为null,将使用这个地址作为映射区的起始地址;
    • length: 映射区的大小(<=文件的大小);
    • prot: 访问属性,一般用PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE;
    • flags:这个参数是确定映射的更新是否对映射相同区域的其他进程可见,以及是否对基础文件进行更新;
    • MAP_SHARED: 共享此映射,映射的更新对映射相同区域的其他进程可见;
    • MAP_PRIVATE: 创建写时专用拷贝映射,映射的更新对映射的其他进程不可见,相同的文件,并且不会传递到基 础文件。 我们一般用MAP_SHARED,这两个权限是限制内存的,而不限制文件;
    • fd: 被映射的文件句柄;
    • offset: 默认为0,表示映射文件全部。偏移未知,需要时4K的整数倍。
  • 返回值
    • 成功:被映射的首地址;
    • 失败:MAP_FAILED (void *)-1。

2.输入系统 

2.1 ts_setup()函数


struct tsdev *ts_setup(const char *dev_name, int nonblock)
  • 入参
    • dev_name:指定了触摸屏的设备节点,当 dev_name 设置为 NULL 时, ts_setup()函数内部会读取TSLIB_TSDEVICE 环境变量, 获取该环境变量的内容以得知触摸屏的设备节点;

    • nonblock:表示是否以非阻塞方式打开触摸屏设备。

  • 返回值
    • 成功,返回一个 struct tsdev *指针, 指向触摸屏设备句柄;
    • 失败,将返回 NULL。

2.2 ts_read()函数

struct ts_sample {int x; //X 坐标int y; //Y 坐标unsigned int pressure; //按压力大小struct timeval tv; //时间
};
int ts_read(struct tsdev *ts, struct ts_sample *samp, int nr);
  • 入参
    • ts :指向一个触摸屏设备句柄;

    • samp:指向一个 struct ts_sample 对象;

    • nr :表示对一个触摸点的采样数

2.3 socket()函数

int socket(int domain, int type, int protocol);
  • 入参
    • domin : 用于指定一个通信域,这将选择将用于通信的协议族;

    • type:参数 type 指定套接字的类型;

    • protocol :参数 protocol 通常设置为 0,表示为给定的通信域和套接字类型选择默认协议。

  • 返回值
    • 成功,返回用于文件 I/O 的文件描述符;
    • 失败,会返回-1

2.4 bind()函数

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 入参
    • sockfd : 一个已打开的套接字的描述符;

    • addr:是一个指针,指向一个 struct sockaddr 类型变量,但是一般使用下面结构体;

      struct sockaddr_in {sa_family_t sin_family; /* 协议族 */in_port_t sin_port; /* 端口号 */struct in_addr sin_addr; /* IP 地址 */unsigned char sin_zero[8];
      };
    • addrlen:指定了 addr 所指向的结构体对应的字节长度。

  • 返回值
    • 成功,返回0;
    • 失败,返回-1

2.5 recvfrom()函数

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
  • 入参
    • sockfd:一个已打开的套接字的描述符;

    • buf:一个指针,指向用于存放接收到的数据的缓冲区;

    • len:缓冲区的大小(以字节为单位)。

    • flags:控制接收行为的标志,通常可以设置为0;

    • src_addr:一个指针,指向一个 sockaddr 结构,用于保存发送数据的源地址。

    • addrlen:一个值-结果参数。开始时,它应该设置为 src_addr 缓冲区的大小。当 recvfrom() 返回时,该值会被修改为实际地址的长度(以字节为单位)。

  • 返回值
    • 在成功的情况下,recvfrom() 返回接收到的字节数。
    • 如果没有数据可读或套接字已经关闭,那么返回值为0。
    • 出错时,返回 -1,并设置全局变量 errno 以指示错误类型。

2.6 inet_aton()函数

int inet_aton(const char *cp, struct in_addr *inp);
  • 入参
    • cp:网络主机地址ip(如192.168.1.10)为二进制数值;

    • inp:存储在struct in_addr结构中;

  • 返回值
    • 成功,返回非0;
    • 出错时,返回0。

2.7 sendto()函数

1 int sendto(int s, const void *buf, int len, unsigned int flags, 
2         const struct sockaddr *to, int tolen);
  • 入参
    • s:     socket描述符;

    • buf:UDP数据报缓存区(包含待发送数据);

    • len:  UDP数据报的长度;

    • flags:调用方式标志位(一般设置为0);

    • to:  指向接收数据的主机地址信息的结构体(sockaddr_in需类型转换);

    • tolen:to所指结构体的长度;

  • 返回值
    • 成功则返回实际传送出去的字符数;
    • 失败返回-1,错误原因会存于errno 中。

 2.8 pthread_create()函数

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
  • 入参
    • thread:用于存储新线程标识符的变量;

    • attr:用于设置新线程属性的指针,通常可以传入NULL以使用默认属性;

    • start_routine:  新线程的入口函数,是线程执行的起点;

    • arg:传递给入口函数start_routine的参数.

  • 返回值
    • 若线程创建成功,返回0。
    • 若线程创建失败,返回非0的错误码。

  2.9 pthread_cond_signal()函数

int pthread_cond_signal(pthread_cond_t *cond);
  • 入参
    • cond:条件变量

  • 返回值
    • 成功:返回0;
    • 失败:返回非0。

 2.10 pthread_mutex_lockl()函数

int pthread_mutex_lock(pthread_mutex_t *mutex);
  • 入参
    •  mutex :是一个指向互斥锁变量的指针。

  • 返回值
    • 成功:返回0;
    • 失败:返回非0。

 3.文字系统

3.1 笛卡尔坐标系转换为LCD坐标系:

LCD_y = LCD垂直高 - 笛卡尔_y;
LCD_x = LCDx;

3.2 atol()函数

long atol(const char *nptr);

函数说明

atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。

返回值

返回转换后的长整型数。

附加说明

atol()与使用strtol(nptr,(char**)NULL,10);结果相同。

二、错误记录

对于while循环中的赋值要谨慎,不然就会出现段错误

上面的代码中

g_DispDevs = pTmp;

应该为

g_DispDefault = pTmp;

三、改进

3.1 按钮文字

        计算文字大小

1.找出name最长的Button

1.以font_size = 100,算出它的外框

1.把文字的外框缩放为Button的外框

1.反算出font_size,只取0.80,避免文字过于接近边界

        计算文字外框

static int FreetypeGetStringRegionCar(char *str, PRegionCartesian ptRegionCartesian)

         算出第一个字符的origin

 

3.2 支持配置文件的command

        sprintf()函数:用来作格式化的输出。

#include <stdio.h> //头文件
int sprintf(char* str, const char* format, ...);
  • 入参
    •  str:指向要写入的字符串的指针。

    • format:包含格式控制符的字符串,用于指定输出的格式。

    • ...:可变参数列表,根据格式化字符串中指定的格式进行输出

 

 system()函数

        在Linux系统中,system()是一个标准C库函数,用于执行一个系统命令或者shell脚本。调用该函数之后,程序将启动一个新的Shell进程来运行指定的命令,并且等待命令执行完毕返回结果。

int system(const char *command)
  • 入参
    •  command:要执行的命令

课程链接

8-3_改进_支持配置文件的command_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1it4y1Q75z/?p=33&vd_source=3a9afee9fda50350a1c881b4325e007d

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数字信号处理2: 离散信号与系统的频谱分析
  • 解决客户访问超时1s问题
  • C#如何对某个词在字符串中出现的次数进⾏计数(LINQ)
  • YOLOX修改检测框、标签文字的粗细大小
  • 产业链分析指南:产业链分析的七个步骤!
  • <数据集>电梯内人车识别数据集<目标检测>
  • 14. 计算机网络HTTPS协议(二)
  • LLM - 理解 主流大模型 LLM 都使用 Decoder Only 架构的原因 (总结8点)
  • MQTT服务器-安装篇(阿里云主机)
  • 使用 Arduino 串行绘图仪可视化实时数据
  • 在Fragment中显示高德地图
  • 多叉树的深度优先遍历(以电话号码的字母组合为例)
  • MySQL——数据库的操作,数据类型,表的操作
  • 卷积神经网络 - 高效的卷积算法篇
  • Ubuntu Linux安装Go语言
  • 【翻译】babel对TC39装饰器草案的实现
  • chrome扩展demo1-小时钟
  • es6要点
  • flask接收请求并推入栈
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • MySQL-事务管理(基础)
  • Redis学习笔记 - pipline(流水线、管道)
  • vue 个人积累(使用工具,组件)
  • VuePress 静态网站生成
  • 怎么将电脑中的声音录制成WAV格式
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​力扣解法汇总946-验证栈序列
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (3)STL算法之搜索
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (接口封装)
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (面试必看!)锁策略
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET开源项目介绍及资源推荐:数据持久层
  • []sim300 GPRS数据收发程序
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [ARC066F]Contest with Drinks Hard
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [DAX] MAX函数 | MAXX函数
  • [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信
  • [iOS]Win8下iTunes无法连接iPhone版本的解决方法
  • [kotlin]处理延时操作
  • [LeetCode]-Integer to Roman 阿拉伯数字转罗马数字