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…

CSS学习(2)-盒子模型

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

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

2024海淘且免KYC虚拟信用卡

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

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

Problem: 2684. 矩阵中移动的最大次数 复杂度 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) 🌎 空间复杂度: 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(检索增强生成)框架,用于 SQL 生成和相关功能。它允许用户在数据上训练一个 RAG “模型”&a…

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

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

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

👨‍💻作者简介:👨🏻‍🎓告别,今天 📔高质量专栏 :☕java趣味之旅 欢迎🙏点赞🗣️评论📥收藏💓关注 💖衷心的希…

数据库引论: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,并一步步介绍如何获取企业微信 API 的 corpsecret、corpid、access_token 凭证以及怎么向企业微信的应用发送消息。 企业微信 API 在线地址为:qiyeweixin.apifox.cn/ ,这个在线…

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

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

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

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

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

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

智慧城市与数字孪生:共创未来城市的智慧生活

目录 一、智慧城市与数字孪生的概念与特点 二、智慧城市与数字孪生共创智慧生活的路径 1、城市规划与建设的智能化 2、城市管理与服务的智慧化 3、城市安全与应急管理的智能化 三、智慧城市与数字孪生面临的挑战与对策 四、智慧城市与数字孪生的发展趋势与展望 1、技术…

SQL-Labs靶场“32-33”关通关教程

君衍. 一、32关 GET单引号闭合宽字节注入1、源码分析2、宽字节注入原理3、联合查询注入4、updatexml报错注入5、floor报错注入 二、33关 GET单引号addslashes逃逸注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 SQL-Labs靶场通关教程: SQL注入…

安装python、pycharm,打好基础,准备飞起

python安装使用 安装python安装包 以下为自定义安装python安装包,无特殊要求可直接进行安装。 勾选Add Python 3.6 to PATH, 然后点击 Customize installation,进行自定义安装。 所有的都勾上,然后点击Next。 可选择自己需要…

(附数据集)基于lora参数微调Qwen1.8chat模型的实战教程

基于lora微调Qwen1.8chat的实战教程 日期:2024-3-16作者:小知运行环境:jupyterLab描述:基于lora参数微调Qwen1.8chat模型。 样例数据集 - qwen_chat.json(小份数据) - chat.json(中份数据&…

Day39:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化

目录 SpringBoot-监控系统-Actuator SpringBoot-接口系统-Swagger 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方组件使用等. 框架库:MyB…