2023年终总结

2023-12-30 14:31:55

前言:

嘻嘻,12月底广州降温了又到了写年终总结的时间,这也是我第二年写年终总结。今年的年终总结主要记录了我大三下学期和大四上学期这两个时间段的学习和收获,也是我尝试走出校园,接触社会的第一年(感触良多)。大致的主线就是正点原子IMX6ULL开发板的一些收尾工作、学习Qt修改出厂综合历程来达到最初买这块开发板的目的;牛客刷笔试、面试题,参加面试来知道自己的不足、积累面经;两段嵌入式软件岗位的实习(音频+网络)。因为是大三下学期,这一年对我来说终于摆脱了奖学金和绩点的束缚,我不用把时间花在这些事上(前两年拿过奖学金了,绩点、年级排名也够用)。加上我也没有打算考研或考公,所以我就可以把心思全部投入到实习当中。总的来说最大的感触就是企业级的代码跟学校完成课程设计的代码完全是两个量级,实习可以学到一些之前没有见过的代码架构和处理逻辑。在学校的课程设计主要是完成功能为主,企业级代码注重稳定性,对不同场景的考虑也会更加严谨。年末我第一个参与的产品也是成功通过测试在官网发布了,市面上终于有一款产品里有我写的代码(OLT)。前言差不多就到这,接下来就具体介绍一下我这十二个月分别做了什么,有哪些收获和感触。

一月:正点原子IMX6ULL开发板Qt C++教程、QML,开发板出厂综合历程修改

实话实说,学Qt是我目前在嵌入式学习中最快乐的一段时光(好吧,我承认是因为有蛇姐),我在写一月份这部分总结的时候回想起来都笑得好开心。

话说回来,在开始之前先学习了一些C++的基础,类、对象、封装、继承、多态等基本概念。因为主要是学习Qt中控件的使用,C++的学习就没有比较系统和全面。Qt一开始是从基本的常用控件开始,我没有用Qt Designer直接拖出控件来进行界面设计。刚开始都是用C++一个一个控件学习,像pushbutton、scroll、spacer、table等,调整布局中要到的horizontal、vertical、grid。用代码这样可以更好地熟悉底层实现逻辑,直接拖控件完成起来会比较快,但是如果最后工程大一些直接界面设计就没这么方便,维护起来也更困难。进一步就是掌握信号与槽的机制、qss文件改变样式表等。

图 1 信号与槽
图 2 qss设置控件样式
图 3 自定义控件使用

之后我就用了Qt中自带的QSerialPort、QSerialPortInfo两个类进行设计一个串口。基本功能就是可以设置串口的一些参数波特率、奇偶校验位、停止位、数据位、哪个串口等,设置完成之后可以实现开发板和PC进行简单的数据收发。

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //lcd屏的分辨率是1024X600
    this->setFixedSize(QSize(1024, 600));
    //new 一个QSerialPort对象
    serialPort = new QSerialPort(this);

    //通过foreach语句将windows或imx6ull可用串口识别出来,并添加至对应的下拉选择框
    QStringList serialList;
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
        serialList += info.portName();
    }
    ui->comboBox->addItems(serialList);

    //设置串口的信号与槽
    connect(serialPort, SIGNAL(readyRead()), this, SLOT(readData()));



}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_radioButton_clicked(bool checked)
{
    //点击“打卡串口”button之后的一些串口配置操作,和一些逻辑关系
    if(checked){
        //设置串口端
        serialPort->setPortName(ui->comboBox->currentText());
        //设置波特率
        serialPort->setBaudRate(ui->comboBox_2->currentText().toInt());
        //设置停止位
        serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_4->currentText().toInt()));
        //设置数据位
        serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_6->currentText().toInt()));
        //设置校验位
        switch(ui->comboBox_5->currentIndex()){
        case 0:
            serialPort->setParity(QSerialPort::Parity::NoParity);
            break;
        case 1:
            serialPort->setParity(QSerialPort::Parity::EvenParity);
            break;
        case 2:
            serialPort->setParity(QSerialPort::Parity::OddParity);
            break;
        case 3:
            serialPort->setParity(QSerialPort::Parity::SpaceParity);
            break;
        case 4:
            serialPort->setParity(QSerialPort::Parity::MarkParity);
            break;
        default:
            break;
        }

        serialPort->setFlowControl(QSerialPort::NoFlowControl);
        if(!serialPort->open(QSerialPort::ReadWrite)){
            QMessageBox::about(this, "串口打开错误提示", "可能被占用了");
            return;
        }

        //打开串口之后其他的选择按钮设置成不可用
        ui->comboBox->setEnabled(false);
        ui->comboBox_2->setEnabled(false);
        ui->comboBox_4->setEnabled(false);
        ui->comboBox_5->setEnabled(false);
        ui->comboBox_6->setEnabled(false);

        ui->radioButton->setText("关闭串口");

    }
    else{
        serialPort->close();
        ui->comboBox->setEnabled(true);
        ui->comboBox_2->setEnabled(true);
        ui->comboBox_4->setEnabled(true);
        ui->comboBox_5->setEnabled(true);
        ui->comboBox_6->setEnabled(true);
        ui->radioButton->setText("打开串口");
    }

}

