在imx6ull(cortex-A7)上运行SKRTOS

发布于:2025-03-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

引言

笔者之前开发了SKRTOS的多个版本,包括数表版本、链表版本、红黑树版本、响应EDF版本,但是,由于笔者时间并不是非常宽裕,测试也并不完全,所以这四个版本有不少bug,并且只支持arm cm3一种架构,目前只是一个玩具。

因为笔者并不是单片机从业者,也并没有使用SKRTOS做过项目,只是对硬件与操作系统感兴趣的爱好者而已。所以,自己写的RTOS自己都不用,是不好意思给别人用的,因此,笔者将其定义为学习型RTOS,项目的重点在于文档教程相关的操作系统设计及源码讲解。

如果后面有时间的话,笔者会修复四个版本中的bug,在经过充分的测试后,会发布release版本。

好了,笔者最近将SKRTOS移植到了imx6ull(cortex-A7)上,算是多支持了一种架构。

请原谅笔者在SOC上跑RTOS,而不是继续支持arm cm4或其他mcu架构。因为笔者手上的单片机,只有RISCV和arm cm3架构的,压根没有cm4架构的mcu。虽然说可以仿真cm4架构,但是有失严谨。所以,笔者只能将目光瞄准SOC了,不过好在手上有2440、imx6ull这些学习用途的开发板。

好了,笔者向各位展示如何在cortex-A7上运行RTOS吧。

仓库:skaiui2/SKRTOS_sparrow at main

环境

一块开发板:正点原子imx6ull mini版,用其他开发板也是可以的,只是步骤不同。

一张SD卡:fat32文件系统,8gb存储,使用USB2.0烧录。

操作系统:ubuntu16虚拟机

串口软件: MobaXterm(其他的串口软件也可以)

环境搭建

首先要安装cmake:

sudo apt-get install cmake

再安装gcc-arm-none-eabi编译器:

sudo apt-get install gcc-arm-none-eabi

添加环境:

vi ~/.bashrc

在文件末尾加上:

export ARMGCC_DIR=/usr

添加图片注释,不超过 140 字(可选)

再使用:wq命令退出。

为了使更改生效,运行命令:

source ~/.bashrc

添加图片注释,不超过 140 字(可选)

运行SKRTOS

读者可以去skaiui2/SKRTOS_sparrow at main下载imxproject文件夹,注意是main分支:

添加图片注释,不超过 140 字(可选)

下载后,将imxproject文件夹放入ubuntu16虚拟机中,这一步可以通过FTP协议相关的软件完成。

例如笔者放的目录就是:/home/用户/DevRTOS

添加图片注释,不超过 140 字(可选)

对于相同的imx6ull开发板:

(不同的开发板请跳转到文末)

进入imxproject/armgcc/down目录:

进入该目录即可,不要忘了之前把文件夹放在了哪里。

添加图片注释,不超过 140 字(可选)

给该脚本赋予权限:

chmod 755 do.sh

添加图片注释,不超过 140 字(可选)

由于每个人的路径设置不同,因此需要修改脚本do.sh配置自己的路径。

使用vi命令,vi do.sh

将其中的路径修改为自己的路径即可.

源文件夹和目标文件夹都应该修改为你自己的文件夹。

添加图片注释,不超过 140 字(可选)

插上usb与sd卡,连接到虚拟机,

注意你的sd卡是不是sdb!如果不是,则需要修改/dev/sdb为你自己的sd卡路径!

添加图片注释,不超过 140 字(可选)

可以通过插上sd卡与拔下sd卡并查看相关设备进行确认:

笔者这里,sd卡就是sdb,因为在拔下sd卡后,sdb消失。

添加图片注释,不超过 140 字(可选)

修改完文件路径和sd卡路径后,执行:

./do.sh

烧录完成后,将sd卡插入到imx6ull中,打开串口软件MobaXterm(其他串口软件也可以),以sd卡模式启动开发板.

读者会发现MobaXterm上不断打印线程运行信息:

其中task1的执行周期是task2的两倍:

添加图片注释,不超过 140 字(可选)

出现以上现象,就说明SKRTOS运行成功了。

读者可以使用vscode与gdb在Linux环境下进行开发。

对于不同的imx6ull开发板:

如果你使用的不是正点原子的imx6ull,请跳转到上一级的armgcc目录:

并使用命令:vi MCIMX6Y2xxx05_ram.ld

添加图片注释,不超过 140 字(可选)

打开配置脚本后,找到以下代码:

添加图片注释,不超过 140 字(可选)

正点原子的imx6ull链接地址是0X87800000,在它的imxdownload工具中直接固定了加载地址为0X87800000,所以m_interrupts以该地址作为起始地址,那么m_text就是:0x87800000 + LENGTH 同理,m_data就是:m_text + 后面的LENGTH。

所以,如果读者使用其他的开发板,只要查看该开发板对应的的链接地址,重新更改下面三个内存段即可。其中m_ocram不用修改。

在更改完后,使用该开发板自带的教程进行sd卡的烧写,最后将SD卡插入到imx6ull中,使用串口工具观察打印情况。

运行成功后,读者可以使用vscode打开文件夹,编写程序。

总结

介绍了如何在imx6ull上运行SKRTOS。

杂谈

目前GitHub上仓库已经有些混乱了,笔者刚开始只是想写一个RTOS,并且尽可能的小,在更完教程后,因为鸟笼效应的原因,笔者加上了IPC机制,又觉得不够灵活,又加上了链表版本,又嫌弃链表O(n)的复杂度,于是加上红黑树版本,又觉得不应该使用固定优先级的算法,于是加上响应EDF版本。

现在,仓库下已经有四个版本了,每个版本的优化方向是不一样的,说实话,笔者也很苦恼,这四个版本都应该分别作为一个仓库管理,但是目前来看,它们的设计思想是相同的,应该被放在一个仓库下,但这样的后果就是,每次移植工程、写文档时,总要完成多份。

或许笔者应当把其中的某些版本单独作为一个仓库,这样能减少一些工作,但是单独维护,总工作却变大了。

项目分支的管理也很犹豫,开始笔者是以教程为主,教程更新了什么内容就单独开一个分支,比如存放手册、实验工程、内存管理工程、移植工程等等,但是,当时是认为写完教程后不再更新内核,GitHub只是存放作用,没想到一直更新到现在,现在看来,这些分支应该被删除并合并。

目前内核的四个版本都有一些小bug,但是,修复好了一个,又发现了下一个,频繁的提交与测试十分耗费时间,而且许多代码,今天认为应该这样写,明天认为应该那样写,频繁的修改。

这些问题或许不是大问题,但是非常麻烦。

想把一件事情做到尽善尽美,就像在一间遍布灰尘的房间打扫,清理完了这边,那边的灰尘又落了下来。