嵌入式实时操作系统的设计与开发(轮询系统学习)

news2025/2/1 9:55:54

轮询系统具有以下工作特点:系统完成一个轮询的时间取决于循环中需要执行的函数个数。此外,轮询的次序是静态固定的,在运行时不能进行动态调整。

典型系统

许多工业线程网络中,由于需要控制的设备较多、相互距离又较远,且现场有较强的工业干扰,因此采用体积小、抗干扰能力强的单片机作为上位机与现场控制器一起组成分布式数据采集与控制系统,是一种较好的选择。

如图,在一个多机通信系统中,只有一台单机(8051)作为主机,各台从机之间不能相互通信,必须通过主机转发来交换信息。

搭建开发环境

ARM9 Mini2440是一款基于ARM 920T核心的开发板,简称mi2440,是一款容易入门、复杂程度适中的学习板,它采用三星SAMSUNG S3C2440为微处理器。

Mini2440的基本构成如下:

  1. CPU:SAMSUNG S3C2440A,主频400MHz。
  2. SDRAM:64MB,32位数据总线,时钟频率可达100MHz。
  3. Flash:64M Nand Flash,2M Nor Flash(安装了启动代码FreindlyARM BIOS或者supervivi)。
  4. 相关IO接口。

除了Mini2440外,还需一个仿真器J-LINK,J-LINK是为支持仿真ARM内核芯片推出的JTAG仿真器。能配合KEIL等集成开发环境对所有ARM7/ARM9内核芯片进行仿真。
如果大家已经编写好了代码,并且成功编译,那么如何将编译好的可执行程序烧写在Mini2440上,让其在开发板上运行呢?又如何对下载执行程序进行调试呢?这就需要J-LINK的支持。

写过单片机程序的人都知道,开发人员的程序是在PC上编写的,PC是Intel的处理器,Windows的操作系统。
而单片机可能是TI的8051、430等。

Intel的处理器和单片机采用的是不同指令集。

**交叉开发是嵌入式软件系统开发的特殊方法,开发系统是建立在软硬件资源均比较丰富的PC或工作站上,**一般称为宿主机或Host,嵌入式软件的编辑、编译、链接等过程都是在宿主机上完成。
嵌入式软件的最终运行平台却是和宿主机有很大差别的嵌入式设备,一般称为目标机或Target,这里的目标机就是ARM9 Mini2440。

宿主机与目标机通过串口、并口、网口或其它通信端口相连,嵌入式软件的调试和测试是由宿主机和目标机之间协作完成。

宿主机与目标机的差别主要在于:

  1. 硬件的差别:最主要是两者的处理器不同。宿主机的CPU多数是Intel系列或与其兼容的其它处理器,而目标机的CPU则是ARM、MIPS、8051、TI 430等品种繁多的嵌入式处理器。因此,两者支持的指令集、地址空间都不同。其它的差别,如内存容量、外围设备等。
  2. 软件环境的差异:在宿主机上都有通用操作系统等系统软件提供软件开发支持,而目标机除了调试代理外几乎没有其他用于嵌入式软件开发的软件资源。现有的嵌入式操作系统可作为嵌入式软件运行时的支撑环境。

在这里插入图片描述

ADS(ARM Development Suite)是Netrowerks公司开发的针对ARM处理器的集成开发环境,包含了代码编辑器、编译器(for ARM)、连接器、调试器。
图中的宿主机与目标机是通过J-LINK、串口连接的,其中J-LINK是为了烧写和调试被调试程序,而串口主要是为了回显调试信息。

为了让J-LINK能正常工作,需要在PC上安装驱动j-flashARM;此外,如果宿主机是没有串口的笔记本电脑,还需在笔记本的USB上外接一个USB转串口的工具,并安装相应驱动程序。

这样,便可在PC上编写代码,然后用ADS将其编译、链接成具有ARM指令集的可执行程序、即被调试程序。
再通过J-LINK将被调试程序烧写在Mini2440的NORFlash上(NORFlash的起始地址是0x00000000,开发板上电后PC将指向这里,从该地址存放的指令开始运行);最后,重新启动Mini2440,被调试程序便可在目标机上运行,并且通过串口回显运行信息。

