嵌入式实时操作系统的设计与开发——启动内核

RTOS的引导模式

RTOS的引导是指将操作系统装入内存并开始执行的过程。
在嵌入式系统的实际应用中,针对不同应用环境,对时间效率和空间效率有不同的要求。

  • 时间限制主要包括两种情况:系统要求快速启动和系统启动后要求程序能实时运行。
  • 空间限制主要包括两种情况:Flash等非易失性存储空间限制和RAM等易失性存储空间限制。

通常不可能同时满足两种要求,需根据具体情况进行折中处理,由此,RTOS的引导分为如下两种模式。

需要BootLoader的引导模式

BootLoader是RTOS内核运行之前执行的一段小程序,它将RTOS内核从外部存储介质复制到内存中,并让PC跳转到刚复制到的内存的内核的首条指令。
在嵌入式系统中,BootLoader依赖于硬件,几乎不可能建立一个通用的BootLoader。
不同的CPU体系结构都有不同的BootLoader,另外,BootLoader还依赖于具体的嵌入式板级设备的配置。

对于采用高性能RAM的系统,出于成本因素,RAM空间有一定限制,此时一般采用BootLoader引导方式:

由Loader程序把RTOS内核中的数据段复制到RAM中,代码段在Flash中运行。
因为代码段在低速的Flash中运行,该方式在节省空间的同时,却牺牲了时间。这种引导方式适合于硬件成本低、运行速度相对较慢的嵌入式系统,但是启动时间却较快。

另外,如果RAM空间没有限制,足够程序运行时,由Loader程序把RTOS内核从非易失性存储介质全部复制到RAM中,对于某些压缩的内核,复制后还需要解压。此时,不能满足对启动速度要求特别高的系统,但是系统的运行速度却能够得到保障。

不需要BootLoader的引导模式

对于实时性要求较高的系统,通常要求系统能够快速启动。
由于将Flash中的代码复制到RAM中的操作会带来一定的时间开销,因此,对于此类系统启动时无须BootLoader,而直接在NORFLASH或ROM等可以做主存的非易失性存储介质中运行,以达到较快的启动速度。但这种引导模式不能满足运行速度的要求,因为Flash的访存时间与RAM的访存时间存在数量级上的差距。

出于空闲效率的要求,需要对RTOS内核使用压缩工具进行压缩,在RTOS引导时,采用逆向解压算法解压。
同时,出于实时性考虑,压缩算法不能过于复杂,否则压缩、解压过程消耗大量时间将与启动时间限制发生严重冲突。
采用压缩策略并不一定会增加系统启动时间,因为压缩,解压过程虽然消耗了一定的时间,但由于内核体积减小,由Flash复制到RAM中的时间相应减少,有可能反而减少了时间消耗。

以VxWorks操作系统为例,VxWorks Image分为在ROM中运行和在RAM中运行两种。
在ROM中运行的是非压缩的,不需要解压。
在RAM中运行的是压缩的,引导时需要解压COPY所有的text和data到RAM中。

BootLoader

  1. Boot。Boot意味着系统启动时会从这里启动,具体一点就是当大家按开机键,CPU执行的第一条指令就是Boot的代码,也就是说Boot的代码要存储在CPU第一条指令的地址处。
  2. Loader。加载程序,这个程序就是大家经常谈到的内核映像,如Linux内核、Windows内核等,当然也可以是更强悍的引导程序。

从上面可以看出,在PC上,BIOS满足上面的特性,因为PC启动时就是从BIOS的地址处启动的,然后BIOS的代码读取硬盘的第一扇区的数据,即引导程序,然后将控制器交给引导程序,然后将控制器交给引导程序,再由引导程序加载操作系统内核代码运行。

而在嵌入式系统中,ViVi、Uboot等就是BootLoader,这些程序都是开机时就启动,启动后,会从NAND Flash或SD卡等存储设备中将RTOS内核程序代码复制到SDRAM中,然后执行内核代码。
Vivi,Uboot代码量大的原因主要是:它们都支持多种嵌入式平台,都可以看成一个通用的BootLoader;除了上面的启动,RTOS加载两个功能,他们还支持更多功能,如支持各种命令,这些命令主要可以分为如下两大类。

  1. 操作设备类:支持板载设备的操作,如操作NANDFlash、NORFlash、EEPROM,有些甚至支持SD卡等。
  2. 数据相关类(通信和管理)操作:支持FTP,TFTP、NFS等网络协议,又或者支持USB下载等功能。

