研一下学期第九周周记


前言

这半个月没干别的,把科学精神与人文素养的大作业写了一下,另外4月18日的时候学院群里发了一个中兴举办的“中兴捧月”大赛,我进网址看了一下,算法方面有五个赛道(电磁计算、未来网络、语音处理、图像处理、限时编程),目前还没有截止报名,感兴趣的可以去中兴捧月大赛看看。
适合我的只有未来网络赛道以及限时编程赛道。
未来网络赛道初赛第一阶段和第二阶段的题已经公布了,主要是布局无人机作为通信载体,以时延大小作为评分条件。目前以我的水平估计要写个好几天的代码,想想还是算了。
综上分析,我只报名了限时编程的比赛,这个比赛有两场,最后的成绩取最优。


一、复盘以及总结

赛前有个宣讲,中兴的负责人说比赛难度中等,属于力扣上困难属性的一种题,而且是耳熟能详的小游戏,让我们不要紧张,应该很快就能做出来,这道题比的应该就是手速。
我花了几天去搜了一下那些小游戏,无非就是俄罗斯方块、推箱子、扫雷、贪吃蛇,我把大神写的代码都扒下来了,好好看了一下里面的结构。但是让我疑惑的一个点是,这些游戏都很难有输出,那么到时候怎么评判得分呢?终于昨天比赛开始,公布题目的那一刻我才明白是这样玩的。
限时编程第一场的比赛题目是“24点”,题目套了个壳子,说英雄联盟有四张卡,分别代表4种数目不大于10的伤害点数,只有通过“+”、“-”、“*”、“/”、“(”、“)”这几个运算符计算出伤害总和,只有伤害总和达到24,才能触发被动,从而赢得胜利。
我看到题目的时候完全是懵的,因为平常也不玩24点,四年前好像写过类似的算法题,但现在都忘光了。题目表述不清晰,没有说明数字和运算符的使用次数,也没有说除法后浮点数的问题。
最后我通过给的两个示例“1 1 2 7”、“1 9 1 9”差不多推导出了计算规则,除法方面,我判断了是否能整除,如果不行的话就不能除。最后暴力枚举。
赛后大神们在群里发了力扣上的原题以及题解,感兴趣的可以看看C++题解

二、目前阶段目标

现在的小目标如下:

1、彻底收尾科学精神与人文素养的大作业。
2、为5月8日的第二场比赛做准备,看看力扣上相关的题目。
3、为专业写作的大作业——文献综述做准备,进入收集论文阶段。


总结

温故知新;
锐意进取;
砺行致远;
厚积薄发。

在嵌入式开发实习的第十八,可以从多个维度对工作内容进行总结,包括项目进展、技术挑战、文档整理以及个人成长等方面。 ### 项目进展 本主要完成了某个嵌入式项目的初步版本交付。该项目涉及基于 Modbus 协议的串口通信功能开发,通过与硬件团队的紧密合作,确保了软件部分与硬件设备之间的数据交互正常运行。此外,还完成了与上位机软件的数据对接,实现了数据的实时监控和调试功能[^1]。 ### 技术挑战 在开发过程中,遇到了一些技术难题。例如,在处理 Modbus 协议时,需要理解其通信机制和数据格式,以确保数据的正确解析和发送。为了提高系统的稳定性,采用了自旋锁(spinlock)来保护共享资源,防止并发访问导致的数据不一致问题[^4]。同时,针对 UART 通信中的数据校验问题,引入了奇偶校验和CRC校验机制,确保了数据传输的可靠性[^3]。 ### 文档整理 为了便于后续的维护和团队协作,本还重点进行了开发文档的整理工作。文档内容涵盖了项目的需求分析、架构设计、模块划分、接口定义以及测试用例等。通过详细的文档记录,不仅提高了项目的可追溯性,也为新成员的加入提供了良好的参考资料[^1]。 ### 个人成长 通过这一的工作,不仅加深了对嵌入式开发的理解,还在实践中掌握了更多的技术细节。特别是在处理复杂协议和多线程编程方面有了显著的进步。此外,还学会了如何高效地进行问题排查和调试,提升了实际解决问题的能力。面对技术上的挑战,保持持续学习的态度,积极查阅资料并向经验丰富的同事请教,使得问题得以顺利解决[^2]。 ### 代码示例 以下是一个简单的 Modbus 协议解析示例,展示了如何从串口读取数据并解析为 Modbus 报文: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> // Modbus 报文结构体 typedef struct { uint8_t slave_id; uint8_t function_code; uint16_t starting_address; uint16_t quantity_of_registers; uint8_t byte_count; uint16_t *registers; } ModbusRequest; // 解析 Modbus 请求报文 int parse_modbus_request(const uint8_t *buffer, size_t length, ModbusRequest *request) { if (length < 8) { return -1; // 数据长度不足 } request->slave_id = buffer[0]; request->function_code = buffer[1]; request->starting_address = (buffer[2] << 8) | buffer[3]; request->quantity_of_registers = (buffer[4] << 8) | buffer[5]; request->byte_count = buffer[6]; if (request->byte_count != (buffer[7] * 2)) { return -2; // 数据长度不匹配 } request->registers = (uint16_t *)malloc(request->byte_count); if (!request->registers) { return -3; // 内存分配失败 } for (int i = 0; i < request->byte_count / 2; i++) { request->registers[i] = (buffer[7 + i * 2] << 8) | buffer[8 + i * 2]; } return 0; } int main() { int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { perror("无法打开串口"); return 1; } struct termios tty; memset(&tty, 0, sizeof tty); if (tcgetattr(fd, &tty) != 0) { perror("获取串口属性失败"); return 1; } cfsetospeed(&tty, B9600); cfsetispeed(&tty, B9600); tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars tty.c_iflag &= ~IGNBRK; // disable break processing tty.c_lflag = 0; // no signaling chars, no echo, no canonical processing tty.c_oflag = 0; // no remapping, no delays tty.c_cc[VMIN] = 0; // read doesn't block tty.c_cc[VTIME] = 10; // 0.5 seconds read timeout tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl tty.c_cflag |= (CLOCAL | CREAD); // ignore modem controls, enable reading tty.c_cflag &= ~(PARENB | PARODD); // shut off parity tty.c_cflag &= ~CSTOPB; // only need 1 stop bit tty.c_cflag &= ~CRTSCTS; // no hardware flowcontrol if (tcsetattr(fd, TCSANOW, &tty) != 0) { perror("设置串口属性失败"); return 1; } uint8_t buffer[256]; ssize_t n = read(fd, buffer, sizeof(buffer)); if (n > 0) { ModbusRequest request; int result = parse_modbus_request(buffer, n, &request); if (result == 0) { printf("从站ID: %d\n", request.slave_id); printf("功能码: %d\n", request.function_code); printf("起始地址: %d\n", request.starting_address); printf("寄存器数量: %d\n", request.quantity_of_registers); printf("数据长度: %d\n", request.byte_count); for (int i = 0; i < request.quantity_of_registers; i++) { printf("寄存器[%d]: %d\n", i, request.registers[i]); } free(request.registers); } else { printf("解析Modbus请求失败: %d\n", result); } } else { printf("没有读取到数据\n"); } close(fd); return 0; } ``` ### 相关问题 1. 如何在嵌入式系统中实现Modbus协议的通信? 2. 在嵌入式开发中,如何处理多线程环境下的资源共享问题? 3. 如何编写高效的嵌入式驱动程序? 4. 嵌入式系统中常用的调试工具和技术有哪些? 5. 如何评估嵌入式系统的性能和稳定性?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值