void Widget::readData()
{
    //将串口中的数据打印到textBrowser中
    ui->textBrowser->insertPlainText(serialPort->readAll());
}

void Widget::on_pushButton_clicked()
{
    //点击“发送”button之后,将textEdit中的内容写入串口
    serialPort->write(ui->textEdit->toPlainText().toUtf8());
}

void Widget::on_pushButton_2_clicked()
{
    //清屏操作
    ui->textEdit->clear();
    ui->textBrowser->clear();
}

PC和开发板用不同的编译链进行编译出来就可以在对应的环境执行。

图 4 Windows使用串口软件
图 5 Linux开发板使用串口软件

学了差不多半个月了我打算去修改正点的例程了,但是我发现这个项目不只有Qt C++,还有一些qml的文件。后来了解到qml也是Qt主推的一种界面设计,Qt Quick提供一些更方便使用的类,像竖屏滑动,横屏翻页等。

图 6 正点Qt出厂综合历程
图 7 Qt提供的多种工程模板

新建一个qml工程的界面(整个新工程基于某些类的初始化),简单创建一个Qt Quick工程的文件。

图 8 新建Qt Quick工程文件

我在B站看的qml教程,讲的比较细致,有讲基础的控件使用,重点是在C++和qml端如何进行交互。

图 9 B站QML教程

在Qt C++和qml两方面都准备好后就开始修改综合例程了。正点的综合例程工程主体框架就是C++会使用系统调用来获取数据(例如打开文件read、write),而qml是将C++端获得的数据进行显示并修改样式,类似于一个前端、一个后端。C++和qml的通信主要是main.cpp 中通过 qmlRegisterType<>()来完成类的注册,然后在 qml 端通过 import 导入对应的模块进行数据调用。花了差不多一个礼拜进行修改和调试,最终也是实现了想要的效果。

图 10 开发板修该过后的最终界面

具体的展示视频地址和仓库工程链接:

正点原子Linux(imx6ull)开发板出厂Qt综合历程修改_哔哩哔哩_bilibili

正点原子QDesktop例程学习 · master · 门牙会稍息 / 正点原子IMX6ULL开发板综合历程修改 · GitCode

到这里我也是结束了正点这块板的学习,耗时半年从最初的裸机开发、驱动开发、到Linux C 应用开发、最后Qt的学习,这块板也是真正地带我走进了嵌入式Linux,收获颇丰。

二月:观看正点原子视频,重新学习、巩固STM32的基础知识,体验K210开发板

23年其实没有受到疫情的影响,出校很方便,我的计划是想过完年三月初在广州找一份实习。但是花了半年的时间在Linux这了,一些裸机、STM32外设、总线协议的基础知识遗忘了许多。赶在三月份之前也是看了看正点新推出的视频,复习了stm32外设的一些基本知识,实操回顾了之前做过的一些实验例程。然后也是在裸机的基础上尝试移植freertos操作系统和lvgl开源图形库,但是我感兴趣的还是Linux+Qt这种组合。学习freertos、lvgl主要是在于了解和应付一些面试,我不是特别想走单片机加一个操作系统的职业方向。可能是因为我在Linux这边花了更多时间,相较于这种单片机的方向更有底气。