有些BootLoader,如ARM公司的Bootmonitor还支持文件系统,能以文件系统的方式管理NANDFlash、SDCARD、COMPCAT CARD上的数据。有了上面两大类操作的支持后,BootLoader已经不再是纯粹的BootLoader了,它已经具备了一些操作系统的基本功能,只是不支持操作系统支持的任务管理、调度、切换等功能。

其实像VIVI、Uboot这些BootLoader在电子产品中很少用到,因为电子产品强调性能、成本,并且不太愿意用户有太大的修改权利。同时,由于Uboot尺寸大,启动时间很长,严重影响系统性能和成本,因此,BootLoader越小越好。

也许大家会说,如果BootLoader只是这两个功能,那干嘛还独立出这个BootLoader,直接将这部分代码写到操作系统。
真正在商用产品中,就是这样,只不过它的功能还在,所以仍然称为BootLoader。
只不过这个简单的BootLoader是和内核一起编译,并且通过链接器链接在一起的,这种BootLoader对应于aCoral系统的start.s。

存储介质的划分

  1. 按存储介质分类。作为存储介质的基本要求,必须具备能够显示两个有明显区别的物理状态的性质,分别用来表示二进制代码的0和1。另一方面,存储器的存取速度又取决于该物理状态的改变速度。目前使用的存储介质主要是半导体器件和磁性材料。
  2. 按存取方式分类。如果存储器中任何存储单元的内容都能被随机存取,且存取时间和存储单元的物理位置无关,这种存储器称为随机存储器。半导体存储器和磁芯存储器都是随机存储器。

大家知道程序最后运行必须要有随机可读写存储器来存储变量,且速度要快,但是RAM价格昂贵,于是又导致了SDRAM的产生。

aCoral环境下启动2440

链接文件就是一个告诉链接器如何安排一个镜像文件各个部分先后顺序的文件,就像街上的门牌号一样,总是会有个001号,那么就要从该位置开始。

ENTRY(__ENTRY)
MEMORY
{RAM(wx) : org =0x30000000, len=64M
}SECTIONS
{.text:{test_start = .;*(.text)*(.init.text)*(.rodata*)}
}

链接文件acoral.lds的一开始有这样一条代码ENTRY(__ENTRY),根据GNU链接文件的规则:ENTRY(begin)指明程序的入口点为begin标号。这样镜像文件的入口点就是__ENTRY。

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

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

相关文章

人工智能:模拟人类智慧的科技奇迹

人工智能(Artificial Intelligence,简称AI)作为一项模拟人类智慧行为的科学与技术,正以惊人的速度改变着我们的世界。它旨在让计算机系统具备感知、推理、学习、决策和交互等人类智慧的能力,成为当今科技领域的巨大突破…

SpringCloud微服务 【实用篇】| Dockerfile自定义镜像、DockerCompose

目录 一:Dockerfile自定义镜像 1. 镜像结构 2. Dockerfile语法 3. 构建Java项目 二: Docker-Compose 1. 初识DockerCompose 2. 部署微服务集群 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…

Jupyter Lab | 在指定文件夹的 jupyter 中使用 conda 虚拟环境

Hi,大家好,我是源于花海。本文主要了解如何在指定文件夹的 jupyter 中使用 conda 虚拟环境,即在 conda 里面创建虚拟环境、将虚拟环境添加至 jupyter lab/notebook、安装软件包。 目录 一、创建虚拟环境 二、激活并进入虚拟环境 三、安装 …

OpenAI 拟每年投入 100-500 万美元,以获取新闻使用许可

最近两位媒体公司高层透露,OpenAI正积极与新闻出版公司进行谈判,提出每年投入100万至500万美元的费用,以获取将新闻文章用于训练大型语言模型的授权。 OpenAI目前正与大约十几家媒体公司进行谈判,但有报道称,即使对于…

【LeetCode】197. 上升的温度

表: Weather ------------------------ | Column Name | Type | ------------------------ | id | int | | recordDate | date | | temperature | int | ------------------------ id 是该表具有唯一值的列。 该表包含特定日期的温…

基于 Python+Django 技术栈,我开发了一款视频管理系统

学习过程中,遇到问题可以咨询作者 大家好,作为一名开发人员,平时比较愿意动手尝试各种有意思工具,因为笔者非常喜欢观看视频,尤其是YouTube、bilibili都是笔者非常喜欢的视频网站,所以想自己实现一个视频点…