将PC、Mini2440和J-LINK连接好后,就可以在ADS下创建工程了,具体步骤如下:

  1. 新建一个ADS工程,并为其命名为MINE,然后新建file文件my_2440_init.s(.s表示该文件是由汇编文件编写的,因为此时开发板尚未初始化,只支持汇编语言。)在创建好后,就将该文件添加到刚建立的MINE工程中,并在debug、release和debugrel三个选项上打“√”。
  2. 设置“my_2440_init.s”文件编译链接后生成的可执行文件的格式。将ADS菜单“Edit”->“DebugRel Settings”->“Linker”->“ARM fromELF”中的“output format”输出形式设定为“Plain binary”文件类型,后缀为“.bin”(此时的裸板程序还只能支持简单的二进制可执行文件,该文件类型为“Plain binary”)。
  3. 生成bin文件后,就可通过J-LINK将该文件“MINE.bin”烧写到Mini2440的开发板中。此时,开发板跳线设置为“NORFlash 启动”,接上J-LINK后,插在底板的JTAG插座上,J-LINK另一头接PC的USB接口。
  4. 开发板上电。
  5. 打开之前在PC上安装的J-flashARM工具,打开步骤:开始->所有程序->SEGGER->JLINK ARM V4.08->JLINK ARM,该界面能将开发板上从地址0x00000000开始的内存数据显示出来。
  6. 单击file->open project,打开s3c2440a_embedclub.jflash,再在ADS选中开发板对应的NORFLASH芯片型号。
  7. 连接宿主机和目标机。
  8. 打开将要烧写的映像文件MINE.bin。
  9. 烧写确认对话框,J-LINK会先擦除NOR Flash,再将MINE.bin烧写在其开始区域中。
  10. 烧写完成后断电,再取下J-LINK。
  11. 重新上电。

启动Mini2440

交叉开发环境搭建好后,便可动手编码了,编码的首要工作是什么?用ARM汇编语言启动处理器S3C2440A。

无论一个计算机系统由多少硬件设备组合而成,该系统能够运行的基础至少需要一个CPU与运行指令与数据的载体,该载体被称为主存。

当系统上电后,CPU会在可以挂为主存的存储器上开始命令的执行,一般的CPU通常是从地址0x0处开始取指执行。当开发板上电后,CPU的PC寄存器的值通过硬件机制被初始化为0x0。

一切指令与程序都只能在主存上运行。而主存价格较昂贵,并且开发人员的程序通常比较大,因此,开发人员的程序通常存储在外存中,而外存通常无法作为应用程序运行的载体。

这样,当系统上电后,怎样通过一些机制将应用程序从其它存储器设备复制到主存上是十分重要的。

此外,不同的系统硬件设备不同,开机后所需要的硬件设备的配置也不同。所以,系统上电后,对各硬件控制器的设置也是十分重要的。
这些设置其实就是告诉处理器CPU现在启动运行的基本硬件设备是怎样的,从而能正确地使用各种设备,这些都是启动代码的责任。

启动代码的作用可以随着需求的增加而进行扩充,上述描述只是确保系统能够基本运行启动代码的功能,其实,启动代码还可以包括开发板上各板级硬件和接口的驱动程序,这时的启动代码其实就具有了能够使应用程序使用开发板各资源的接口功能了。

BootLoader就是这样一类启动代码的很好诠释。

启动流程

启动代码是与硬件设备密切相关的,其流程是与具体的硬件设备密不可分的。
这一节将以Mini2440的S3C2440A处理器为例来讲述启动代码的流程,这里的启动代码只是一个能使CPU正常工作的一个最小系统。

在这里插入图片描述
Mini2440开发板有两种启动模式,一种是从NOR Flash启动,另一种是从NAND Flash启动。
当Mini2440从NAND Flash启动时,因为NAND Flash无法作为程序运行的载体,所以S3C2440A芯片通过硬件机制将NAND Flash的开头4KB的内容自动复制到了S3C2440A芯片内部的4KB大小的SRAM上面,并且会自动将这4KB大小的SRAM映射为自身内存的BANK0,将这4KB大小的内容映射到从0x00000000开始的地址上,然后处理器从0x00000000地址开始执行。

创建异常向量表

当程序在S3C2440A芯片上运行发生异常时,程序指针PC会自动跳转到主存最开始的地址(0x00000000),这里就是异常向量表的起始地址,然后会通过专门的硬件机制定位到相应的异常向量。

