SIC实验室23届第九次学习目标
现在,我们开始了解关于组队参加全国大学生智能汽车竞赛,你还需要具备的前置知识。
前言
51单片机的学习到中断系统与定时器就先告一段落,后面的内容我们较少应用,就不再安排学习任务,感兴趣的同学随时可以使用实验室内开发板自行学习。
本文档内容较长、图片较多,同学们可以访问karubon.moe(慢到可能无法访问)或其镜像站(速度相对快,但还是很慢)获得良好的阅读体验。
全国大学生智能汽车竞赛是本实验室的核心项目,我们过去一个多学期以来所学习的C语言、51单片机让我们获得了参与竞赛的软件基础知识。现在,我们开始了解关于组队参加全国大学生智能汽车竞赛,你还需要具备的前置知识。
学习内容
由于编辑匆忙,本文档必然存在不足之处。遇到表述不清的地方还请活用搜索引擎或者发钉钉询问我。感激不尽。
团队协作工具
我们已经知道,这个竞赛并不是可以一人完成的竞赛(或者说如果有这样的实力,我们就不会出现在这里),因此,一个类型的赛题,我们会组成一只小组——通常是两名软件手与一名硬件手协作完成。这就要求我们的软件手们必须掌握协作的能力和工具。
什么,你是两硬一软的独狼软件手?即使如此,学习使用下面的工具依然是极有益的。具体原因会在下面提及。
能力需要慢慢磨合,所以先来掌握工具吧。
Git——版本控制系统
Git是一种可以智能追踪文件中的更改的版本控制系统(VCS)。在你和组员同时对同一文件进行更改时,Git的价值就体现出来了。
版本控制系统跟踪我们在项目上进行协作时的更改历史记录。当我们对项目进行更改时,可以随时恢复项目的任何早期版本。
我们可以查看项目历史记录以找出:
- 进行了哪些更改?
- 由谁进行了更改?
- 何时进行了更改?
- 为什么需要更改?
VCS为每个贡献者提供统一且一致的项目视图,显示已经在进行中的工作。查看透明的更改历史记录、谁进行了更改,以及它们如何为项目开发做出贡献,可帮助团队成员在独立工作时保持一致。
在分布式版本控制系统中,每个开发人员都有项目和项目历史记录的完整副本。与曾经流行的集中式版本控制系统不同,分布式版本控制系统(DVCS)不需要与中央存储库的持续连接。Git是世界上最流行的分布式版本控制系统。
Git允许我们在一个地方查看任何项目的更改、决策和进度的整个时间线。从我们访问项目历史记录的那一刻起,就拥有了理解它并开始参与所需的所有上下文。
我们在每一个地方上传和下载代码。使用像Git这样的DVCS,工作可以随时随地进行。
Git项目包含与项目关联的文件和文件夹的整个集合,以及每个文件的修订历史记录。文件历史记录在时间上显示为快照,称为提交。提交可以组织成多个开发行,称为分支。
由于Git是DVCS,因此存储库是独立的单元,任何拥有存储库副本的人都可以访问整个代码库及其历史记录。
使用命令行或其他易用性接口,Git存储库还允许:与历史记录交互、克隆存储库、创建分支、提交、合并、比较不同版本的代码更改等。
受限于篇幅,本文不介绍Git的光荣历史或者它的底层原理,感兴趣的同学可以访问Git官方的文档了解更多。
现在我们安装它。
访问Git官网,点击页面中间偏左下的Downloads,然后点击Downloads for Windows下载,按默认选项安装即可。
安装Git之后,要做的第一件事就是设置你的用户名和邮件地址。这一点很重要,因为每一个Git提交都会用到这些信息,它们会写入到你的每次提交中,你无法再更改这些提交中的信息。
在桌面(或者其他文件夹)右键菜单中(可能需要“显示更多选项”)选择Git bash here,输入并执行下面命令(美元符号不用输入):
1 | $ git config --global user.name "YourName" |
记得把YourName
和YourEmail@example.com
改成你实际使用的()。
--global
参数将使更改是全局性的,之后你在这个系统上的操作都会默认使用此信息。
Gitee或者GitHub——代码托管平台
Gitee(码云)是开源中国于2013年推出的基于Git的代码托管服务,目前已经成为国内知名的代码托管平台,提供中华人民共和国本土化的代码托管服务。
GitHub是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。
通过将代码存储在GitHub上的“存储库”中,你将可以:
- “展示或共享”你的工作。
- 持续“跟踪和管理”对代码的更改。
- 让其他人“审查”你的代码,并提出改进建议。
- 在共享的项目中开展“协作”,无需担心这些更改会在准备好集成更改之前影响协作者的工作。
- 协作式工作是GitHub最基本的功能之一,该功能由开源软件Git实现,而GitHub是以该软件为基础进行构建的。
其实我会更喜欢GitHub,文档清晰齐全,比Gitee使用方便很多。但由于众所周知的原因,这里我们采用Gitee作示范。
克服众所周知的原因事实上并不困难,使用GitHub是可行的,你看到的这个网站正是托管在GitHub Pages上。
但真正的问题是什么呢?你和你的组员通常需要使用同一仓库完成协作。而且由于Gitee和GitHub储存库的默认分支不同,在两边仓库同时上传的时候可能会有点小麻烦,虽然这是可以解决的。
注册Gitee账号
进入Gitee网站,从首页右上角点击“注册”或点击“加入Gitee”即可注册个人账号。
在Gitee的注册界面依次填入各项,注意邮箱应该和你在Git中填写的完全一致。
创建第一个仓库
在注册完成并成功登录Gitee账号后,我们可以开始创建自己的第一个仓库。
- 通过网站右上角的「+」号,选择“新建仓库”,进入新建仓库页面。
- 在新建仓库页面填写仓库信息。仓库相关概念说明如下:
- 仓库名称:仓库的名称,用于仓库命名。
- 归属:仓库归属账户,创建成功后该账户默认为仓库的拥有者(管理员)。
- 路径:仓库的git访问路径,由用户个性地址+仓库路径名称组成。创建仓库后用户将通过该路径访问仓库。
- 仓库介绍:仓库的简单介绍。
- 是否开源:设置仓库是否为公开仓库,公开仓库对所有人可见,私有仓库仅限仓库成员可见。
- 选择语言:仓库主要开发用的编程语言。
- 添加.gitignore:系统默认提供的git忽略提交的文件模板,设置.gitignore后将默认忽略指定目录/文件到仓库。
- 添加开源许可证:如果仓库为公开仓库,可以添加设置仓库的开源协议,作为对当前项目仓库和衍生项目仓库许可约束,开源许可证决定他人可以如何使用你的这个开源项目。
- Readme:项目仓库自述文档,通常包含有软件的描述或使用的注意事项。
- 使用模板文件初始化仓库:使用Issue或Pull Request文件模板初始化仓库。
- 点击“创建”,即可在Gitee上创建你的第一个仓库。
现在,你应该可以看到下面的页面。
提交第一行代码
在创建完仓库之后,我们通过如下方式,向仓库提交第一行代码。
- 方法一、先将仓库clone到本地,修改后再push到仓库
此处我们以用户账号下命名为Hello-Gitee的仓库为例。对应的仓库地址为:https://gitee.com/ChaoiteC/hello-gitee.git ,在实际实践中,你应该替换为自己仓库的地址。
在硬盘中你想存放代码文件的位置的右键菜单中(可能需要“显示更多选项”)选择git bash here,输入并执行下面命令:
1 | $ git clone https://gitee.com/用户个性地址/hello-gitee.git #将远程仓库克隆到本地 |
在克隆过程中,如果仓库是一个私有仓库,将会要求我们输入Gitee的账号和密码。按照提示输入即可。
如果你没有初始化仓库,Git会提示warning: You appear to have cloned an empty repository.
,但这并不影响我们在当前目录下clone了我们的仓库。
打开文件夹,如果你在文件资源管理器中开启了显示隐藏文件和文件夹,这时候你会发现目录下出现了一个.git
文件夹,这个文件夹下储存了Git工作所需的文件。
现在我们以新建README文件为例,演示如何将我们新建、修改或删除的代码推送到仓库。
在目录下新建一个名为README.md
的文件,通过任意的文本编辑器在文件内输入下面内容:
1 | ### 介绍 |
保存后,相对于原本的空仓库,我们的本地储存库就发生了变动。
现在在仓库根目录下逐行执行下面命令:
1 | $ git add . #将当前目录所有文件添加到git暂存区 |
像这样——
现在,在浏览器上刷新你的仓库页面,你应该能看到你刚刚做出的改动。
什么是README?
自述文件(英文:Readme),是随着软件发布的一种帮助文档,里面通常包含有软件的描述或使用的注意事项。这种文件通常是纯文本文件,也有RTF、DOC或Markdown格式的自述文件。文件名通常是以大写英文字母组成,这是因为大写字母比小写字母有着较小的ASCII码,因此在一些以ASCII顺序来排序文件名称的操作系统里,它会被列在文件列表的第一个。即使这些人没有关于自述文件的知识,这种文件的特殊命名方式也能够使任何人迅速发现。
当你的仓库里存在一个README文件的时候,Gitee和GitHub会在仓库的首页显示这一文件的内容,方便使用者快速阅读它。认真编写README文件是一个优秀开发者应该养成的习惯。
- 方法二、本地初始化一个仓库,设置远程仓库地址后再做push
和方法一的差别,在于先创建仓库。
1 | $ git init |
这样就完成了版本的一次初始化。
接下来,进入你已经初始化好的或者克隆仓库的目录,然后执行:
1 | $ git pull origin master |
这个命令会使Git将代码从远端拉取到本地。
修改代码之后:
1 | $ git add . |
如果需要账号密码的话就输入账号密码,这样就完成了一次提交。此时,你可以在你的个人面板、仓库主页查看到你的提交记录。
在新建仓库时,如果在Gitee平台仓库上已经存在readme或其他文件,在提交时可能会存在冲突,这时我们要选择是保留线上的文件或者舍弃线上的文件,如果要舍弃线上的文件,则在推送时进行强制推送-f
(除非你知道自己在做什么,否则强烈不建议这么做):
1 | $ git push origin master -f |
如果想保留线上的文件,则先执行:
1 | $ git pull origin master |
通过VS Code的图形化页面使用Git
如果你不擅长命令行的操作方式,不妨安装VS Code吧!(你可以参考VSCode的官方文档进行安装。)
Visual Studio Code集成了源代码控制管理(SCM),开箱即支持Git。VS Code Marketplace上的扩展提供了许多其他源码控制提供商。
在开始使用前,确保已安装 Git。VS Code将使用计算机上已安装的Git(至少版本 2.0.0),因此在使用这些功能之前,需要先安装Git。
在左侧的活动栏中,源代码控制图标始终显示当前存储库中有多少更改。选择该图标将显示当前存储库更改的详细信息:变更、已暂存变更和合并变更。
点击每个项目将详细显示每个文件中的文本更改。请注意,对于未暂存的更改,右侧的编辑器仍然可以让您编辑文件:请随意使用它!
您还可以在 VS Code 的左下角找到存储库状态的指示器:当前分支、变更指示器以及当前分支的传入和传出提交数量。您可以通过点击该状态指示器并从列表中选择Git引用来签出存储库中的任何分支。
现在我们来演示如何通过VS Code初始化仓库、拉取和推送代码。
初始化仓库和拉取代码
打开一个文件夹,在侧边栏中选择源代码管理。如果文件夹没有初始化Git,VSC会提示当前打开的文件夹中没有Git存储库
。
这时我们选择「初始化仓库」,VS Code将自动执行相关的Git指令,完成仓库初始化。
接下来点击“源代码管理”栏右侧的“更多操作键”>远程>添加远程存储库,将仓库URLhttps://gitee.com/用户个性地址/hello-gitee.git
输入到屏幕正上方的输入框中,按下回车,接着提供存储库名称(这里是hello-gitee
),将远程存储库添加到Git中。
有趣的——在现代,大多数软件或平台的默认分支已经是main
,但Gitee的默认分支仍是master
。这导致VS Code在从尝试远端拉取时会发生警告:[warning] No such branch: main.
现在,我们不得不多执行一步,将工作区的分支切换回master
。
你也可以选择把主分支改为
main
,但这会比较麻烦。
点击“源代码管理”栏右侧的“更多操作键”>签出到…,在屏幕正上方处选择有云朵标志的hello-gitee/master ********处的远程分支【远程分支】
一栏。
这一操作等价于命令行中的:
1 | $ git checkout --track hello-gitee/master |
现在可以点击“源代码管理”栏右侧的“更多操作键”>拉取 来从远程存储库中拉取(pull)代码到本地。
推送代码
在我们修改了代码之后,需要将其推送(push)到远程储存库,使他人可以查看和下载。
一旦你开始修改代码,VS Code将开始向装订线指示器(左)和概览标尺添加注释以提示你做了哪些修改。
- 红色三角形表示已删除的行。
- 绿色条表示新增的行。
- 蓝色条表示修改过的行。
当我们完成了修改(记得进行保存),在侧边栏打开“源代码管理”页面,审视我们即将提交的代码。
点击左侧边栏中任何提示已经更改的文件,将会在主视图中打开差异比较器。
一旦发生合并冲突,VS Code就会识别并突出显示,并有内联操作来接受一项或两项更改。
合并冲突指的是在Git中,当尝试将两个或多个不同的分支合并时,Git无法自动决定如何合并它们的改动时所发生的情况。
为了帮助解决合并冲突,VS Code提供三路合并编辑器,可以在其中交互式地接受传入和当前的更改,并查看和编辑合并后的结果文件。单击带有 Git 合并冲突的文件右下角的“在合并编辑器中解决”按钮,即可打开三路合并编辑器。
三路合并编辑器显示传入更改(左)、当前更改(右)以及合并结果(底)的独立视图。冲突会被突出显示,并且可以使用 CodeLens 按钮来解决。
三路合并编辑器允许通过接受其中一个或两个变更来解决冲突。也可以手动编辑合并的结果。
对于某些冲突,合并编辑器会显示一个“接受组合”按钮。接受组合会智能地合并两个变更,从而解决当前的冲突。这对于位于同一行但未涉及相同字符的更改特别有用。
使用“忽略”按钮来既不接受传入更改也不接受当前更改,但标记冲突已解决。这会将冲突区域重置为未进行任何更改之前的状态。
可以使用结果编辑器右侧的冲突计数器来跟踪未解决的冲突数量。单击计数器会跳转到下一个未解决的冲突。一旦所有冲突解决完毕,您可以通过在右下角选择“完成合并”来完成合并。这会将文件暂存,并关闭合并编辑器。
当我们解决了合并冲突,就可以正常进行提交。
点击“源代码管理”栏中的“提交”按键,将会在主视图中打开COMMIT_EDITMSG
(提交消息)的编辑页面。
提交消息对于记录代码更改的历史非常重要,因为它们帮助其他开发者理解提交所做的修改。一个优秀的提交消息应该简洁明了地描述你所做的更改,并提供足够的信息,使其他人能够理解为什么这些更改是必要的。
输入提交消息之后,点击右上角的“✓”按钮(接受提交消息),VS Code和Git就会做好提交的准备。点击“源代码管理”栏中的“同步更改”按键,将更改推送(push)到远程存储库,你的组员就可以在他的设备上同步更改,只需要点击“源代码管理”栏右侧的“更多操作键”>拉取 来从远程存储库中拉取(pull)代码到本地。
逐飞科技开源库
成都逐飞科技有限公司长期以来是全国大学生智能汽车竞赛的协办单位,为竞赛提供大量的软硬件服务。逐飞科技为竞赛开发的开源库以简洁易懂、容易上手著称。
在之后的日子里,我们会通过实验室内搭载英飞凌TC377芯片的逐飞学习板来继续学习关于竞赛的软件知识。
下载开源库
访问逐飞TC377开源库的仓库首页。点击文件目录右上角的“克隆/下载”按钮。然后选择下载ZIP。
注意到页面上提供了克隆的方法吧?感兴趣可以试试。
安装开发环境
AURIX™ Development Studio(简称ADS)是基于TriCore™的AURIX™微控制器系列的免费集成开发环境(IDE)。它是一个全面的开发环境,包括Eclipse IDE、C编译器、多核调试器、Infineon低级驱动(iLLD),没有时间和代码大小限制,可以进行应用代码的编辑、编译和调试。
结合众多的代码示例项目,该IDE可用于评估AURIX™微控制器系列的强大架构。
它支持将Microsoft Windows 10作为主机操作系统(OS)。
以上是官方介绍,但不得不说,AURIX™ Development Studio真的是很难用。ADS的下载方式写在开源库的README文档里面,请自行翻阅。
使用前务必仔细阅读逐飞科技AURIX Development Studio使用说明书–逐飞科技 V1.6 PDF文档。
安装和使用时的常见问题:
- 工作空间/路径(workplace)不能含有中文。
- 工程文件夹需复制到工作空间。
- 导入的工程需要设为ACTIVE状态,若是ACTIVE-DEBUG则可以正常编译,若是ACTIVE-DEFAULT不能编译会报错找不到路径。
- 有时候导入空的开源库不行,尝试导入例程就正常,很玄学。
- 添加文件可以直接拖拽,也可以在工程文件夹添加,添加后需要refresh。
- 编译成功不代表能正常烧录,需安装DAS驱动,且正常显示为tricore…才可以。
开源库结构简介
感觉这一小节写得很烂?是的,我也这样认为。
1 | ./Seekfree_TC377_Opensource_Library |
逐飞其他芯片的开源库结构大同小异。
通常来说,想要了解一个程序,我们应该从程序的进入点cpu0_main.c
开始。
GPIO
GPIO(General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0-P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO)。
学习任务
各组在Gitee或GitHub上创建一个公开仓库,将组员以开发者或更高权限加入。
参考Example/E01_gpio_demo,编写代码,使核心板上4颗LED依次闪烁,并能通过按键或拨码开关改变流水方向。
尝试烧录到学习板中运行。将所有源代码上传到仓库中。并在2024年4月14日(星期日)20:40之前将仓库首页的链接发送给我。
参考资料
GitHub官方文档(https://docs.github.com/zh/get-started)
Gitee帮助中心(https://gitee.com/help)
Pro Git(https://git-scm.com/book/zh/v2)
VS Code官方文档(https://code.visualstudio.com/docs/sourcecontrol/overview)