提交显示成功但是没有看到文件_如何向RTThread提交一个BSP?

RT-Thread今天的快速发展和所取得成绩,离不开所有开发者的持续贡献和社区小伙伴的竭力支持。

一、前言

今年6月,我在一款智能混合型的FPGA芯片上,完成了RT-Thread的移植,并向RT-Thread提交了一个完整的BSP,后续又根据审查意见进行了一些完善,最近(11.18)被合并到RT-Thread主分支上。

如果你曾经下载过RT-Thread的源码仓库,在最常用的STM32 BSP上面的smartfusion2,这个BSP就是我提交的了,如果有读者朋友使用过这款芯片,欢迎体验,或者提交BUG。

991e851e15887ac2a421b6a284c70772.png
BSP包

有的朋友可能注意到了,我这里使用的是FPGA芯片,FPGA芯片还能运行RT-Thread吗?准备的说,应该是FPGA片上的处理器可以运行RTOS,这里的处理器,从实现方式来看,包括硬核和软核处理器;从内核种类上来看,包括ARM核或其他内核,如ARM硬核,Altera的NIOS软盒,Xilinx的microblaze软核,还有51软核等,关于FPGA片上处理器,可以参考以下文章:

  • FPGA硬核和软核处理器的区别

  • 除了ZYNQ还有哪些内嵌ARM硬核的FPGA?

此次提交的这个BSP是我第一次向开源项目贡献代码,而且是向这么优秀的国产RTOS操作系统,还是很有成就感的~本篇文章记录如何向RT-Thread或其他开源项目贡献代码,有不准确的地方欢迎大家指正,希望大家支持国产RTOS的发展!

二、RT-Thread遵循的许可协议

RT-Thread的开源协议是进行过调整的,在2018年RT-Thread官方公众号发布的一篇文章[1]中,我们可以知道当时是使用的GPLv2协议,

4bf862a24266431cc9bf9b33083ea099.png
GPLV2

但是现在已经是Apache-2.0协议了。

d104e3ef9bdfd4137ff1e123dfb354bc.png
rt-thread所遵循的开源协议

在贡献代码之前,我们有必要先来了解一下开源项目所遵循的协议,如果你提交成功,开源协议将会约束这些代码被如何使用。从RT-Thread官方GitHub页面,我们可以了解到RT-Thread所遵循的开源协议为:Apache-2.0 License,这个协议有以下特点:

  • 永久权利
    一旦被授权,永久拥有。

  • 全球范围的权利
    在一个国家获得授权,适用于所有国家。假如你在美国,许可是从印度授权的,也没有问题。

  • 授权免费,且无版税
    前期,后期均无任何费用。

  • 授权无排他性
    任何人都可以获得授权

  • 授权不可撤消
    一旦获得授权,没有任何人可以取消。比如,你基于该产品代码开发了衍生产品,你不用担心会在某一天被禁止使用该代码。

有很多人认为开源就是免费,可以随意的使用,其实这个观点是错误的。如果你有自己的开源项目,关于协议的选择可以参考黄工大佬之前总结的[2]:程序猿如何选择开源协议?

开源协议虽然不一定具备法律效力,但是当涉及软件版权纠纷时,开源协议也是非常重要的证据之一。

三、SmartFusion2 BSP简介

这个BSP是移植 RT-Thread 操作系统到一款 FPGA 芯片——M2S010 ,该芯片属于 Microsemi(现Microchip)SmartFusion2系列,是一款智能混合型FPGA,片上除了 FPGA Fabric 逻辑部分,还包括一个 ARM® Cortex™-M3 内核的 MCU,主频最高 166MHz ,256KB eNVM,64KB eSRAM,集成GPIO、UART、I2C、SPI、CAN、USB等基本外设。

关于 Microsemi,第三大 FPGA 厂商,原 Actel 半导体,2010 年,Microsemi 收购 Actel,2018 年, Microchip 收购 Microsemi。

