【微处理器系统原理与应用设计第八讲】程序设计的开发框架包括编程语言、程序的基本要素、汇编程序结构、集成开发环境

news/2024/9/17 7:38:31/ 标签: jvm, 程序设计, 开发框架

一、编程语言

从处理器的角度看:一个指令只是一个操作,那么执行多条指令构成的程序就是完成一个完整功能的操作。

从程序执行的角度看:处理器读取指令后译码执行,完成所有操作。

程序设计的角度看:用指令来描述所要实现的功能,并组织这些指令,将指令和数据放在规定的存储位置,最终让字符变成可以执行的二进制数。

1、机器语言

二进制语言是处理器能直接执行的唯一语言,也叫机器语言。程序设计就要按照指令的执行顺序将相应的二进制数值放在相应的存储空间。这种方式简单直接,写入后就可以执行,但是不便于编程。

2、汇编语言

采用一些助记符来规范指令的排列和数据的存放。它们与汇编指令共同构成汇编程序。这些指令和规范一起就构成了汇编语言。

汇编语言编写的程序通过汇编器生成目标模块,该目标模块描述了其他在存储区段需要的空间和内容,每个存储区段存有指令、数据或者两者兼有。

将这些目标通过链接器互连,就可以创建一个可执行文件,该文件把数据和目标代码分配到合适的存储区段。链接器可以决定标号的地址并自动更新所引用标号的机器指令中的值。

在存储器中,通过内存镜像来存放可执行的内核代码和数据,它们会出现在所生成的可执行文件。

3、高级语言

为了让更多的程序设计不依赖于处理器和汇编语言,高级语言应运而生。高级语言是面向处理的,它采用规范的数据定义、操作语句和程序结构,使程序更接近处理思路,更易读易懂。高级语言编写的程序通过编译器可以生成汇编程序。

目前,微处理器系统底层驱动应用开发采用C语言。C语言本身是一种高级语言,描述简洁且易用,便于进行数据处理和业务应用开发。C语言的大部分语句与汇编语句相通,可视为汇编语句的一种变形,因此C语句操作机制清晰,处理效率较高,便于进行底层电路的驱动开发。

二、程序的基本要素

数据是信息的表现和处理额对象,它决定如何进行存储和访问。

运算是数据的加工,决定如何处理数据。

流程是算法的体现,决定如何执行运算操作。

1、数据定义

数据定义的实质是完成存储分配,即确定数据的类型和数量。通常采用变量来定义数据,高级语言的变量可以保存在寄存器中,也可以保存在存储器中,而汇编语言中的变量都保存在存储器中。

2、处理数据

处理数据的实质是实现数据的加工。高级语言的运算语句是面向变量的,一条运算语句可能对应多条汇编语句并涉及多次寄存器或者存储器的数据操作;汇编语言的运算语句是面向ALU的,一条语句就是一次操作,涉及一次寄存器和存储器的数据操作。

3、流程控制

流程控制的实质是构建某一功能的处理流操作。常规的三种处理流程采用三种常用结构:顺序结构、分支结构、循环结构。高级语言有专用的结构构建语句,涉及比较运算和跳转操作;而汇编语言中只能用多个跳转语句来实现程序流程。

4、组织结构

组织结构的实质是将多个功能处理流程有机结合,从而完成一个复杂的功能。高级语言采用专用的函数和子过程来创建,自动完成堆栈操作和参数传递等工作;而汇编语言则通过标号定义和堆栈操作来实现。

三、汇编程序结构

1、分区

在汇编语言中,采用AREA对代码和数据分别分区,并指明存储类型。最简单的存储文件必须包括两个区;保存异常向量表的只读数据区和包含启动程序的只读代码区。

每个区的首个指令或者数据通常都要有标识,如果这个标识被其他文件使用,那么还要再用EXPORT语句来声明一次该标识。

2、异常向量表

异常向量表是在只读存储区中分配的数据,其中第一个字保存主栈指针MSP的值,第2个字保存重启异常服务程序向量标识Reset_Handler的值。这里MSP的值可以是人为指定的,也可以通过语句来自动分配。

3、栈和堆

堆栈,简称栈(STACK),是用户存放程序临时创建的局部数据。由于处理器加电时会自动获取MSP的值,因此系统启动时要自动分配一定空间的主堆栈。

堆(HAEP)是运行中被动态分配的存储段,大小并不固定。可动态扩张或者缩减。若在程序处理中需要堆,则在系统启动时应该分配足够的堆空间。

4、重启异常服务