图 11 复习stm32基础知识

二月下旬的时候买了块K210的板子试了试,怎么说呢,也没太发挥出它的性能和应用场景。对于我来说主要是锻炼一下快速上手一款陌生的芯片或开发板,如何将之前stm32的知识进行迁移,这块板没花什么时间,不是特别上心。

图 12 K210开发板显示图片

图 13 K210开发板和stm32通过串口进行通信

二月中旬的时候我开始投递简历,二月底我也是得到了绿辰的面试邀约。面试流程总共有两轮,第一轮是电话面,另一轮是线下面。电话面主要是嵌入式相关的,公司线下面技术的稍微少一点,主要是看能不能合得来共事。因为绿辰是做音频相关的,特地多注意了ADC、DAC、I2S这部分内容。电话面的时候印象比较深的有一个问题,问的是音频的数据输入和输出如果不同步可以用什么方法,数据怎么存储之类的,这个我是没有答上来的。后来面试官也是很耐心的跟我讲解,可以用环形buffer,串口数据接收也可以用这种方式。环形缓冲区可以用于延迟补偿,将输入音频样本推迟一段时间再进行处理,这样可以保持同步和正确的处理结果。我个人感觉电话面的一般,但还好给了我一个机会去公司线下面试,挺紧张的,也是第一次出校园到公司去面试。面试前将之前学的内容又过了一遍,也是提前一天晚上去公司旁边踩了点。面试的那天下午我把正点那块修改了综合历程的开发板带过去公司展示了,可能是因为有音频的输入输出,他们就感觉我会音频的一套体系,就录用我了。怎么说呢,我整个人是有点发虚的,音频也不是专门弄过,但也没想这么多了,先干着看看吧。?

图 14 绿辰公司周边

三月:绿辰实习、开始踏入社会

面试通过了,在三月初办理了入职,也是正式开始第一份实习。进去之后带我的是奇哥,搞音频算法相关的。电话面试我的是宇哥,他是专门搞嵌入式的,人在长沙的一家公司平时不在公司。宇哥和老板是朋友,平时会帮忙提出一些设计思路和面试招人。

图 15 绿辰offer

实习的第一个礼拜没有什么特别的任务,就是下载开发环境Andesight,熟悉山景公司芯片的SDK历程。学习基本的开发流程,如何下载代码到开发板上,一个一个历程下来和32挺像的。开发板主控用的是上海山景的BP10系列,下面这张图是芯片功能的基本介绍(图来源于上海山景官网),也是第一次用专业的蓝牙音频编解码的芯片。

图 16 山景芯片资源、性能介绍
图 17 工位
图 18 第一天下午下班

开发板SDK例子的功能主要是围绕ADC、DAC、USB Audio、Bluetooth展开的。搞音频躲不掉Au软件的使用,其中有一个历程就是手机和开发板通过蓝牙进行连接,手机放歌通过蓝牙发送到bp10上,bp10中有内置的蓝牙协议栈进行接收,接收到的音频数据进行Audio ADC转换,最后通过USB Audio将数据传入到PC上的Au软件进行采集。一套流程下来后计算信噪比、功率比这些参数。但是我肯定没有那些专门搞音乐,搞音频的人那么专业,基本上就是体验了一下,走了一遍流程,如果要细弄真弄不来。像音频、USB、蓝牙,随便拎出一个来都有得来搞,让人头大。音频有MP2、MP3、FLAC、AAC等许多编解码格式,DMA水位要怎么设置、音频数据的读写速度要怎么调整。USB协议中又有细分音频、HID设备之类的,蓝牙协议栈就更不用说了,脑子里都没概念。

图 19 Au录制音频
图 20 BP10芯片SDK介绍

后面按奇哥要求花了一段时间通过学习USB协议,将开发板通过USB线和PC进行连接,PC将开发板识别成USB HID设备(这里是枚举成了键盘)。讲到这里就要感谢圈圈大佬了,没有《圈圈教你玩USB》这本书的话,我都不知道该怎么办,真是圈圈帮了大忙。USB里那么多种类的描述符和包结构,直接看USB协议会无从下手。虽然圈圈的书是在0几年写的,但是实在是经典,看圈圈的书入门USB是最好的选择。最后也是写了一篇博客来记录圈圈书上的一些知识点。