Anaconda + Pytorch 超详细安装教程

Anaconda Pytorch 超详细安装教程 安装 Anaconda 略,自行百度即可 安装 Pytorch 虚拟环境 第一步 选择 env第二步 创建第三步 填写环境名称和选择 python 版本号 第四步 打开 https://pytorch.org/ 选择 pytorch 版本,我这里选择的是 GPU 版本 即 CUDA 11.8,也…

Unity组件开发--传送点

本组件仅实现A传送点到B传送的功能,是可以双向传送的,如果只要单向传送,可以另外改脚本实现; 先看效果: unity组件传送点演示 1.传送组件shader是怎么写的:这种效果的实现方案 shader编辑器是这样的&#…

国内代理IP推荐!

国内代理IP,日更新50w IP,全国200城市,可利用率高达99%。提供HTTP/HTTPS/SOCKS5协议,满足数据采集、爬虫业务需求。丰富的api参数选择,可自由选择时效地区等,按需求过滤重复资源。低延迟,提供丰…

Linux第20步_在虚拟机上安装“Visual Studio Code”

1、双击windows系统桌面上的“FileZilla Client.exe”,打开FTP客户端,点击03软件下的Visual Studio Code,发现code_1.50.1-1602600906_amd64。 2、点击“文件”,然后点击“站点管理器”,见下图操作: 3、点…

Flask 会员列表展示

感谢编程浪子师傅的源码信息分享 web/controllers/member/Member.py # -*- coding: utf-8 -*- from flask import Blueprint,request,redirect,jsonify from common.libs.Helper import ops_render,iPagination,getCurrentDate,getDictFilterField,selectFilterObj from comm…

Spring学习之——AOP(面向切面)

AOP 概念 AOP:全称是Aspect Oriented Programming即:面向切面编程。 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对程序进行增强&#xff…

24年初级会计资格考试报名信息采集流程共10大步骤,千万不要搞错

2024年初级会计资格考试报名信息采集流程共10大步骤,不要搞错哦; 第一步:输入证件号、点击登录 第二步:阅读采集须知 第三步:填写个人信息(支付宝搜索"亿鸣证件照"或者微信搜索"随时照&q…

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)八

第二部分、线性表详解:数据结构线性表10分钟入门 线性表,数据结构中最简单的一种存储结构,专门用于存储逻辑关系为"一对一"的数据。 线性表,基于数据在实际物理空间中的存储状态,又可细分为顺序表&#xff…

【c语言】指针小结

一、指针是什么? 可以通过运算符&来取得变量实际保存的 起始地址 。 (这个地址是虚拟地址,并不是真正物理内存上的地址。) 数据类型 *标识符 &变量; int *pa &a; int *pa NULL; (NULL表示地址为0的内存空间&a…

Apache SeaTunnel:探索下一代高性能分布式数据集成工具

大家下午好,我叫刘广东,然后是来自Apache SeaTunnel社区的一名Committer。今天给大家分享的议题是下一代高性能分布式海量数据集成工具,后面的整个的PPT,主要是基于开发者的视角去看待Apache SeaTunnel。后续所有的讲解主要是可能…

52、Flink的应用程序参数处理-ParameterTool介绍及使用示例

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的…

LeetCode第102题 - 二叉树的层序遍历

题目 解答 class Solution {List<List<Integer>> nodeLevels new ArrayList<>();public List<List<Integer>> levelOrder(TreeNode root) {levelOrder(root, 0);return nodeLevels;}public void levelOrder(TreeNode root, int k) {if (root …

噬菌体序列分析工具PhaVa的使用和使用方法

github: 25280841/PhaVa: Adapting the phasefinder approach for identifying phase variation to long reads (github.com) 挺简单的&#xff0c;这里就不翻译了&#xff0c;大家看着直接用吧。 PhaVa PhaVa is an approach for finding potentially Phase Variable invert…

第7章-第1节-Java中的异常处理

1、异常Exception概述&#xff1a; 1&#xff09;、异常的概念&#xff1a; 现实生活中万物在发展和变化会出现各种各样不正常的现象。 例如&#xff1a;人的成长过程中会生病。 实际工作中&#xff0c;遇到的情况不可能是非常完美的。 比如&#xff1a;你写的某个模块&…