SmartFusion2 内部框图

35389f6f46ff9f4e96eb2d49fe1aafff.png
Microsemi_Smartfusion2_BD

移植了 RT-Thread 内核,支持线程调度、线程间同步和通信等,已经完成了PIN、Serial设备驱动,FinSH组件默认使用uart0设备。支持GPIO和UART外设,支持SCons构建系统,可以输入scons调用env工具中包含的arm-gcc编译器构建工程,支持以下scons命令:

  • scons:使用arm-gcc编译BSP

  • scons -c:清除执行 scons 时生成的临时文件和目标文件。

  • scons --target=mdk4:重新生成Keil MDK4环境下的工程。

  • scons --target=mdk5:重新生成Keil MDK5环境下的工程。

  • scons --dist:打包BSP工程,包括RT-Thread源码及BSP相关工程文件。

通过添加Kconfig文件,可以使用menuconfig来配置外设,用于生成rtconfig.h。

四、如何提交你的BSP包

0.准备工作

进行提交之前,需要做一些准备工作:

  • 一个GitHub账号
  • Git Windows客户端(git-scm.com/download/win)
  • 一些基本Git命令的使用,如git clone/add/commit/pull/push/checkout等。
  • 了解所使用处理器的启动流程,熟悉基本外设的使用,如GPIO、UART等。

1.Fork并Clone到本地PC

登录自己的GitHub账号,Fork RT-Thread仓库到个人仓库,Fork的意思可以理解为复制一份。

e0fba09007a37cea247662ddf39d9c4d.png
Fork

将远程仓库下载到本地:git clone https://github.com/username/rt-thread,这样就会把远程代码下载到本地。

719232ab89cab800b026f35ae2efbe17.png
Clone

2.创建分支

从 master 分支创建自己的开发分支,如whik_sf2,可以使用命令:git checkout -b whik_sf2

3.开发你的BSP包

这是整个开发过程中最重要,也是最耗时的一步,如果是ARM内核,可以参考STM32的移植过程,如果是其他内核,就需要多用一点时间了。

编码风格参考:https://github.com/RT-Thread/rt-thread/blob/master/documentation/coding_style_cn.md

一个最基本的BSP包,至少应该包括以下部分:

  • 内核移植,支持线程调度、线程间同步和通信

  • 支持GPIO/UART外设,PIN/Serial设备驱动

  • 支持SCons构建系统,可以使用arm-gcc进行编译,支持生成MDK工程,支持dist打包,通过SConscript、SConstruct、rtconfig.py文件实现

  • 支持menuconfig配置外设,用于生成rtconfig.h,通过Kconfig文件实现

  • README文件用于指导开发者如何使用这个BSP包,可以参考其他BSP文件夹下的README文件

提交关于BSP的代码,尽量确保代码改动仅限制于BSP中,而不影响到其他代码,否则可能会被拒绝[3]。

4.提交到远程并发起PR

如果本地进行测试没问题,就可以同步到远程了,三部曲:git add/commit/push,更新到远程之后,就可以发起PR了,在 git 仓库中选择自己修改了的分支,点击 create Pull Request 按钮发起 pull request。

927243914e7b0557e9579c5ba444dd84.png
PR
200c1b64046f7d586d8b887f79a89108.png
PR

在正式发起 Pull Request 之前,需要根据 Preview 里面默认的描述信息即 checklist 仔细核对代码,在没问题的 checklist 对应选项复选框填写[x]确认,注意[x]两边没有空格。比如若代码是成熟版本,请选择成熟版本,且可以添加相应的描述信息,checklist 核对完成才可发起 Pull Request。

bbe93d752cb5d1f858f02ece2d825b1c.png
Checklist
b7d0c5a908f599b2297ef6e03c2ae53f.png
Checklist

第一次为 RT-Thread 贡献代码需要需要签署 Contributor License Agreement。

3289756c721217816f3f2ef8afef4317.png
CLA签署