图 21 圈圈USB学习总结

这周快结束的时候也是通过开发板上的按键来模拟日常用的键盘,这里就只实现了两个键(a和c),基本的流程是走通了要添加其他的按键或者改成其他类型的HID设备也不会太难了。

图 22将开发板枚举成HID设备(键盘)
图 23 开发板的按键成功设置成键盘功能

差不多一个月过去了,其实也没有什么特别的产出,就将开发板枚举成键盘这个算是真正烧了脑、折磨了一个礼拜。其他的时间都是在学SDK历程,过了一周左右就开始要写周报了,这个月也写了三次周报。

图 24 3月周报

四月:前半月Looper&drum操作流程 LCD显示、后半月粤嵌GEC6818开发板实现电子相册、普中DSP课程设计

四月初奇哥也开始叫我做项目了,做的是一个录音机内置鼓机的项目。这个产品有一个LCD屏用来显示音频的相关数据、两个编码器旋钮和两个踩钉用于人机交互。产品的使用方式就是一端接音频的输入(可以是吉他),这个产品可以录制多个音轨,录制的音频可以输出到调音台进行播放。怎么说呢,因为没有搞过音乐,刚开始这个产品如何使用、使用场景是什么都弄不明白。

图 25 友商产品效果图

我的任务就是将一块SPI的屏驱动起来,模仿友商的产品设计界面。编写界面的函数接口,其中包括音量调节、音轨选择、鼓机风格选择、音频播放的进度条等,前前后后包括调试也差不多弄了两个礼拜。最后也是写了一个综合历程来模拟用户在使用的情况下会出现的界面,测试了一下不同情况下界面的显示是否正常,会不会出现界面刷新之后还有数据像素点残留、像素点覆盖的情况,音频进度条的显示是否正常。

图 26 LCD屏显示音频数据

四月中旬发了三月的工资,虽然不多但是第一次挣钱也挺开心。

图 27 人生第一份工资条

但是好景不长,我被奇哥约去谈话了。谈话的主要内容是说我现在的水平和能力其实达不到他们的要求,所以要我提前结束实习,换言之就是被裁了。钱都还没焐热这边就告诉我要办理离职,我都还打算问奇哥下礼拜要做什么。谈话结束之后回到工位我脑子是蒙的,什么事也做不下去,第一次发工资和第一次被裁两件事发生的间隔不到两天,我是有点接受不了。下班出地铁,骑上学校的共享电动之后我没有直接回宿舍,而是骑着电动在学校逛。骑车的时候回想起来这些,实在是受不了了,在没人的时候也是忍不住掉小珍珠了(我觉得除了我没有人会看得这么细)。那天晚上也是骑了好久,心情平复好了才回宿舍。

图 28 下班回学校的广州塔

因为实习的时候我周二下午要回去上课,之前没有一周是全勤的。就最后一周的周二逃了课没回学校,那周就是全勤,结果是第一次也是最后一次。最后一周的周二下午刚好也是宇哥从长沙来到公司,也算有缘分,好歹怎么样也见到了一次。

图 29在绿辰第一次一周内全勤

14号我基本上就是在整理之前的工作内容和奇哥进行交接,17号上午交接完,办好离职,我的第一份实习就这样结束了,怎么也没有想到这么快就结束了。

图 30 离职收拾开发板和相关设备

整个实习过程结束后我进行了反思,其实在这一个半月我也有做的不好的地方。每天下班之后就是看直播、刷抖音,以为找到实习就万事大吉了,工作的强度也不高,没有真正全身心的投入。还有一点就是在招我进来之后,我看公司这个岗位的招聘就停止了。但是四月初的时候我感觉有点奇怪为什么公司在招聘网站上又开始招嵌入式的实习生了,我以为是要给我找个伴。结果,哎!人还是要多点忧患意识。走之前最后一餐也是去了公司同事第一次带我中午吃饭的店里吃了一顿煲仔饭,这也算是有始有终吧。