假如重启程序代码的首地址标识为Reset_Handler,如果后续代码作为一个功能整体模块,那么加上PROC来进行标识,以ENDP作为模块代码的结束。由链接器的配置可知,Reset_Hnadler是汇编程序的入口标识,所以加上ENTRY语句,并由EXPORT语句将Reset_Handler设置为链接器可用的标识。

5、数据初始化

从存储器使用的角度看,指令放在ROM区,处理过程中所要使用的数据放在RAM区,堆栈也要放在RAM区。

通常情况下,程序需要构建三类区:只读区(RO区)、可初始化的读写区(RW区)和不初始化的读写区(ZI区)。

RO区中分配异常向量表、程序代码和只读数据

RW区中分配需初始化的数据。其中RW区的数据初值既要保存在ROM中以保证数据不丢失,也要保存在RAM中供处理器使用。保存在ROM中的RW区数据的初值在加电后要用指令将它们读出并写到相应的RAM中。

ZI区中分配不需要初始化的数据

四、集成开发环境

软件开发的三种主要工具:程序构建工具链、编程器和调试器。一个基本的集成开发环境(IDE)通常都包含这些工具。

1、程序构建工具链

程序构建工具链把程序翻译成机器指令并存储在一个可执行文件中。程序构建工具链如下图,其中包含C语言的armcc编译器、armasm汇编器和armlimk链接器,最终的内存映像会在Arm ELF形式的可执行文件中给出,文件后缀为.axf。

2、编程器

当微处理器上电或者复位时,无法将程序加载到存储器,因此程序必须提前写在存储器中。程序存储器是非易失性的,在断电的情况下也能保存所存储的内容。

编程器根据可执行文件的描述把程序放入微处理器的存储器中。它有硬件与软件两部分,硬件连接到Cortex-M4处理器的串行线调试(SWD)接口来使能存储器用于编程;软件部分可以是一个独立的程序,也可以构建于IDE中。

3、调试器

调试器使开发者在处理器运行程序时能够控制程序执行和测试程序状态。 


http://www.ppmy.cn/news/1522298.html

相关文章

F12抓包06-3:浏览器导入/导出请求

使用场景:比如测试过程中通过抓包排查的问题,可以将请求记录导出给开发查看。 使用的是HAR文件,即HTTP归档格式(HTTP Archive Format),是用于记录HTTP会话信息的文件格式。 ① 抓包:鼠标右键打开“检查”工具&#xff…

远心镜头选型公式

在当今的机器视觉领域,远心镜头凭借其独特的远心光路设计以及超低畸变、高远心度和高景深等特点,成为尺寸测量和视觉对位中的得力工具。然而,如何进行快速而准确的选型呢?答案就在于选型公式:倍率 焦距 N.A.Sensor 尺…

Transiting from CUDA to HIP(三)

一、Workarounds 1. memcpyToSymbol 在 HIP (Heterogeneous-compute Interface for Portability) 中,hipMemcpyToSymbol 函数用于将数据从主机内存复制到设备上的全局内存或常量内存中,这样可以在设备端的内核中访问这些数据。这个功能特别有用&#x…

2024最新Redis面试题含答案

(3)、队列 Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操…

Shell教程_在Bash_Shell中使用for循环详解

Shell教程_在Bash_Shell中使用for循环详解 在编程语言中, 循环是必不可少的组件, 当您想要一遍又一遍地重复代码直到满足指定条件时使用。 在 Bash 脚本中, 循环扮演着几乎相同的角色, 并用于自动执行重复性任务, 就像在编程语言中一样。 在 Bash 脚本中, 有 3 种类型的循环…

Component name “Find“ should always be multi-word

出现原因 这个是vue的vue文件名校验,意思是你的组件文件名应为多个单词且大驼峰,这样语义性更强, 解决方法 可采用3种方法解决 如果解决不了记得重启vue工程 1.改文件名 比如FindIndex,如此大驼峰 2.给组件添加name属性,注…

坐牢第三十六天(QT)

自定义QQ界面 wedget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //qt中信息调试类 #include <QIcon> //图标类 #include <QPushButton>//按钮类 #include <QLabel> //标签类 #include <QMovie> //动图类…

真人模特失业?AI虚拟试衣一键成图,IDM-VTON下载介绍

在电商行业竞争尤为激烈的当下&#xff0c;除了打价格战外&#xff0c;如何有效的控制成本&#xff0c;是每个从业者都在思考的问题 IDM-VTON是一个AI虚拟换装工具&#xff0c;旨在帮助服装商家解决约拍模特导致的高昂成本问题&#xff0c;只需一张服装图片&#xff0c;就可以…