请确认 CLA 显示签署成功及 CI 编译通过,如下图所示:

0a703583a9227ee8b8cf6986485793cc.png
CLA签署

提交PR之后,就会获得一个PR#号码,在https://github.com/RT-Thread/rt-thread/pulls可以看到所有的PR请求,其中应该会包含你的。如果是Open状态,说明正在进行代码审查,还没有合并到主分支。

5.代码审查

一个完善的BSP,往往不是一次性就能提交成功的。提交PR后,要多看看反馈, 项目管理者会对提交的代码进行审查,如果有问题会在对应的PR下面进行评论,提出修改意见,就像下面这样:

5b3f2c5f433c9b00c9c41a2c20e66b1a.png
修改意见

PR只需要提交一次,每次根据修改意见进行修改之后,项目管理者会看到你的修改,并再次审查修改之后的代码,一般需要2个或以上的项目管理者进行审查,如果代码没有问题,就可以进行以下步骤了。

6.添加到CI自动化编译

如果是提交的完整BSP,可以将BSP添加到CI编译脚本,使用远程主机对BSP进行编译,和本地使用arm-gcc scons编译是一样的,如果本地编译正常,这一步基本也会通过。

d2d6eba2bd1bc8d918734ac4639218e1.png
添加到CI编译

7.等待合并

如果CI编译成功,而且审查通过,这个PR会依次被标记为+1、+2,此时只需要耐心等待几天,直到最终被合并到主分支上。

我提交的这个BSP过程可以参考:

https://github.com/RT-Thread/rt-thread/pull/3661

五、除了代码还能向开源项目贡献什么?

为开源项目做贡献我们可以分为两大类:代码类贡献和非代码类贡献。

代码贡献

  • BUG修复

  • 软件包开发

  • BSP提交

  • 内核开发

非代码贡献

  • 撰写和改进文档

  • 通过实例来展示RT-Thread的使用

  • 为RT-Thread撰写教程,如学习笔记、常见问题等

  • 官方社区发布自己的经验文章,或积极回复帖子的问题

六、注意事项

  • 不要使用非GitHub账号提交

  • 不要使用不同账号提交Commit之后提交PR,会导致CLA签署失败

  • 编程风格遵守documentation 目录下的 coding_style_cn.txt文件。

  • 不接受5个以上的Commit

七、总结

向开源项目贡献代码,提交PR,可以通俗的理解,这里摘自知乎[4]网友的一段解释:

我尝试用类比的方法来解释一下pull reqeust。想想我们中学考试,老师改卷的场景吧。你做的试卷就像仓库,你的试卷肯定会有很多错误,就相当于程序里的bug。老师把你的试卷拿过来,相当于先fork。在你的卷子上做一些修改批注,相当于git commit。最后把改好的试卷给你,相当于发pull request,你拿到试卷重新改正错误,相当于merge。

当你想更正别人仓库里的错误时,要按照下面的流程进行:

先 fork 别人的仓库,相当于拷贝一份别人的资料。因为不能保证你的修改一定是正确的,对项目有利的,所以你不能直接在别人的仓库里修改,而是要先fork到自己的git仓库中。clone 到自己的本地分支,做一些 bug fix,然后发起 pull request给原仓库,让原仓库的管理者看到你提交的修改。

原仓库的管理者 review 这个 bug,如果是正确的话,就会 merge 到他自己的项目中。merge 的意思就是合并,将你修改的这部分代码合并到原来的仓库中添加代码或者替换掉原来的代码。至此,整个 Pull Request 的过程就结束了。

参考资料

[1]. 如何开启RT-Thread社区贡献之路https://mp.weixin.qq.com/s/JfVYB0yUcbyxa5EVWY4DKw

[2]. 五种开源协议(GPL,LGPL,BSD,MIT,Apache)

https://www.oschina.net/question/54100_9455

[3]. 在Github上为RT-Thread贡献代码,为自己的人生涂色https://mp.weixin.qq.com/s/pPGunFzGcfz01pugNnWCiA