图 31 煲仔饭

总的来说还是挺感谢这一个半月的实习经历,帮我迈出了第一步。那天下午奇哥也跟我讲了很多,给了问我一些忠告,数字信号处理、微机原理、操作系统、工程数学这几本书我还记得。有些话在离职的时候没有亲口说出来,在这里还是感谢奇哥和宇哥,也是祝愿你们以后在自己的领域继续发光发热。

图 32 绿辰大门

四月下旬就是在处理学校的课程设计,一个Linux,一个DSP。

粤嵌的那个电子相册我是有认真搞,后面自己多加了一个音乐播放器。这个和之前做的有所差别,用的都是Linux C应用编程知识,没有用Qt库。具体的功能要有点击特定的区域实现上一张、下一张、自动播放图片、黑屏退出应用程序、左右滑动切换图片相关功能。其中涉及到的知识点也比较多,像文件IO、内存映射、触摸屏、bmp图片格式、进程、线程创建和同步、字符串操作等。

图 33 粤嵌开发板显示图片

具体的可以看我写的一篇博客,现在是我阅读量最高的一篇文章,里面有演示视频和工程源码,有需要的可以参考。

粤嵌Linux GEC6818开发板实现电子相册_linux电子相册-CSDN博客

还有一个就是DSP的课程设计,把基本的功能都实现就没做其他的了,做的内容和之前的课程设计差不了太多,没怎么用心。

图 34 DSP课程设计

五月:劳动节放假调整、然后开始牛客刷笔试题备考cvte暑期实习笔试、夯实基础

完成学校的事后也是到五一了,五一也是先去了东莞老姐家休息了一天,我也没有跟家里人说我被裁的事,以后也不会说了。

图 35 五一放假去老姐家

五一短暂修整了过后就开始修改简历、投暑期的实习,投的有cvte的暑期实习,笔试是安排在5月底,差不多有一个月的时间准备。准备的这段时间开始调整作息和运动量,之前实习的一个半月基本没怎么运动。我就发现了我要做成什么事,首先就是要多锻炼身体,变胖了也是侧面的反映出这段时间的状态比较差、没有这么自律。

图 36 开始调整、增加运动量

准备的过程基本上就是刷牛客上嵌入式软件的笔试题,包括C、C++、Linux基础、C应用开发、操作系统等,时不时的也会看别人的面经。

图 37 牛客刷嵌入式软件的题

刷题、复盘、积累这样的日常差不多持续了三个礼拜,这段时间内也是补了很多的基础知识和以前忽略的地方。有时候学是那么回事,一做题就会暴露出很多的问题,还有通过做题来发现以前不知道的知识点。不做题休息的时候就会看看B站爱上半导体这个账号发的视频,挺有意思的,可以帮助我从不同的角度理解以前所学过的内容。电子专业的低年级学生看这个也会有比较多好处,可以更好地理解一些模电、数电、单片机的基础内容,一个视频也不长,看完就可以了解一个知识点,我个人是比较推荐看的。

图 38 刷题过程
图 39 B站爱上半导体账号

很快也是到了笔试的日子,笔试前也是吃了顿饺子希望有好运。笔试的题目范围很广,C/C++基础、Linux、操作系统、总线、C应用编程和一道字符串相关的编程题,做的过程还行,个人感觉勉勉强能过。过了两天笔试的结果出来了,也是顺利通过了,好在没有辜负这几个礼拜的付出。

图 40 笔试前吃饺子
图 41 通过笔试

五月也就差不多是这些内容,之后就是等面试的通知。

六月:参加cvte线上面试的经验总结、C++、计算机与网络、刷题

差不多过了十天,cvte西安产业园的人跟我打电话安排面试的时间,采用的是线上视频面试。这一次面试可谓又是把我打回原型了,问的范围和笔试一样很广,但我的简历是偏Linux的,就问了比较多Linux相关的。有底层驱动、C应用、用户态和内核态之间的通信方式(系统调用)以及一些常见的术语,这些答得还是可以。但是我最薄弱的两部分C++和计算机网络被问到问题就基本没有答上来,面试结束之后我的感觉不是很好,最后的情况也是没有通过面试。

图 42 面试失败

