专栏首页嵌入式iot如何在树莓派2上移植rt-thread操作系统

如何在树莓派2上移植rt-thread操作系统

1.准备工作

硬件

1.树莓派2开发板(如果没有,可以直接用qemu替代)。

软件

1.window上可以采用rt-thread提供的env工具。

2.Ubuntu上需要装scons,因为rt-thread操作系统是通过scons组织的。

3.git工具,进行代码管理

4.qemu,模拟开发板

5.arm gcc版本gcc-arm-none-eabi-5_4-2016q3

以下文章的实验都是在Ubuntu16.04下进行,用qemu仿真树莓派2。实际硬件也进行过测试,效果一样。

2.移植思路

树莓派2的启动上电流程是先启动gpu,从sd卡中读取kernel固件。所以如果要自己实现kernel,也需要做类似的处理,编译一个kernel7.img的固件放在sd卡中。如果直接用qemu操作,那么就不需要这么多复杂的操作,直接本地模拟就可以了。

如果要实现移植rt-thread操作系统到树莓派上,要点是什么?

2.1.启动代码

当树莓派的gpu加载kernel7.img到sdram开始执行的时候,首先需要做必要的初始化工作。所以链接地址0x00008000需要正确的给予。初始化必要的设备,由于前期没有分配栈,只能使用汇编进行初始化。简而言之,进行必要的操作。那么这些必要的操作有那些?由于树莓派2的芯片采用bcm2835,里面有4个核在工作,所以只能让一个核工作,其他三个核睡眠。然后关闭mmu,分配栈空间,清除bss段。此时可以跳转到C语言去执行相关的逻辑操作了。毕竟C语言的操作比汇编看起来让人清晰。

2.2.中断向量初始化

这里需要指定中断向量表,指定中断函数的处理函数。根据armv7的体系架构,整理中断向量表的偏移。然后初始化rt-thread中断向量表的初始化。当然,这些已经在操作系统里面完成了。

2.3.tick

rt-thread操作系统需要有时钟tick,也就是定时中断。对于这部分来说,需要自己实现一个timer中断。在实体硬件上,我们可以采用的是树莓派内部自带的一个名为SP802的时钟模块产生的中断,但是qemu并没有实现,只实现gtimer。所以为了保证硬件和qemu都能运行,实验中采用的是gtimer。

2.4.上下文切换

如果要实现中断现场的返回和线程切换现场的返回,少不了上下文切换的逻辑,也就是context。这部分主要完成的是切换上下文前保存状态寄存器,切换完成后恢复寄存器的内容。这样就能够恢复上次的现场了。

2.5.uart

如果要调试rt-thread程序,当然少不了串口打印,rt-thread操作系统的一大特色就是支持shell。可以通过命令来操作系统,查看信息。树莓派有两个串口,一个是直接通过内部时钟驱动的mini uart。另外一个是pl011串口模块,两者操作的寄存器地址不一样。

以上5点也是整个最小系统移植关键。现在笔者已经将这个树莓派rt-thread最小系统移植上去了。有兴趣的自己可以玩一下。

https://github.com/bigmagic123/raspi-littlevgl。

这个项目的是为了在树莓派上移植littlevgl。初代版本就是最小系统。

3.操作步骤

首先需要将代码clone下来。

git@github.com:bigmagic123/raspi-littlevgl.git

然后进入到工程目录/bsp/raspi2。这里需要修改的是rtconfig.py文件中的GCC路径。

这里需要改成自己的gcc路径。

然后打开vscode上的Terminal --> new Terminal可以看到控制台窗口的出现。

输入scons进行编译。现象如下则表示成功。

QEMU运行

如果此时电脑上已经装了qemu,那么直接启动脚本即可正常运行了。

此时表示系统正常运行成功。

树莓派2硬件运行

连接树莓派用USB转TTL模块。然后将刚才编译好的文件放到SD卡目录中。

SD卡文件只留下这三个文件就可以了,其中kernel7.img就是我们刚才用scons编译出来的rtthread固件。