[4]. GitHub 的 Pull Request 是指什么意思?https://www.zhihu.com/question/21682976


  • 我的博客:www.wangchaochao.top

  • 我的公众号:mcu149

ebf9af9e7e7e99eb925daa7fe8512160.png

由于微信文章不支持超链接,文中出现的软件、程序等文件下载,可以点击"
如果觉得我的文章对你有所帮助,可以随手点“好看”分享,你的支持将是我持续更新的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinForm中使用WPF的控件

在WinForm中可以使用WPF中的控件,或者由WPF创建的自定义控件; 步骤1:创建WinForm工程; 步骤2:在WinForm工程的解决方案资源管理器中,在刚刚创建的WinForm解决方案中新建或者添加现有的WPF用户控件工程&…

docker php composer 使用_「PHP编程」如何使用Docker制作自己的LNMP/LAMP镜像

LNMP和LAMP是PHP常用的两种运行环境,L代表Linux,N代表Nginx,A代表Apache,M代表Mysql,P代表PHP。在文章《「PHP编程」安装开发环境太烦?告诉你几个简单方法,分分钟搞定》中我们介绍了&#xff0c…

中天数相减获得差_Power BI 了解DAX中LASTDATE和MAX之间的区别

许多刚开始使用DAX的小伙伴在使用LASTDATE搜索某个时间段内的最后日期。或者他们使用NEXTDAY检索给定日期之后的日期。尽管这些函数可以实现它们所承诺的功能,但它们并不打算在简单的表达式中使用。相反,它们是设计用于时间智能计算的表函数。错误地使用…

python gif_python 将png图片格式转换生成gif动画

先看知乎上面的一个连接 用Python写过哪些【脑洞大开】的小工具? 这个哥们通过爬气象网站的气象雷达图,生成一个gif的动态图。非常有趣且很实用,那咱也实现下。 我们先实现一个从GIF提取帧的代码 我们这有个gif代码如下: from PIL…

HTTP代理原理以及HTTP隧道技术

通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口号,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客…

goland环境配置_Goland辅助工具goimports和gomodules

1、goimports工具goimports工具是Go官方提供的一种工具,它能够为我们自动格式化 Go 语言代码并对所有引入的包进行管理,包括自动增删依赖的包引用、将依赖包按字母序排序并分类。我们在使用Goland IDE的时候,建议使用goimports工具。它具备包…

石头剪刀布python代码_python实现石头剪刀布程序

本文实例为大家分享了python实现石头剪刀布的具体代码,供大家参考,具体内容如下 概述: 如果你和我一样是一个有着其他语言基础的编程者,那我想这个小程序对于你来说是小case。由于本人初学Python,就先拿这个熟悉熟悉一…

ubuntu/wireshark --Lua: Error during loading: [string /usr/share/wireshark/init.lua]:45问题解决

错误如下: 解决方案:修改init.lua 直接运行wireshark的话会报错: Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:45: dofile has been disabled 要对其进行修改,终端运行 sudo gedit /usr…

ubuntu下IP、DNS配置

一、配置ip ubuntu的网络配置信息放在 /etc/network/interfaces 中,如果配置动态获取ip,则在上述文件中加入以下内容:auto eth0iface eth0 inet dhcp如果配置静态ip,则添加如下内容:auto eth0 iface eth0 inet statica…

python向空列表添加列表_Python列表核心知识点汇总

千里之行,始于足下。要练成一双洞悉一切的眼睛,还是得先把基本功扎扎实实地学好。今天带大家仔细温习一下Python的列表。温故而知新,不亦说乎。当然,温习的同时也要发散思考,因为有些看似无关紧要的、约定俗成的语言习…

sharepoint2010的弹出等待提示的对话框

根据MSDN的资料。我做了个测试&#xff0c;代码如下&#xff1a; <% Assembly Name"$SharePoint.Project.AssemblyFullName$" %> <% Assembly Name"Microsoft.Web.CommandUI, Version14.0.0.0, Cultureneutral, PublicKeyToken71e9bce111e9429c" …

