将操作系统移植到新的芯片架构的经验
在将嵌入式系统操作系统移植到不同的芯片架构时,RT-Thread 的维护者们从中学到了什么。
曾经有人问我,为什么计算机被称为 计算机 ,它们做的事情可远不止计算数字。一台现代的个人电脑可以浏览互联网、播放音频和视频、为视频游戏和电影生成漂亮的图形、模拟和预测复杂的天气模式和流行病风险、将建筑和工程蓝图变为现实等等。
计算机之所以能做到这些,是因为所有这些问题都可以归结为数字方程,而计算机的 CPU 其中央处理单元 实际上不过是一个简单的计算器。
为了让 CPU 向硬盘驱动器发送信号以写入数据,或向显示器发送信号以显示图像,它必须接收指令。这些指令是以 代码 的形式出现的,这是一种简明的说法,即必须有人写一个 程序 ,与CPU 说 同样的语言。CPU 理解的是 机器语言,这是一个大多数人都无法理解的比特阵列,大多数人都不可能手动写出来。相反,我们使用像 C、C++、Java、Python 等编程语言。这些语言被解析并编译成机器语言,然后交付给 CPU。
如果你试图用一种它不理解的语言来指示 CPU,它不知道该怎么做。你可以通过尝试用 x86_64 RHEL 镜像启动 树莓派 来体验这种误传尝试的尴尬结果。如果它能工作就好了,但是不能。
将一个操作系统移植到一个新的架构上RT-Thread 项目 为嵌入式系统程序员提供了一个开源的操作系统(OS)。嵌入式领域是非常多样化的,有很多物联网(IoT)、定制工业和业余设备。RT-Thread 的目标是使嵌入式编程对每个人来说都很容易,无论你使用什么设备。有时,这意味着要将一个操作系统移植到一个新的架构上,不管是用于相同架构但指令集略有不同的的芯片,还是用于全新的架构。
一开始处理这个问题可能会有点吓人 你可能不知道从哪里开始或如何开始。这篇文章收集了 RT-Thread 维护者在将 RTOS 移植到新的芯片架构时学到的经验。
你在开始之前需要知道什么这里是一个看似难以逾越的过程的高屋建瓴的观点。这对你的项目来说可能有所不同,但从概念上来说,这是相对普遍的,即使一些具体的细节是不同的:
准备好一个 C 语言的执行环境 确认可以通过串行端口发送和接收字符 确认上下文切换代码可以工作 获取支持的硬件定时器 确认中断程序可以通过串口接收和解析数据对于大多数先进的体系结构,操作系统和用户应用程序运行在不同的权限级别上。这可以防止有功能故障的代码影响操作系统的集成和安全。例如,在 ARMv7-A 架构中,操作系统通常在系统模式下运行,而在 ARMv8-A 中,操作系统可以在 EL2 或 EL3 权限级别上运行。
通常情况下,芯片在通电时以最高权限级别执行启动代码。但在此之后,操作系统会将特权级别切换到其目标模式。
1、执行 C 代码这一步的关键动作是将 块起始符号block starting symbol(.bss)部分设置为零,并设置堆栈指针。
在 C 语言的实现中,未初始化的全局变量和静态变量通常存储在 .bss 部分,它不占用存储设备的任何空间。当程序被加载时,相应的空间被分配到内存中,并被初始化为零。当操作系统启动时,它必须自己做这项工作。
另一方面,操作系统必须初始化堆栈空间并设置堆栈指针。由于 C 语言程序在进入和退出函数时在堆栈上保存和恢复局部变量,所以在调用任何 C 函数之前必须设置堆栈指针。RT-Thread 必须为每个新创建的线程做这个步骤。
2、至少使用一个串行驱动器RT-Thread 通过串口输出信息和日志,这也有助于在移植过程中对代码进行调试。在这个阶段,通过串口 接收 数据是不必要的。当我们第一次在串口上看到我们友好的、熟悉的 RT-Thread 的标志时,我们就知道我们走对了路!
3、确认上下文切换逻辑一个任务的上下文是它的整个执行环境,它包含通用寄存器、程序计数器、堆栈帧的位置等等。当一个新的线程被创建时,RT-Thread 必须手动分配和设置它的上下文,这样调度器就可以切换到新的线程,就像它对其他线程一样。
有三件事需要注意:
首先,当 RT-Thread 启动时,默认情况下中断是禁用的。当任务调度器第一次被启用时,它们就会被启用;这个过程是在上下文切换期间用汇编语言实现的。 第二,当一个线程退出时,下一个调度将开始,这时拥有的资源会被空闲的线程回收。 第三,数据被推入堆栈的顺序必须与从堆栈中弹出数据的顺序一致。一般来说,你希望正常进入主函数和 msh 控制台。然而,在这个阶段无法实现输入控制,因为串行输入中断还没有实现。当串行中断实现后,就可以进行 msh 输入了。
4、设置定时器RT-Thread 需要一个定时器来定期产生中断;它被用来计算自系统启动以来所经过的 滴答 。计数器的编号用于提供软件中断功能,并指示内核何时开始调度一个任务。
设置时间片的值可能是一件棘手的事情。它通常是 10ms 到 1ms。如果你在一个慢速的 CPU 上选择一个小的时间片,大部分时间就会花在任务切换上 不利于完成其他事情。
5、确认串口工作正常在这一步,我们通过串口与 RT-Thread msh 进行交互。我们发送命令,按回车键,然后看着 msh 执行命令并显示结果。
这个过程通常不难实现。不过,有一点要提醒大家。在某些平台上,在处理完串口中断后,别忘了清除中断标志。
一旦串口工作正常,移植过程基本上就完成了。
为了将你的项目移植到不同的芯片架构上,你需要非常清楚地了解你所针对的芯片的架构。熟悉你的项目中最关键的部分的底层代码。通过对照芯片的手册结合大量的实际工作经验,你会了解芯片的特权模式、寄存器和编译方法。
如果你没有需要移植到新芯片的项目,请加入我们;RT-Thread 项目总是需要帮助将 RTOS 移植到新的芯片上!作为一个开源项目,RT-Thread 正在改变开源嵌入式编程的面貌。请在 RT-Thread 俱乐部介绍你自己并寻求帮助!
本文基于 DEV 社区上的 如何将操作系统移植到不同的芯片架构上?,并经许可转载。
via: https://opensource.com/article/21/5/port-chip-architectures
作者:Alan Smithee 选题:lujun9972 译者:wxy 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/50310.html
javalinuxpython开源树莓派程序员相关文章
- 谈谈一颗芯片是如何诞生的
- 华为 达芬奇芯片 架构_寒武纪的AI架构
- 存算一体——后摩尔时代的AI芯片架构[通俗易懂]
- dpu芯片_三星放弃自研架构
- 三大主流芯片架构特点是_zachman架构
- 从零开始的异世界生信学习 GEO数据库数据挖掘--GEO代码-芯片数据分析-1
- Arm急了?高通爆料ARM架构SoC将不允许外部GPU等设计,三星联发科等芯片厂商“被连坐”
- 借助开源RISC-V架构,中科昊芯实现了国产DSP芯片的逆袭
- AMD最强RDNA 3架构GPU发布,小芯片设计、支持DP2.1接口,899美元起
- 美国芯片法案效应显现:将带动3466亿美元投资,创造34708个职位!
- 韩国芯片厂1月库存销售率升至1997年3月以来的新高
- 2021 WAIC·AI开发者论坛 | 大规模语言模型、类脑芯片、量子AI,这就是后深度学习时代的AI未来吗?
- ARM公布全新Armv9架构:10年最大更新、未来装备3000亿颗芯片
- 【系统架构设计师】计算机组成与体系结构 ② ( 冯诺依曼结构 | 哈佛结构 | 常见的芯片 | CPU 微处理器 | DSP 数字信号处理器 | SoC 片上系统 | MCU 单片机 )
- 同样是芯片短缺 苹果的情况为何要比汽车厂商好得多
- [图]ARM推出全新armv9架构:预估五年内装备3000亿颗芯片
- 不涨价了!台积电搁置28nm调价计划:芯片产能过剩时代来了?
- MIT开发新技术:让芯片自己组装自己 轻松实现7纳米
- 专访NovuMind周斌:AI芯片弯道超车,架构和算力没有任何取巧之道|CCF-GAIR 2018