面完之后复盘、整理了一下面试过程没有答上来的问题。然后六月的主要任务就是学C++基础和计算机网络,补上两块短板。这两个我都是在B站上看视频、然后做笔记,C++是黑马而计算机网络是王道考研系列。

图 43 C++基础学习
图 44 计算机网络学习

六月底的时候我的计划是暑假就不回家了,投其他的暑期实习有点太晚了,索性就在学校里投秋招的提前批,回去的话如果有线下面试之类的就不方便。所以趁着端午节就回去一趟,暑假就待在学校冲刺秋招提前批,放假前和舍友们出去聚了一下。

图 45 端午回家
图 46 下高铁后随便拍拍
图 47 学期结束和舍友聚餐

七月:ESP8266,笔试、面试,提升强度备战秋招提前批,获得芯德科技offer

五六月份基本上都是在做笔试题或者面试,开发板摸的比较少。以前一直没有摸过esp8266这个WiFi模块,六月底、七月初的时候也是配合stm32体验了一下,顺便回顾开发流程。

图 48 stm32和esp8266

在用esp8266模块的时候有配合OneNet云平台一起使用,将开发板上的传感器数据通过WiFi模块发送到云平台进行实时监控,其中主要的内容就是AT指令和POST、GET报文格式,总的来说就是一些简单的物联网应用。做题做的比较烦的时候就会在学校里逛逛,换一个食堂吃饭。

图 49 OneNet云平台数据采集
图 50 华农风景

esp8266体验了之后也是继续投简历,那段时间差不多每一周都有一次正式的笔试或者面试。这里面印象比较深的是深圳元戎启行的面试,面试官看起来比我大两三岁,整体的面试体验也是很不错的。开始就是根据你的简历问一些基础的问题,答得还行。问完之后就是手撕代码,额,这部分就勉勉强强,整个面试差不多有一个小时,面试完之后我个人还是比较有底的。过了两天HR问我考不考虑测试岗,怎么说呢可能是投的人比较多,软件开发岗学历好的大有人在,我的学校和情况在竞争者中可能就是符合他们厂测试的水平的,软件开发可能还是不够的。后边也是拒绝HR说的测试岗,但是HR没有直接给我直接发感谢信我就觉得这次面试就算成功了,加上一些电话面试,面的多了整个人在后面的面试也是更有经验和信心了。

图 51 元戎启行岗位更换

后面也是继续在招聘网站和公司官网投了一些公司,芯德的hr跟我打电话问我有没有时间去线下笔试、面试,我也是答应了,岗位的方向是Linux+网络。芯德的HR跟我打电话的时候我都没有反应过来,我都忘记了什么时候投过这个公司。后面去官网了解了一下是做ONU、OLT的厂商,在国内的二线的厂商是属于头部位置的。到公司之后是先做了一个小时的笔试、做完之后就是技术面、技术面完之后就是老总面。笔试、面试的强度在面过的厂商里算中等的,面试的过程也是比较顺利、氛围也挺好的。面过几家之后发现问的问题方向都大差不差,可能有些点就会更细一些。第二天晚上也是收到了offer,薪资和方向都还可以就签了,后面也没有继续投其他公司了,我的秋招就结束了。

图 52 VSOL offer
图 53 科学城创意大厦外景
图 54 秋招提前批投递汇总

八月:芯德中试培训、学习

签了offer之后也是马不停蹄开始了在芯德的实习,研发部门的同事都是要在测试这边干一个月然后再回到对应的产品线。干测试一个月的主要目的是熟悉公司的产品,因为ONU、OLT这些产品学生一般是没有什么场合去使用到的,路由器用的还多一点。在测试房有学习网络相关的协议、OLT/ONU的使用、打流仪的使用、批量测试组网等,如果没有学习的话就直接写代码或者该bug会力不从心的,用都用不好就不可能会开发。

图 55 OLT组网
图 56 批量打流测试

