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

目录

一、函数的使用

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

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值