ARM处理器内核一共定义了七种异常:

  1. 复位异常:当开发板复位时,S3C2440A的ARM920T核将当前正在运行程序的CPSR与PC存入管理模式下的PSPR与LR(R14)中。然后强制将CPSR的M[4:0]位写为10011(管理模式),并将CPSR的I位与F位置1(屏蔽IRQ与FIQ),将CPSR的T位清0(进入ARM指令模式)。之后,强制将PC的值设为0x0,让CPU从0x0开始取指执行命令,这时CPU运行在ARM状态。
  2. 未定义指令异常:当ARM920T遇到一个无法处理的指令时,未定义指令异常发生。未定义异常发生后,当前运行程序的下一条指令的地址会被保存到相应模式下的LR(R14)中,CPSR保存到相应的SPSR中,PC被强制赋值为0x4(因为ARM9是32位的指令集,每条指令占用4B的空间)
  3. 软中断异常:软中断是用户模式切换到特权模式的唯一途径,软中断会将程序带到管理模式下,这样,程序就可以对更多的寄存器,特别是CPSR有了修改的权利。
  4. 预取指终止异常。当在一条指令的预取指片段执行失败(通常为内存读取错误时),预取指终止异常发生。预取指终止异常只有当该指令进入了流水线时(也就是该指令被预取指时)发生,但如果引发该异常的指令没有被执行的话,程序是不会终止去处理异常的,这是因为有可能在之前有跳转指令被执行从而跳过了该指令。
  5. 数据终止异常。当在读出数据时发生内存错误时,数据终止异常发生。
  6. IRQ中断异常。当CPU接收到外部设备发出的中断请求时,IRQ中断异常会发生。**IRQ中断异常会在FIQ快速中断异常中被屏蔽。**在IRQ中断异常处理函数中,建议手动指明该中断是否能嵌套。
  7. FIQ快速中断异常。FIQ快速中断异常是为数据传输与处理提供的快速中断通道。FIQ快速中断异常将进入FIQ快速中断模式,在此模式下,ARM提供了更多的专用寄存器,这样就为中断处理节省了寄存器保护入栈的时间。

以上七种模式,有2个模式对应于中断:中断模式,快中断模式。快中断的优先级比一般中断高。当发生中断和快中断时,程序计数器(PC)将会跳到指定的地址开始执行,这为发生中断后执行相应的中断服务提供了可能。

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

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

相关文章

手把手教你用Python绘制神经网络图

接下来教大家如何使用 Python 中的 networkx 库,绘制美观且标准的神经网络。会根据指定的层和节点数量,绘制不同结构的神经网络。 networkx 库可以用来创建和操作图类型的数据结构,其中包括无向图、有向图、带权图等等。 神经网络可以看做是一…

字节码之 Lambda 表达式底层原理

文章目录 0.前言0. lambda程序示例1. 编译程序:2. 使用 javap 分析字节码3. 输出字节码4. 分析指令 1. Lambda 表达式的字节码实现1.1 什么是invokedynamic 指令invokedynamic 的工作原理为何 invokedynamic 如此特殊? 1.2 bootstrap method 详解1.1 Lam…

Qt之给控件添加右键菜单

一、设置控件 在对应控件的属性中,将contextMenuPolicy设置为CustomContextMenu。 二、添加槽函数 在对应控件上右键选择槽函数customContextMenuRequested(QPoint)。 三、在槽函数中添加右键菜单 在槽函数中输入如下代码,添加右键菜单。 //右键菜单 …

红帽Linux的安装和部署

目录 一、红帽Linux的安装阶段 1、下载redhat7.9的iso镜像 2、安装阶段 二、红帽Linux的配置阶段 1、第一次进入装机配置 2、进入机器后的一些配置 三、远程连接阶段 1、关闭防火墙 2、使用Xshell远程连接(其他连接工具也行) 1.开启SSH服务 2.连…

二十、【钢笔工具组】

文章目录 钢笔工具自由钢笔工具弯度钢笔工具 钢笔工具 钢笔工具在photoshop作图中是一款使用频率较高的路径工具,我们可以在窗口选项栏中将路径编辑栏打开,如果我们需要选中使用路径,需要用到后边的路径工具才能去拖动,而选择工具不能拖动&a…