在中试(测试)的这一个月内遇到过一个比较奇怪的问题,就是在打二层裸流和组播流的时候收到的包会比发出来的包多。一开始也是先排查了OLT这边有没有开PON口镜像,如果开了镜像的话会把其一个的包转到其他配置镜像的口上,这样包就会变多,但是OLT这边没有开镜像。排查到后面也是发现一台ONU没有开IGMP Snooping,导致把其他组播组成员的数据包也给转了一份。最后也是自己拿了两台ONU进行组网验,实验的现象和所想是一致的。

图 57 组播问题排查

八月底也是开了生日会(每个月都有),我刚好是八月的也收到了一份公司的生日礼物。刚来公司没一个月就拿了,运气真好,很开心。

图 58 8月生日会

一个月过得很快,在中试这边学习了一个月之后就要回产线了(其实就隔了一栋楼)。在中试的一个月收获挺多,每天就好像在学校里做实验一样,自己接线组网来验证问题,遇到不会的中试同事也会跟我讲解。中试的同事基本上都是95-00年、加上一些老员工,有很多话题聊得来,每天中午都会约到一起去吃饭。在中试的每一天都很开心,之前的实习就没有这种感觉。

图 59 回产线前在中试的最后一张图

在中试的每一天都会写日报记录当天的工作内容和学习情况,这些我在回产线之前也是进行了汇总以便日后遇到什么问题可以快速查阅。

图 60 中试学习汇总

九月:回产线熟悉代码和基本工具的使用、流氓ONU的移植

软件部门当中又分了两个产品线,一个产品线是做ONU的、另一个产品线是做OLT的,我被分到做OLT的产线。回到产线之后部门给我安排的师傅是我的校友(姓黄),他是21年也毕业的,在公司也工作两年多了,他PON芯片相关的开发比较多。刚回产线就是先熟悉工具的使用、编码的规范、整体的开发流程、svn、项目管理系统的使用。

图 61 回产线后的工位

熟悉了一个礼拜之后给我分配的第一个任务是OLT中流氓ONU(Rogue ONU)功能。这里先简单介绍一下OLT和ONU之间的交互方式。上行方向(OLT->ONU):是通过广播的方式将数据包转到每个ONU,ONU再根据GEM PORTID来识别是不是发给自己的包,是就接收。下行方向(ONU->OLT):采用TDMA,时分多址访问,也就是OLT会给每个ONU分配一定的时隙(时间片)与其交互。每台ONU只能在指定的时隙内和OLT进行交互。

图 62 GPON下行数据
图 63 GPON上行数据

出现流氓ONU的现象就是在一台OLT的一个PON口批量注册多台ONU,发现有一台或者几台ONU可以正常注册,但是其他的ONU无法注册上OLT。流氓ONU就是在上行方向上占满了整个时隙,导致其他ONU无法和OLT进行交互最后导致ONU掉注册。

图 64 Rogue ONU功能Web界面

九月份也是我回产线的第一个月,主要是在熟悉开发环境(Linux),开始Rogue ONU功能的开发。

图 65 下班在公司简单吃点

十月:HTML、CSS的学习、ONU Common Service的移植和测试、解bug

产品提供给用户的管理方式有CLI、Web、Telnet,其中内嵌了Web服务器就避免不了要学习一些基本的网页界面设计。国庆的时候也是抽时间学了html、css、js,因为我们的产品提供一些表、按钮进行业务的配置和回显,没有像专业前端那边用框架。大框架其实已经搭建好了,学了些基础标签的使用和css语法格式就好了,在实操中遇到问题就再解决。

图 66 html学习
图 67 浏览器显示html文件

月初国庆回老家正好赶上高中的学校100年校庆,回学校参加了活动,见到了三年没见到高中的老师。

图 68 高中学校100年校庆

我负责的Rogue ONU模块提供Web、CLI两种方式供客户进行配置,整体的难点就在交换芯片和PON芯片之间的交互。交换芯片是将配置下发到PON芯片这边开启Rogue ONU检测,PON芯片要将检测到的Rogue ONU信息回传给交换芯片。产品的一期功能完成后就进入测试了,测试过程中试的同事会报上出现的bug。我也被安排去解一些简单的bug,bug也是不断积累,慢慢有自己的一个bug库了。这样以后遇到类似的bug就可以更快解决,可能这就是所谓的经验吧。

图 69 积累的bug库

