回头看——《智能家居项目小结》
openAI兴起,于是拿着之前小组合作的项目(承认优化较差),交给AI试着帮忙优化下
1.功能函数(TCP_SER_INIT)优化
源代码:
int TCP_SER_INIT(int *tcpsocket, const char *ip, const char *port)
{int res, optval = 1;// TCP通信结构体构建struct sockaddr_in ser = {.sin_family = AF_INET,.sin_port = htons((short)atoi(port)),.sin_addr.s_addr = inet_addr(ip),};*tcpsocket = socket(AF_INET, SOCK_STREAM, 0);if (-1 == *tcpsocket){ERR_MSG("socket");return -1;}// 允许端口快速重复使用res = setsockopt(*tcpsocket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));if (-1 == res){ERR_MSG("setsockopt");return -1;}res = bind(*tcpsocket, (struct sockaddr *)&ser, sizeof(ser));if (-1 == res){ERR_MSG("bind");return -1;}res = listen(*tcpsocket, 128);if (-1 == res){ERR_MSG("listen");return -1;}printf("等待客户端链接...\n");return 0;
}优化后代码:
// TCP通信结构体构建
struct sockaddr_in ser = {.sin_family = AF_INET,.sin_port = htons((short)atoi(port)),.sin_addr.s_addr = inet_addr(ip),
};*tcpsocket = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == *tcpsocket)
{ERR_MSG("socket");return -1;
}// 允许端口快速重复使用
res = setsockopt(*tcpsocket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
if (-1 == res)
{ERR_MSG("setsockopt");return -1;
}res = bind(*tcpsocket, (struct sockaddr *)&ser, sizeof(ser));
if (-1 == res)
{ERR_MSG("bind");return -1;
}res = listen(*tcpsocket, 128);
if (-1 == res)
{ERR_MSG("listen");return -1;
}printf("等待客户端链接...\n");
return 0;
反思:
优化前后的差别: 优化前,主要出现在每一次操作之后都要判断操作是否成功,返回相应的值; 优化后,通过将操作结果判断和返回值放在操作一起,简化了代码,使之更加简洁易读。
2.手动控制线程代码优化
源代码:
void *pthread_manual(void *arg)
{while (1){int which;msg_t *sendmsg = (msg_t *)arg;if (sendmsg->type & LED1_ON){which = 1;ioctl(fd_led1, IO_LED_ON, &which);}if (sendmsg->type & LED1_OFF){which = 1;ioctl(fd_led1, IO_LED_OFF, &which);}if (sendmsg->type & LED2_ON){which = 2;ioctl(fd_led2, IO_LED_ON, &which);}if (sendmsg->type & LED2_OFF){which = 2;ioctl(fd_led2, IO_LED_OFF, &which);}if (sendmsg->type & LED3_ON){which = 3;ioctl(fd_led3, IO_LED_ON, &which);}if (sendmsg->type & LED3_OFF){which = 3;ioctl(fd_led3, IO_LED_OFF, &which);}if (sendmsg->type & BUZZER_ON){ioctl(fd_buzzer, IO_BUZZER_ON);}if (sendmsg->type & BUZZER_OFF){ioctl(fd_buzzer, IO_BUZZER_OFF);}if (sendmsg->type & FAN_ON){ioctl(fd_fan, IO_FAN_ON);}if (sendmsg->type & FAN_OFF){ioctl(fd_fan, IO_FAN_OFF);}if (sendmsg->type & MOTOR_ON){ioctl(fd_motor, IO_MOTOR_ON);}if (sendmsg->type & MOTOR_OFF){ioctl(fd_motor, IO_MOTOR_OFF);}}
}优化后代码:
//循环处理每个设备for(int i=0; i<6; i++){which = device[i];if (sendmsg->type & LED1_ON){ioctl(fd_led1, IO_LED_ON, &which);}if (sendmsg->type & LED1_OFF){ioctl(fd_led1, IO_LED_OFF, &which);}if (sendmsg->type & LED2_ON){ioctl(fd_led2, IO_LED_ON, &which);}if (sendmsg->type & LED2_OFF){ioctl(fd_led2, IO_LED_OFF, &which);}if (sendmsg->type & LED3_ON){ioctl(fd_led3, IO_LED_ON, &which);}if (sendmsg->type & LED3_OFF){ioctl(fd_led3, IO_LED_OFF, &which);}if (sendmsg->type & BUZZER_ON){ioctl(fd_buzzer, IO_BUZZER_ON);}if (sendmsg->type & BUZZER_OFF){ioctl(fd_buzzer, IO_BUZZER_OFF);}if (sendmsg->type & FAN_ON){ioctl(fd_fan, IO_FAN_ON);}if (sendmsg->type & FAN_OFF){ioctl(fd_fan, IO_FAN_OFF);}if (sendmsg->type & MOTOR_ON){ioctl(fd_motor, IO_MOTOR_ON);}if (sendmsg->type & MOTOR_OFF){ioctl(fd_motor, IO_MOTOR_OFF);}}}
反思:
优化前:
上面的代码中,在给LED1,LED2,LED3,Buzzer,FAN,MOTOR的控制语句中,which变量的值都是写死的,如果需要控制的设备添加,这样的写法会比较复杂且容易出错。
优化后:
可以将控制的设备的which值存储在一个数组中,循环处理每个设备,这样只要添加新的设备,只需要在数组中添加新的which值即可,比优化前更加简单,也更容易维护。
相关文章:
回头看——《智能家居项目小结》
openAI兴起,于是拿着之前小组合作的项目(承认优化较差),交给AI试着帮忙优化下1.功能函数(TCP_SER_INIT)优化源代码:int TCP_SER_INIT(int *tcpsocket, const char *ip, const char *…...
社交登陆OAuth2.0
QQ、微博、github 等网站的用户量非常大,别的网站为了 简化自我网站的登陆与注册逻辑,引入社交登陆功能; 步骤: 1)、用户点击 QQ 按钮 2)、引导跳转到 QQ 授权页 3)、用户主动点击授权ÿ…...
C++005-C++选择与分支2
文章目录C005-C选择与分支2条件语句C实现else if 语句题目描述 根据成绩输出成绩等级ABCDEif嵌套语句题目描述 输出三个数中的最大值题目描述 模拟游戏登录switch语句三元运算符题目描述 输出三个数中的最大值-基于3元运算符题目描述 根据1-7输出星期1-星期日案例练习题目描述 …...
IPFS 简介及概述
文章目录 IPFS 简介IPFS 包含的协议内容及其理解IPFS 和 BitTorrent 区别IPFS 简介 星际文件系统(InterPlanetary File System). IPFS 是一个分布式的网络文件系统, 点到点超媒体协议. 可以让我们的互联网速度更快, 更加安全, 并且更加开放. IPFS协议的目标是取代传统的互联网…...
初学者必读:讲解 VC 下如何正确的创建、管理及发布项目
Visual C 的项目文件组成,以及如何正确的创建及管理项目。 本内容是初学者必须要掌握的。不能正确的管理项目,就不能进一步写有规模的程序。 一、项目下各种常见文件类型的功能 1. 代码文件 扩展名为 .cpp、.c、.h 等。 通常情况下,项目…...
剑指offer(中等)
目录 二维数组中的查找 重建二叉树 矩阵中的路径 剪绳子 剪绳子② 数值的整数次方 表示数值的字符串 树的子结构 栈的压入、弹出序列 从上到下打印二叉树① 从上到下打印二叉树③ 二叉搜索树的后序遍历序列 二叉树中和为某一值的路径 复杂链表的复制 二叉搜索树与…...
微软发布会精华回顾:“台式电脑”抢了风头
Lightbot北京时间2016年10月26日晚10点,微软在纽约发布了名为 Surface Studio 的一体机、名为 Surface Dial 的配件以及外观未变的顶配版 Surface Book。同时,微软宣布了 Windows 10 下一个重要版本——“Creators Update”的数项新功能,包括…...
CF1561C Deep Down Below 题解
CF1561C Deep Down Below 题解题目链接字面描述Deep Down Below题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路TLE算法具体思想TLE特例AC思想代码实现备注题目 链接 https://www.luogu.com.cn/problem/CF1561C 字面描述 Deep Down Below 题面翻译…...
秒杀项目之服务调用分布式session
目录 nginx动静分离 服务调用 创建配置zmall-cart购物车模块 创建配置zmall-order订单模块 服务调用 spring session实战 什么是Spring Session 为什么要使用Spring Session 错误案例展示 配置spring-session 二级域名问题 用户登录 nginx动静分离 第1步ÿ…...
聊聊什么是架构,你理解对了吗?
什么是架构?软件有架构?建筑也有架构?它们有什么相同点和不同点? 下面咱们就介绍一下,容易混淆的几个概念 一、系统与子系统 系统 泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。它的意思是 “总体”、“整体”或“联盟” 子系…...
java多线程开发
1.并发和并行 并发:同一时间段内多个任务同时进行。 并行:同一时间点多个任务同时进行。 2.进程线程 进程(Process):进程是程序的一次动态执行过程,它经历了从代码加载、执行、到执行完毕的一个完整过程…...
杂记7--opencv的ar码模块学习
背景:项目需要用到marker知识,所以到官网上临时补一些知识。 概要:主要介绍marker一些接口的含义,纯属个人理解,有误则希望大佬不吝赐教 1、 涉及ar码操作学习,其头文件为: #include <op…...
[项目设计]高并发内存池
目录 1、项目介绍 2、高并发内存池整体框架设计 3、thread cache <1>thread cache 哈希桶对齐规则 <2>Thread Cache类设计 4、Central Cache <1>Central Cache类设计 5、page cache <1>Page Cache类设计 6、性能分析 <1>定长内存池实现…...
28岁才转行软件测试,目前32了,我的一些经历跟感受
我是92年的,算是最早的90后,现在跟你介绍的时候还恬不知耻的说我是90后,哈哈,计算机专业普通本科毕业。在一个二线城市,毕业后因为自身能力问题、认知水平问题,再加上运气不好,换过多份工作&…...
Python导入模块的3种方式
很多初学者经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用 import(或 from...import) 语句引入该文件时,Python 解释器同时如下错误:ModuleNotFoundError: No module named 模块名意思是 Pytho…...
select 与 where、order by、limit 子句执行优先级比较
当 select 和 其他三种语句的一者或者多者同时出现时,他们之间是存在执行先后顺序的。 他们的优先级顺序是:where > select > order by > limit 目录 1、select 与 where 2、select 与 order by 3、order by 与 limit 4、优先级证明 1、s…...
Linux内核并发与竞争-原子操作
一.原子操作的概念首先看一下原子操作,原子操作就是指不能再进一步分割的操作,一般原子操作用于变量或者位操作。假如现在要对无符号整形变量 a 赋值,值为 3,对于 C 语言来讲很简单,直接就是: a3但是 C 语言…...
Java笔记-泛型的使用
参考: Java 泛型,你了解类型擦除吗? 泛型的使用 1、泛型的定义 可以广泛使用的类型,一种较为准确的说法就是为了参数化类型,或者说可以将类型当作参数传递给一个类或者是方法。 2、泛型的使用 2.1泛型类 public c…...
特斯拉无人驾驶解读
来源于Tesla AI Day Tesla无人驾驶算法的核心任务就是如何理解我们所看到的一切呢?也就是说,不使用高端的设备,比如激光雷达,仅仅使用摄像头就能够将任务做得很好。Tesla使用环绕型的8个摄像头获得输入。 第一步是特征提取模块Backbone,无论什么任务都离不开特征…...
生物素-琥珀酰亚胺酯Biotin-NHS;CAS号:35013-72-0;可对溶液中的抗体,蛋白质和任何其他含伯胺的大分子进行简单有效的生物素标记。
结构式: 生物素-琥珀酰亚胺酯Biotin NHS CAS号:35013-72-0 英文名称:Biotin-NHS 中文名称:D-生物素 N-羟基琥珀酰亚胺酯;生物素-琥珀酰亚胺酯 CAS号:35013-72-0 密度:1.50.1 …...
实证论文不用愁!虎贲等考 AI 数据分析:零代码跑模型,图表 + 结论一键生成
在本科、硕士毕业论文写作中,数据分析往往是最让学生头疼的章节。不会数据清洗、不懂模型选择、跑不出稳健结果、图表不会做、文字不会写,即便前面内容写得再完整,第四章一塌糊涂,整篇论文直接被导师打回。 传统软件如 Stata、Py…...
构建离线文档ETL管道:用Python实现PDF/Word智能转Markdown优化LLM输入
1. 项目概述:为什么我们需要一个离线的文档转换工具?如果你和我一样,经常需要把一堆PDF、Word文档甚至扫描件喂给本地的大语言模型(比如Ollama、LM Studio),那你肯定遇到过这个痛点:模型宝贵的上…...
电子设计协同:跨团队互联规划工具的应用与优化
1. 跨团队互联规划:电子设计协同的破局之道在当今高度复杂的电子系统设计中,芯片(IC)、封装(Package)和印刷电路板(PCB)三大设计团队的协同工作已成为决定产品成败的关键因素。传统设计流程中,这三个团队往往各自为政,通过Excel表…...
React Native跨平台AI聊天应用开发实战:架构设计与性能优化
1. 项目概述:一个全功能的跨平台AI聊天伴侣如果你和我一样,既是移动端开发者,又是AI应用的深度用户,那么你肯定经历过这样的困境:想在手机上随时随地、流畅地和ChatGPT对话,却发现官方App要么功能受限&…...
【Linux保姆级教程】curl命令最全用法详解
在Linux日常运维、后端开发、接口调试工作中,有一个命令几乎无人不知、无人不用,它就是curl命令。curl被称为网络传输瑞士军刀,无需打开浏览器,纯命令行即可发送网络请求,支持HTTP/HTTPS/FTP等数十种协议。不管是测试接…...
ARM AMU与PMU架构详解及性能监控实践
1. ARM AMU与PMU架构概述在现代ARM处理器架构中,活动监控单元(AMU)和性能监控单元(PMU)是系统级性能分析的核心组件。作为芯片设计工程师,我经常需要与这些硬件监控模块打交道。AMU主要负责处理器内部活动的监控和统计,而PMU则提供更通用的性…...
深夜“哔哔”声源排查指南:从原理到实战解决电子设备异响
1. 深夜“哔哔”声的普遍困扰与根源剖析你有没有在凌晨三点被一阵微弱但执着的“哔哔”声从睡梦中拽出来过?那种感觉,就像有个看不见的小精灵在你家天花板的某个角落,每隔一分钟就用气声对你进行一次精准的精神攻击。你猛地坐起,睡…...
嵌入式产品如何通过RTOS选型抢占市场先机
1. 项目概述:为什么“上市时机”是嵌入式产品的生死线在嵌入式系统开发这个行当里摸爬滚打了十几年,我见过太多团队把“功能实现”和“性能达标”作为项目的终极目标,却在一个更根本的问题上栽了跟头:上市时机。你可能觉得&#x…...
Java SE 与 Spring Boot 在电商场景中的应用
面试:Java SE 与 Spring Boot 在电商场景中的应用 今天,我们将围绕一位求职者在一家电商公司的面试场景,与面试官进行一场激烈的技术问答。第一轮提问 面试官: 首先,请你简单介绍一下 JVM 的工作原理。 燕双非…...
Anthropic新模型Mythos号称擅查漏洞,扫描curl代码却仅确认1个低危问题
Mythos高调亮相,扫描结果却令人意外 近期,Anthropic推出的AI安全分析模型Mythos引发广泛关注,该公司宣称其在发现源代码安全漏洞方面表现出色,甚至因此暂缓公开发布。然而,当Mythos扫描全球最广泛使用的开源命令行HTTP…...