手写 Vue Router 中的 Hash 模式和 History 模式

Vue Router 是 Vue.js 的官方路由库&#xff0c;负责管理 Vue应用中的页面导航。它与 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得轻而易举。Vue Router 提供两种常见的模式&#xff1a;Hash 模式和 History 模式。这两种模式的主要区别在于它们如何管理 URL…

解决启动Nginx时80端口被占用的问题

文章目录 前言 解决方法1. 搜索服务打开![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c7600d266d194bdb864f7660a5bc5890.png)2. 找到World Wide Web 发布服务这个服务&#xff0c;右键属性&#xff0c;将它的启动类型改为手动&#xff0c;然后停止掉该服务。3. 此…

mysql笔记—基础

1.SQL语句 DDL&#xff08;数据库对象操作&#xff09;、DML&#xff08;增删改&#xff09;、DQL&#xff08;查询&#xff09;、DCL&#xff08;用户和权限操作&#xff09; 2.DDL&#xff1a; 1.数据库操作&#xff1a; show databases; create database []; use []; sele…

oracle数据块内部结构详解

文章目录 Oracle数据块详解概述Oracle块具有以下特点&#xff1a;① 最小的I/O单元&#xff1b;② 包含一个或多个OS块&#xff1b;③ 大小由参数DB_BLOCK_SIZE决定&#xff1b;④ 数据库创建时设置&#xff0c;数据库创建后不能更改 Oracle数据块详解 概述 操作系统块是…

Django跨域问题

简介 由于本站以及很大部分项目都是前后端分离模式&#xff0c;前后端所配置的域名并不相同&#xff0c;所以会受到浏览器的同源策略限制&#xff0c;导致不能正确的请求资源&#xff0c;以下内容先用最简单的方法实现Django后端的跨域问题解决&#xff0c;后续原理再慢慢补充…

ctfshow之文件包含(web78~web86)

web78 if(isset($_GET[file])){$file $_GET[file];include($file); }else{highlight_file(__FILE__); } 解法一&#xff1a;data伪协议 ?filedata://text/plain,<?php system("tac flag.php"); 解法二&#xff1a;php:filter伪协议 ?filepHp://FilTer/conver…

贪心算法求解拆楼房问题

这是一道典型的贪心算法问题&#xff0c;首先遍历找到一个高度大于0的楼房&#xff0c;然后以此为基准&#xff0c;划分一个区间&#xff0c;找到楼房内高度最小的楼房&#xff0c;每次都减去这个高度最小的值。 后续重复一样&#xff0c;再找减去后楼房高度的最小值&#xff…

Springboot工程配置https访问

背景 因为前端工程使用nginx配置了https访问&#xff0c;在https直接请求我们Springboot后端的http接口会报错。那么我们就需要配置使得我们后端的springboot服务支持https访问。 证书生成 在配置springboot工程https之前&#xff0c;我们需要生成自签名证书以及Spring Boot…

中职院校智能物联网应用专业群建设方案

一、引言 随着信息技术的飞速发展&#xff0c;智能物联网&#xff08;IoT&#xff09;作为新一代信息技术的重要组成部分&#xff0c;正深刻改变着人们的生活方式、生产模式和社会形态。为积极响应国家“中国制造2025”和“智慧城市”等战略部署&#xff0c;培养适应未来社会需…

linux使用samba共享目录,其他虚拟机和windows都可以访问

一、192.168.137.12主机作为源目录主机&#xff0c;将/samba/shared_dir目录分享出去 #192.168.137.12主机&#xff1a; rpm -q samba #查看是否安装 yum -y install samba #创建共享目录 mkdir /samba/shared_dir -p #给共享目录赋权 chown -R samba.samba /samba #提示用户不…

CAS与原子操作

什么是原子操作&#xff1f; 原子操作是一种在执行过程中不会被中断的操作。它要么完全执行成功&#xff0c;要么完全不执行&#xff0c;确保在操作完成之前其他线程不会看到操作的中间状态。 原子操作的实现 CAS CAS是由 CPU 提供的原子指令。在硬件级别上确保操作的原子性。…

linux 查看java 进程

在 Linux 中&#xff0c;可以使用以下几种常用方法来查看运行中的 Java 进程&#xff1a; 1. ps 命令 ps 是最常用的查看进程的命令。你可以使用以下命令查看 Java 进程的 PID&#xff1a; ps -ef | grep java-e&#xff1a;显示所有进程。-f&#xff1a;显示完整格式的信息…