java中输出值保留四位小数_Java工程师(3).变量和数据类型

变量什么是变量变量是内存中的一块存储空间&#xff0c;用于保存Java程序准备使用的数据。可以为变量赋予一个简短并易于记忆的名字方便我们使用变量的值。int 变量的声明因为经常要保存一些数据&#xff0c;所以变量是很常用的。使用变量必须先声明变量&#xff1a;int 变量的…

扫描路径_npj: 纳米团簇表面的自动扫描—吸附位点和扩散路径

海归学者发起的公益学术平台分享信息&#xff0c;整合资源交流学术&#xff0c;偶尔风月金属纳米团簇常用于催化&#xff0c;因具有较高的分散性&#xff0c;应用领域不断扩大。与较大的金属纳米颗粒相比&#xff0c;其固有活性通常要高出数倍。这种高出的催化活性主要归因于其…

pjsip的编译及简单使用

1.下载下载地址&#xff1a;http://www.pjsip.org/download.htm我下载的是pjproject-1.12.zip2.编译将下载的文件解压后&#xff0c;目录下有pjproject-vs8.sln&#xff0c;可以直接使用vs2005打开&#xff0c;目录下的readme.txt文件中有编译说明&#xff0c;关于windows下的注…

IOS之导航控制器与表视图

7.1 导航控制器 7.2 创建第一级控制器 7.3 第一个二级控制器 7.4 第一个三级控制器 7.5 第二个二级表控制器 7.6 第三个二级表控制器 7.7 第四个二级表控制器 7.8 第五个二级表视图控制器 7.8 第六个二级表视图控制器 7.1 导航控制器 关于导航控制器和表视图 导航控制器和表视图…

gin redis 链接不上_Redis 高并发问题,及解决方案!

&#xff08;一&#xff09;redis技术的使用&#xff1a;redis真的是一个很好的技术&#xff0c;它可以很好的在一定程度上解决网站一瞬间的并发量&#xff0c;例如商品抢购秒杀等活动。。。redis之所以能解决高并发的原因是它可以直接访问内存&#xff0c;而以往我们用的是数据…

任务管理平台_软件品质评测系统任务分发管理平台

testkuaibao|软件测试自学公众号1●为什么需要任务分发平台●在一个基本的评测系统中我们有了评测执行工具、评测数据、评测环境就能进行一次评测任务的执行&#xff0c;但现在是大数据时代&#xff0c;我们更多的需求是针对大量数据进行评测。比如在输入法评测中我们有10000个…

[转载]Visual Studio 2010敏捷利剑:详解Scrum

Visual Studio 2010敏捷利剑:详解Scrum 【IT168 专稿】随着微软Visual Studio 2010 Ultimate Beta2版本的发布&#xff0c;除了它提供协同一致的ALM(应用程序生命周期)管理工具外&#xff0c;MSF for Agile Software Development过程框架从4.2升级到5.0&#xff0c;并且是以Scr…

网站收录工具(php导航自动收录源码)_10步把企业网站优化做到极致,SEO优化的核心知识...

对于企业网站优化&#xff0c;重要的就3点&#xff0c;内容原创、外链建设、内部优化&#xff0c;其它网站优化也会涉及到这些&#xff0c;但是企业站就变的简单的多了&#xff0c;下面10步让你把企业网站优化做到极致。第一步&#xff1a;首先域就是让搜索引擎选择我们网站的主…

mysql not is null_转!!mysql 字段 is not null 和 字段 !=null

今天在查询数据时&#xff0c;查到包含一条某个时间startTime(该字段默认为null ) 为null的记录&#xff0c;想把它过滤&#xff0c;加了 startTime! null 的条件&#xff0c;结果记录都没了&#xff0c;应该用条件 is not null。转自&#xff1a;https://segmentfault.com/a/1…