Linux操作系统-汇编LED驱动程序基础

一、汇编LED原理分析

        IMX6ULL-LED灯硬件原理分析:

        1、使能时钟,CCGR0-CCGR6这7个寄存器控制着IMX6ULL所有外设时钟的使能。为了简单,设置CCGR0-CCGR6这7个寄存器全部为0XFFFFFFFF,相当于使能全部外设时钟。(在IMX6ULL芯片参考手册CCM篇章介绍)

        2.IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit-0设置为0101,这样GPIO1_IO03就复用为GPIO。

​编辑

              3.寄存器 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电器属性。

        4.Pin配置GPIO功能:设置输入输出功能,设置GPIOx_GDIR寄存器bit3为1,也就是输出寄存器。设置GPIOx_DR寄存器bit3为1,表示输出高电平,为0表示输出低电平。

 三、GNU汇编简介

        1.GNU汇编常用伪操作

        label:标号,表示地址位置,有些指令前面可以会有标号,这样可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意label后面的“ :”,任何一 " : "结尾的标识符都会被认为是一个标号。

        instruction:指令,也就是汇编指令或伪代码

        @:注释符号

        comment:注释内容

        .section:伪操作用来定义一个段,使用 .section来定义一个段,每个段以段名开始,以下一段名或者文件结尾结束,汇编系统定义了一些段名:

                      .text:表示代码段

                      .data:初始化的数据段

                      .bss: 未初始化到数据段

                      .ridata: 只读数据段

        _start:汇编程序的默认入口标号是

        .byte:定义一个单字节数据

        .short:定义双字节数据

        .long:定义一个4字节数据

        .equ:赋值语句,例如.equ num,0x12 表示num=0x12

        .align:数据字节对齐

        .end:表示源文件结束

        .global:定义一个全局符号

        注意! ARM中的指令、伪指令、伪操作、寄存器名等可以全部使用大写,也可以全部使用
小写,但是不能大小写混用。

        2.GNU汇编函数

        GNU汇编同样也支持函数,函数格式如下:

函数名:函数体返回语句   @返回语句不是必须的

        3.常用汇编指令

           3.1处理器内部数据传输指令

           ①、将数据从一个寄存器传递到另外一个寄存器。②、将数据从一个寄存器传递到特殊寄存器,如 CPSR SPSR 寄存器。③、将立即数传递到寄存器。

           MOV指令:MOV指令用于将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面,使用示例如下:

MOV R0,R1 @表示将寄存器R1中的数据传递给R0即:R0=R1
MOV R0,#0X12 @表示将立即数0x12传递给R0寄存器即:R0=0x12 

         MRS指令:指令用于将特殊寄存器 (如 CPSR和 SPSR)中的数据传递给通用寄存器,要读取特殊寄存器的数据只能使用 MRS指令!使用示例如下:

MRS R0,CPSR @将特殊寄存器CPSR里面的数据传递给R0即R0=CPSR

         MSR指令:MSR指令和 MRS刚好相反, MSR指令用来将普通寄存器的数据传递给特殊寄存器,也就是写特殊寄存器,写特殊寄存器只能使用 MSR,使用示例如下:

MSR CPSR,R0 @将R0中的数据复制到CPSR中即CPSR=R0

        3.2存储器访问指令

         ARM不能直接方位寄存器,一般要先将需要配置的值写入Rx(x=0~12),然后借助存储器访问指令将Rx中的数据写入到寄存器中,读取数据反过来就行。

       LDR指令:主要用于从存储器加载数据到计算器Rx中,LDR也可以将一个立即数加载到寄存器Rx中,LDR加载立即数的时候要使用“ = ”,而不是" # "使用示例如下

LDR R0,=0X0209C004 @将寄存地址0X0209C004加载到R0中即:R0=0X0209C004
LDR R1,[R0]  @读取地址0X0209C004中的数据到R1寄存器中

       STR指令:DR是从存储器读取数据, STR就是将数据写入到存储器中使用示例如下。

LDR R0, =0X0209C004 @将寄存器地址0X0209C004加载到R0中,即R0=0X0209C004
LDR R1, =0X20000002 @R1保存要写入到寄存器的值,即R1=0X20000002
STR R1, [R0] @将R1中的值写入到R0中所保存的地址中

       3.3压栈操作和岀栈操作指令

        我们通常会在A函数中调用B函数,当B函数执行完以后再回到A函数继续执行。要想再跳回A函数以后代码能够接着正常运行,那就必须在跳到B函数之前将当前处理器状态保存起来 (就是保存R0~R15这些寄存器值 ),当B函数执行完成以后再用前面保存的寄存器值恢复R0~R15即可。保存 R0~R15寄存器的操作就叫做现场保护,恢复R0~R15寄存器的操作就叫做恢复现场。在进行现场保护的时候需要进行压栈操作,恢复现场就要进行岀栈操作

        假如我们现在要将 R0~R3和 R12这 5个寄存器压栈,当前的 SP指针指向 0X80000000,处理器的堆栈是向下增长的,使用的汇编代码如下:

