引言
笔者之前开发了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,但是,修复好了一个,又发现了下一个,频繁的提交与测试十分耗费时间,而且许多代码,今天认为应该这样写,明天认为应该那样写,频繁的修改。
这些问题或许不是大问题,但是非常麻烦。
想把一件事情做到尽善尽美,就像在一间遍布灰尘的房间打扫,清理完了这边,那边的灰尘又落了下来。