4.代码分析

相关的内核代码可以在rt-thread的官方网站上进行下载。笔者只是改了一些bsp文件。

CPU相关

与cpu相关的在bsp/raspi2/cpu目录下。

启动从start_gcc.S开始。上下文切换在context_gcc.S文件中。

外设相关

外设相关的代码在driver目录下。目前只有实现uart和tick。

用户操作代码

用户操作代码在applications文件中,其中启动的第一个线程就是在main函数中

int main(int argc, char** argv) { rt_kprintf("Hello RT-Thread!\n"); while(1) { rt_kprintf("cur tick is %d\n",rt_tick_get()); rt_thread_delay(1000); } return 0; }

如果用户需要自己创建线程,可以参考rt-thread官方文档进行操作。https://www.rt-thread.org/document/site/

5.后期计划

系统移植只是其中的一个很小的步骤,打算先做一下littlevgl的移植,相关的移植会在后续的文章中不断的更新。采用qemu模拟器进行rtthread+littlevgl图形界面的开发和实验。也欢迎大家多多支持,参与这个项目的推进工作。可以直接加我qq邮箱565658641@qq.com联系我。或者到github发issue来推进这个项目。让更多初学rt-thread与littlevgl的人更加方便。

本文分享自微信公众号 - 嵌入式IoT(Embeded_IoT),作者:bigmagic

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 高效搭建树莓派3b rt-thread的开发环境

    由于电子设备的普及,越来越多人拥有树莓派,不管是作为电子极客,还是作为普通普通人,很多人都会玩一下树莓派,可以学习一些c语言,也可以学习嵌入式。...

    bigmagic
  • 记一次和熊大的面谈经历

    “ 熊大,rt-thread创始人,国产物联网操作系统rtos的先驱者。他的真名叫做熊普翔,江湖人称熊大。在物联网和嵌入式圈子里,一般都是大神级别的大佬。怀着崇...

    bigmagic
  • rt-thread系统裁剪指南

    在设计嵌入式RTOS系统逻辑时,我们往往希望系统简洁并且代码可控,这样我们做方案时心里才有底。下面我们来从原理层面和实现层面上讲一下rt-thread裁剪相关的...

    bigmagic
  • 没有 Freestyle 照样可以帅!这个小程序,让你变得很「嘻哈」

    随着综艺节目《中国有嘻哈》的热播,节目中制作人吴亦凡的这个「金句」成为了网络上一个热门的梗。

    知晓君
  • 运行CrossWalk报错:计算机中丢失 api-ms-win-core-winrt-string-l1-1-0.dll

    kongxx
  • Django项目中使用celery做异步任务

    在写项目过程中经常会遇到一些耗时的任务, 比如:发送邮件、发送短信等等~。这些操作如果都同步执行耗时长对用户体验不友好,在这种情况下就可以把任务放在后台异步执行...

    程序员同行者
  • 完整部署CentOS7.2+OpenStack+kvm 云平台环境(1)--基础环境搭建

    公司在IDC机房有两台很高配置的服务器,计划在上面部署openstack云平台虚拟化环境,用于承载后期开发测试和其他的一些对内业务。 以下对openstack的...

    洗尽了浮华
  • 完整部署CentOS7.2+OpenStack+kvm 云平台环境

    1.1 百度百科 OpenStack 是一个由 NASA ( 美国国家航空航天局)和 Rackspace 合作研发并发起的,以 Apache 许可证授权的自...

    菲宇
  • 惠普的云能否站稳脚跟?

    过去几个月中,惠普在用其Helion平台努力成为云业务的顶层厂商时,找到了全新的能量,他们在过去两年间,拥有了一批开发资源的应用、少量经验丰富的执行者以及十亿美...

    静一
  • 【NDN实验】ndnSIM 2.0: A new version of the NDN simulator for NS-3 全文翻译

    Spyridon Mastorakis, Alexander Afanasyev, Ilya Moiseenko and LixiaZhang

    魏晓蕾

扫码关注云+社区

领取腾讯云代金券