PUSH {R0~R3, R12} @将R0~R3和R12压栈

          此时sp指针指向了0X7FFFFFEC,再次对LR进行压栈:

PUSH {LR}  @将LR进行压栈

         接下来我们来进行岀栈演示使用以下代码:

POP {LR} @先恢复LR
POP {R0~R3,R12} @在恢复R0~R3,R12

       出栈的就是从栈顶,也就是SP当前执行的位置开始,地址依次减小来提取堆栈中的数据
到要恢复的寄存器列表中。

        3.4跳转指令

        ①、直接使用跳转指令 B、 BL、 BX 

        ②、直接向 PC寄存器里面写入数据。

        B指令:这是最简单的跳转指令, B指令会将 PC寄存器的值设置为跳转目标地址, 一旦执行 B指令, ARM处理器就会立即跳转到指定的目标地址。如果要调用的函数不会再返回到原来的执行处,那就可以用 B指令,如下示例:

_start:ldr sp,=0X80200000 @设置栈指针
b main @跳转到main函数

   上述代码就是典型的在汇编中初始化 C运行环境,然后跳转到 C文件的 main函数中运行,上述代码只是初始化了SP指针,有些处理器还需要做其他的初始化,比如初始化 DDR等等。因为跳转到 C文件以后再也不会回到汇编了,所以在第 4行使用了 B指令来完成跳转。

        BL指令:BL指令相比 B指令,在跳转之前会在寄存器 LR(R14)中保存当前 PC寄存器值,所以可以通过将 LR寄存器中的值重新加载到 PC中来继续从跳转之前的代码处运行,这是子程序调用一个基本但常用的手段。