9月大型语言模型研究论文总结

大型语言模型(llm)在今年发展迅速,随着新一代模型不断地被开发,研究人员和工程师了解最新进展变得非常重要。本文总结9-10月期间发布了一些重要的LLM论文。 这些论文涵盖了一系列语言模型的主题,从模型优化和缩放到推理、基准测试和增强性能…

Sigma中的数字增益放大/降低方法

1 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?加他微信hezkz17, 本群提供音频技术答疑服务

如何快速分析一款产品?

一、何时需要对一个产品进行分析? 首先,当你刚刚融入一个新的产品团队,尤其是当你需要深入了解你将负责的产品时,分析产品就显得尤为重要。这有助于你对产品的全面理解,发现其中的优势和不足,为未来的工作提…

14.5 Socket 应用组播通信

组播通信是一种基于UDP协议的网络通信方式,它允许发送方将消息同时传递给多个接收方。在组播通信中,发送方和接收方都会加入一个共同的组播组,这个组播组对应一个特定的IP地址,所有加入该组播组的主机都能够接收到发送方发送的消息…

C++概述

一、C特色 1.C是面向对象的高级程序设计语言 2.支持数据封装,将数据和对该数据进行操作的函数封装在一个类中,对象就是某一个具体的类。即类是数据封装的工具,对象是数据封装的实现。 3.具有继承性 4.具有函数重载 二、拓展介绍 1.C标准&a…

基于音频SOC开发板的主动降噪ANC算法源码实现

基于音频SOC开发板的主动降噪ANC算法源码实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群附加赠送降噪开发资料,

IO流:java中解码和编码出现乱码说明及代码实现

IO流:java中解码和编码的代码实现 一、UTF-8和GBK编码方式二、idea和eclipse的默认编码方式三、解码和编码方法四、代码实现编码解码 五、额外知识扩展 一、UTF-8和GBK编码方式 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个…

深度学习-优化算法与梯度下降

文章目录 前置知识指数移动平均EMAL2正则(L2 Regularization)权重衰减(Weight Decay) 优化器SDGMomentumNAGAdagradRMSPropAdaDeltaAdamAdamW综上 学习率StepLRMultiStepLRExponentialCosineAnealingRLROP(ReduceLRonPlateau)lambda总结 前置…

【图像处理】图像配准、图像增强和图像分割研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

网络编程基础知识总结——IP,端口,协议

目录 1. 什么是网络编程? 2. 网络编程的三要素 3. IP 3.1 IP地址的概念 3.2 IP地址的分类 3.3 IPv4解析 3.4 Ipv6解析 4. IPv4 的使用细节 5. 特殊IP地址 4. 端口号 5. 协议 5.1 UDP协议 5.2 TCP协议 1. 什么是网络编程? 总的来说就是一句…

RuntimeWarning: More than 20 figures have been opened

在画图操作结束后使用plt.close(all)语句,但是此时图像仍然不能正常显示,之前是可以正常显示的,然后又在最后的画图的部分添加plt.show()语句,可以正常显示图像并且不再出现警告了。

Android---DVM以及ART对JVM进行优化

Dalvik Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机,Android 工程师编写的 Java 或者 Kotlin 代码最终都是在这台虚拟机中被执行的。在 Android 5.0 之前叫作 DVM,5.0 之后改为 ART(Android Runtime)。在整个…

oracle创建数据库,导入dmp操作全家桶

背景:小明在一家IT公司就职,通过查看项目,公司使用的是oracle,几天后,经理要求他从服务器导入数据库到公司服务器,聪明的小明就开始干了起来,整理如下教程。 说明:此次演示环境oracl…

【LeetCode力扣】297. 二叉树的序列化与反序列化

目录 1、题目介绍 2、解题思路 2.1、详细过程图解 2.2、代码描述 2.3、完整代码 1、题目介绍 原题链接:297. 二叉树的序列化与反序列化 - 力扣(LeetCode) 示例 1: 输入:root [1,2,3,null,null,4,5] 输出&#…

代码随想录算法训练营第二十二天丨 二叉树part09

669. 修剪二叉搜索树 思路 递归法 从图中可以看出需要重构二叉树,想想是不是本题就有点复杂了。 其实不用重构那么复杂。 在上图中我们发现节点0并不符合区间要求,那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了(就是把节点…