Rogue ONU功能差不多半个月之后就差不多结束了,后面的就是给测试的同事进行测试。后半个月就是在移植一个功能到当前项目上,ONU Common Service,这是一个介于配置单台ONU和模板的功能。此模块主要是在配置单台 ONU 的 Tcont、GemPort、Service、Service Port、PortVLAN 基础上移植的。移植过程中遇到的困难主要是多层循环遍历,针对多种情况都要进行考虑。类似于 ONU 是否绑定 Line 模板、一些配置项的从属关系(比如GemPort 存在时,对应的 Tcont 就不能先删除;Service、Service Port存在就不能先删除GemPort)、不同情况下的错误处理、告警弹窗灵活处理等。这个功能难倒是不难,主要是是比较繁琐,有很多情况需要考虑,这个功能就只提供了Web进行配置和回显。

图 70 ONU Common Service功能Web界面

月底的时候公司也是组织研发团队出去旅游,我实习也带上我了。周末两天去了清远的欧家梯田和湖南的莽山,市中心呆久了出去外面亲近亲近大自然,山里的空气也更好,十月就这样结束了。

图 71 清远欧家梯田
图 72 莽山山顶

十一月:V1600XG02项目阶段性总结复盘、PON技术学习、eNSP组网学习

回产线差不多两个月了,也是对这两个月的学习和项目进行了阶段性的总结。这两个月的工作基本上都是在应用层,忽视了一些基本理论知识的学习,也是重新重视起来。后来也是找了课学习GPON、XG(S)-PON的基础知识。

图 73 GPON、XG(S)-PON的基础知识

用eNSP软件进行组网,加深理解一些之前学的网络基础知识和协议,像VLAN、路由协议、NAT、组播等。有需要的可以参考下发方的链接,里面也有工程的源文件。

eNSP实验-CSDN博客

图 74 eNSP组网
图 75 eNSP实验

动物园产线团建,逛完之后就去了吃海鲜自助。

图 76 产线动物园团建
图 77 海鲜自助

周日下午也是到食堂一起看S13的总决赛,也是大学最后一次这样大家一起坐下来看比赛,氛围挺棒的,小虎真的是燃烧了自己!十月份和十一月份干的累但是也玩的多。

图 78 西园三楼S13总决赛

十二月:客户定制模块流程、年终汇总

十二月份主要弄了客户定制模块。这个功能就是将客户的定制需求先写入到文件中,然后通过shell脚本读取数据。将客户的数据文件通过mkfs.ubifs、ubinize工具编译成一个分区最终生成 custo.ubi 可 FLASH 直接烧写文件,在启动的时候通过启动脚本手动mount挂载到/mnt节点下。代码中就通过系统调用来读取文件中客户的要求和属性来配置描述客户的结构体,其他地方就根据结构体中的属性值来进行添加或者删除相关功能。这一套流程下来主要是更了解项目的编译过程、整个OLT的启动流程和各个分区挂载的顺序。自己也是在顶层的Makefile中添加了新的目标编译项和shell脚本。12月份产品也是通过了测试正式在公司官网上线了,这也是在市面上第一个产品里有我写的代码,也是刚好12月1日有客户下了单。

图 79 产品在官网上线

年底的时候也是进行了年终总结,第一次制作PPT在产线同事面前汇报工作

图 80 年终汇报

总结和展望:

通过今年的努力也是成功地实现了去年定的目标,然后也是加把劲明年能够顺利转正,在Linux+网络这个领域站稳脚跟。

图 81 2022年定下的目标

校园生活过一天少一天,公司的同事也是叫我珍惜最后半年的大学生活,没事就去旅旅游,看看祖国的大好河山,以后就没这么好的机会了。对于我来说,毕业以后的生活有点憧憬、又有点害怕。没了学生这个身份,不管是生活还是职场都要担起更多的责任,但这也是每个人的必经之路。新的一年的首要任务就是完成毕业设计顺利毕业,给大学生活划上一个句号,交上一份满意的答卷。最后也是祝CSDN的小伙伴和我自己在新的一年能够好好吃饭、好好睡觉、身体健康、平平安安、天天开心。

文章来源:https://blog.csdn.net/weixin_56646002/article/details/135302952
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。