push {r0, r1} @保存r0,r1
cps #0x13 @进入SVC模式,允许其他中断再次进去bl system_irqhandler @加载C语言中断处理函数到r2寄存器中
cps #0x12 @进入IRQ模式
pop {r0, r1}
str r0, [r1, #0X10] @中断执行完成,写EOIR

         3.5 算术运算符

         3.6 逻辑运算指令

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

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

相关文章

【Flink SQL】Flink SQL 基础概念(三):SQL 动态表 连续查询

《Flink SQL 基础概念》系列,共包含以下 5 篇文章: Flink SQL 基础概念(一):SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念(二):数据类型Flink SQL 基础概念&am…

大数据平台测试-我是怎么面试高级测试的

前言 下面是我面试时会问的一些问题整体提问思路:接口自动化框架->UI 自动化框架->测试用例设计思维->Linux->SQL->Python->常用算法和数据结构->Shell 脚本->jmeter->Docker->Jenkins 重点还是 UI、接口自动化等方面的技能&#xf…

简述从浏览器发出请求到数据返回的全过程

下面是我结合经验概述的从浏览器发出请求到数据返回的全过程。 一、用户请求 1、用户在浏览器输入URL,或通过功能发起请求; 2、解析URL,提取协议(http,https等),IP,端口,域名,路径等信息&#x…

CSS学习(2)-盒子模型

1. CSS 长度单位 px :像素。em :相对元素 font-size 的倍数。rem :相对根字体大小,html标签就是根。% :相对父元素计算。 注意: CSS 中设置长度,必须加单位,否则样式无效&#xff…

Vue2(二):计算属性、监视属性、二者的区别

一、计算属性 1. 使用插值语法和methods拼接姓名 如果样式要求不多的话这样写没问题&#xff0c;如下代码是截取我输入的姓的前三个字母 <div id"root">姓&#xff1a;<input type"text" v-moudel"firstName">名&#xff1a;<…

Unity2019.2.x 导出apk 安装到安卓Android12+及以上的系统版本 安装出现-108 安装包似乎无效的解决办法

Unity2019.2.x 导出apk 安装到安卓Android12及以上的系统版本 安装出现-108 安装包似乎无效的解决办法 导出AndroidStudio工程后 需要设置 build.gradle文件 // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAINbuildscript {repositor…

MySQL的目录结构

安装目录 /usr/local/mysql数据目录 /usr/local/mysql/data配置目录 /usr/local/etc/my.cnf

第二十四章 Web Gateway 管理页面概述

文章目录 第二十四章 Web Gateway 管理页面概述访问Web网关管理页面启用从其他客户端地址的访问 第二十四章 Web Gateway 管理页面概述 Web Gateway 提供了一组管理页面&#xff0c;可以使用它们来配置和监视 Web Gateway。本页介绍如何访问这些页面以及如何本地化它们&#x…

2024海淘且免KYC虚拟信用卡

很多小伙伴都需要海淘&#xff0c;亚马逊、ebay、国际阿里巴巴、速卖通等等&#xff0c;我们这里都有卡支持&#xff0c;并且免kyc、免年费免月费 点击获取 按图片步骤注册开卡 海淘注意事项 海淘&#xff08;跨境购物&#xff09;可以让人们在国外购买到更多种类的商品&…

力扣每日一题 矩阵中移动的最大次数 DP

Problem: 2684. 矩阵中移动的最大次数 复杂度 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂度: O ( n m ) O(nm) O(nm) Code class Solution { public int maxMoves(int[][] grid){int n grid.length;int m grid[0].length;int[][] f new int[n][m]…

Text-to-SQL 工具Vanna + MySQL本地部署 | 数据库对话机器人

今天我们来重点研究与实测一个开源的Text2SQL优化框架 – Vanna 1. Vanna 简介【Text-to-SQL 工具】 Vanna 是一个基于 MIT 许可的开源 Python RAG&#xff08;检索增强生成&#xff09;框架&#xff0c;用于 SQL 生成和相关功能。它允许用户在数据上训练一个 RAG “模型”&a…

浅谈HTTP 和 HTTPS (中间人问题)

前言 由于之前的文章已经介绍过了HTTP , 这篇文章介绍 HTTPS 相对于 HTTP 做出的改进 开门见山: HTTPS 是对 HTTP 的加强版 主要是对一些关键信息 进行了加密 一.两种加密方式 1.对称加密 公钥 明文 密文 密文 公钥 明文 2.非对称加密 举个例子就好比 小区邮箱 提供一…

调皮的String及多种玩法(上部)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 欢迎&#x1f64f;点赞&#x1f5e3;️评论&#x1f4e5;收藏&#x1f493;关注 &#x1f496;衷心的希…

linux系统kubernetes的yaml文件

yaml文件 yaml文件概述书写格式yaml基本语法yaml文件组成部分常用字段含义快速生成yaml文件 yaml文件 概述 k8s集群中对资源管理和资源对象编排部署都可以通过声明样式yaml文件来解决&#xff0c;这种文件被称为资源清单文件&#xff0c;通过k8s命令直接使用资源清单文件就可…

数据库引论:2.SQL简介

SQL(Structured Query Language,结构化查询语言) 2.1 SQL查询语言概览 SQL语言包含 数据定义语言(Data-Definition Language,DDL)。SQL DDL提供定义关系模式、删除关系以及修改关系模式的命令。数据操纵语言(Data-Manipulation Language,DML)。SQL DML提供从数据库中查询信息…

企业微信 API 接口调用教程:深入解析企业微信 API 的用法

本文通过 access_token 凭证的方式来讲解怎么调用 企业微信 API&#xff0c;并一步步介绍如何获取企业微信 API 的 corpsecret、corpid、access_token 凭证以及怎么向企业微信的应用发送消息。 企业微信 API 在线地址为&#xff1a;qiyeweixin.apifox.cn/ &#xff0c;这个在线…

蓝桥杯单片机快速开发笔记——PWM

一、原理分析 使用定时器输出PWM&#xff08;脉宽调制&#xff09;信号是通过微控制器的定时器模块来生成一种周期性的脉冲信号&#xff0c;通过控制脉冲的高电平时间&#xff08;占空比&#xff09;来控制输出信号的平均功率。以下是生成PWM信号的基本原理概述&#xff1a; 定…

计算机网络——物理层(编码与调制)

计算机网络——编码与调制 基带信号和宽带信号编码与调制数字数据编码为数字信号非归零编码归零编码反向不归零编码曼彻斯特编码差分曼彻斯特编码4B/5B编码 数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号 我们之前讲了物理层的一些基础知识和两个准则&a…

2024/3/16打卡全球变暖(第九届蓝桥杯)——dfs/bfs

题目 你有一张某海域 NN 像素的照片&#xff0c;”.”表示海洋、”#”表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. .......其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿&#xff0c;例如上图就有 2 座岛屿。 由于…

4.如何通过组策略给所有电脑挂载共享文件路径?AD域控如何给所有加域的电脑挂载共享文件夹路径?

&#xff08;1&#xff09;如何将一个文件夹设置为共享文件&#xff1f; 步骤如下&#xff1a; 1.找到你想共享的文件夹。 2.右键单击该文件夹&#xff0c;选择“属性”选项。 3.在文件夹属性窗口中&#xff0c;切换到“共享”选项卡。 4.点击“共享此文件夹”复选框&…