揭阳商城网站建设中国新闻社待遇

news/2025/10/4 9:48:01/文章来源:
揭阳商城网站建设,中国新闻社待遇,ui中国设计官网,浙江省城乡住房建设部网站汇编怎么调用C函数 直接调用 BL main传参数 在arm中有个ATPCS规则#xff08;ARM-THUMB procedure call standard#xff09;#xff08;ARM-Thumb过程调用标准#xff09;。 约定r0-r15寄存器的用途#xff1a; r0-r3#xff1a;调用者和被调用者之间传递参数r4-r11…汇编怎么调用C函数 直接调用 BL main传参数 在arm中有个ATPCS规则ARM-THUMB procedure call standardARM-Thumb过程调用标准。 约定r0-r15寄存器的用途 r0-r3调用者和被调用者之间传递参数r4-r11函数可能被使用所以在函数的入口保存它们在函数的出口恢复它们。 int delay(unsigned int d) {while(d--);return 0; }ldr r0,1000000 dl delay cmp r0,#0 返回值保存在r0 A函数调用B函数 假设A函数里需要用到R4寄存器B函数里也需要用到R4寄存器。 因此B函数就有会覆盖A函数R4寄存器的值。 于是需要在B函数执行前保存R4-R11寄存器的值在A的栈中 。 B函数执行完后返回A函数前要从A的栈中恢复R4-R11寄存器。 C函数的反汇编码阅读 要解决几个问题 为什么调用C函数前要设置栈栈的作用是C函数传参C函数执行过程 反汇编示例 地址0x08000010Flash上烧写20010000。 启动流程 上电后 设置栈CPU会从0x08000000读取值用来设置SP我们的程序里再次设置了SP。跳转CPU会从0x08000004得到地址值根据它的BIT0切换到ARM状态或Thumb状态然后跳转。 对于Cortex M3/M4它只支持Thumb状态所以0x08000004上的值bit0必定是1。 对0x08000004上的值Reset_Handler1。 从Reset_Handler上继续执行 纯汇编点灯 写程序 寄存器操作 对于寄存器的操作主要涉及读、修改、写。 读可以使用LDR指令代码为LDR R1,[R0]写使用STR指令代码为STR R1,[R0]修改清除位使用BIC或AND指令设置位使用ORR指令 LDR R0, (120) | (121) BIC R1,R1,R0 ;清除R1的bit20bit21 LDR R0, (120) ORR R1,R1,R0 设置R1的bit20函数里的条件判断 比如减1操作代码为SUB R0,R0,#1 顺便使用减1后的结果影响程序状态寄存器代码为SUBS R0,R0,#1程序的调用与返回值 传参代码为LDR R0,VAL 调用代码为BL delay它顺便把下一条指令的地址保存在LR寄存器了。 返回代码为MOV PC,LR 使用按键控制LED 先看原理图我们使用KEY1来控制红色LED按下KEY1在灯亮松开后灯灭。 KEY1的引脚是PA0 使能GPIOA模块RCC_APB2ENR0x400210000x18 串口的硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter即通用异步收发器。 串口在嵌入式中用途非常的广泛主要的用途有 打印调试信息外接各种模块GPS、蓝牙 串口因为结构简单、稳定可靠广受欢迎。 通过三根线即可发送、接收、地线。 TXD线把PC机要发送的信息发送给ARM开发板。 最下面的地线统一参考地。 串口的参数 波特率一般选波特率都会有9600、19200、115200等选项。其实意思就是每秒传输这么多个比特位数bit。起始位先发出一个逻辑0的信号表示传输数据的开始。数据位可以是5~8位逻辑0或1.如ASCII码7位、扩展BCD码8位。小端传输。校验位数据位加上这一位后使得1的位数应为偶数偶校验或奇数奇校验以此来校验数据传送的正确性。停止位它是一个字符数据的结束标志。 怎么发送一字节数据比如A A’的ASCII值是0x41二进制就是0x01000001怎么把这8位数据发送给PC机呢 双方约定好波特率每一位占据的时间规定传输协议 原来是高电平ARM拉低电平保持1bit时间。 PC在低电平处开始计时。 ARM根据数据依次驱动TXD电平同时PC依次读取RXD电平获得数据。 PC机在数据位的中间读取引脚状态。 RS-232的电平比TTL/CMOS高能传输更远的距离在工业上用得比较多。 市面上大多数ARM芯片都不止一个串口一般使用串口0来调试其它串口来外接模块。 115200,8n1。 一秒钟可以传输115200个bit传送一个字节需要1个起始位8个数据位1个停止位10bit。 所以一秒钟可以传输11520个字节。 UART编程 看原理图确定引脚 有很多串口使用哪一个看原理图确定。配置引脚为UART功能 至少用到发送、接收引脚txd、rxd 需要把这些引脚配置为UART功能并使能UART模块设置串口参数根据状态寄存器读写数据 肯定有一个数据寄存器程序把数据写入即可通过串口向外发送数据。 肯定有一个数据寄存器程序读取这个寄存器就可以获得先前接收到的数据。 很多有状态寄存器判断数据是否发送出去是否发送成功判断是否接收到了数据 需要使能GPIOA/USART1模块 需要设置GPIOA的寄存器选择引脚功能所以要使能GPIOA模块。 GPIOA模块、USART1模块的使能都是在同一个寄存器里实现。 USART寄存器用结构体来表示比较方便 typedef unsigned int uint32_t; typedef struct {volatile uint32_t SR; /*! USART Status register, Address offset: 0x00 */volatile uint32_t DR; /*! USART Data register, Address offset: 0x04 */volatile uint32_t BRR; /*! USART Baud rate register, Address offset: 0x08 */volatile uint32_t CR1; /*! USART Control register 1, Address offset: 0x0C */volatile uint32_t CR2; /*! USART Control register 2, Address offset: 0x10 */volatile uint32_t CR3; /*! USART Control register 3, Address offset: 0x14 */volatile uint32_t GTPR; /*! USART Guard time and prescaler register, Address }USART_TypeDef; USART_TypeDef *usart1 (USART_TypeDef *)0x40013800;在C语言中编译器通常会对代码进行各种优化以提高程序的执行效率。这些优化包括重新排序指令、删除看似无用的变量读取等。 然而在与硬件通信的情景下有些变量的值可能会被硬件或者其他事件异步地修改而这种修改通常是在程序控制流之外发生的。 假设有一个代表硬件寄存器的变量如果没有使用’volatile’关键字编译器可能会进行一些优化认为这个变量的值在程序的某个地方被设置后就不再改变。这就可能导致一些问题因为实际上这个变量的值可能会在程序的其它地方被异步地修改。 通过在变量声明中加入’volatile’关键字告诉编译器不要对这个变量进行过多的优化以确保每次访问这个变量时都从内存中读取最新的值而不是使用之前缓存的值。 这对于与硬件直接交互的变量比如你提供的USART通信寄存器非常重要因为这些寄存器的值可能会在程序的正常流程之外被外部事件改变。 #ifndef __UART_H #define __UART_Hvoid uart_init(); char getchar(); char putchar(char c);#endif这段代码是一种常见的C/C预处理器约定用于防止头文件header file被多次包含避免引起重定义错误。 #ifndef这是预处理指令表示if not defined即如果之前没有定义过指定的标识符那么执行接下来的代码。__UART_H这是一个宏标识符通常是头文件名的大写形式加上双下划线前缀以确保标识符的唯一性。在这里它用于作为一个宏防止头文件被多次包含。#define __UART_H如果之前没有定义过__UART_H那么用这个#define指令定义它。这样当头文件再次被引用时#ifndef检查将会失败因为__UART_H已经被定义了。#endif表示条件编译的结束。如果之前#ifndef条件成立那么在这里结束条件编译块。 这种写法的目的是确保一个头文件只会被编译一次即使它在多个地方被引用。这可以防止由于头文件被重复引用而导致的重定义错误。这是一种预防措施用于提高代码的可维护性和可移植性。

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

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

相关文章

网站建设理论依据网站建设布局结构

关于csgo/steam游戏搬砖项目的几大认知误区

考试心得5

2025/9/10 | 2025CSP-S模拟赛57 https://oj.gxyzh.com/d/hzoj/contest/68d921a11bde45b9248e2bb9/problems 国庆第一天训练。初三牲要死了。搬到机构里训练,效率几乎为零。 T1其实是简单题。但是考场上想了AB性质后就…

小型行业网站建设维护成本金泉网做网站电话

大型网络的拓扑结构一般会比较复杂,不同的部门,或者总部和分支可能处在不同的网络中,此时就需要使用路由器来连接不同的网络,实现网络之间的数据转发。 本章将介绍路由协议的基础知识、路由表的分类、静态路由基础与配置、VLAN间…

实用指南:Transformer模型:深度解析自然语言处理的革命性架构——从预训练范式到产业级实践

实用指南:Transformer模型:深度解析自然语言处理的革命性架构——从预训练范式到产业级实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impo…

PocoEmit遥遥领先于AutoMapper之打通充血模型的任督二脉

PocoEmit遥遥领先于AutoMapper之打通充血模型的任督二脉一、充血模型和失血模型 1. 充血模型的优势充血模型更加OOP 充血模型代码可读性更好1.1 充血模型伪代码 var messageDto = controller.ReadDto(); var message =…

hslenc.c 代码提纲挈领分析 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Solar9月赛wp - 场

水一篇Solar9月赛 Wireshark 哥斯拉流量,webshell的密码一直变,neta可以梭到一个zip,里面是key.txt,直接追踪到最后一个返回包,拿key.txt进行爆破解密拿到flagflag{ccebdb78-4b5c-4252-b20a-0039913c5c94} HAPPY …

做电商网站商标wordpress导航栏的文件在哪里

http://www.cnblogs.com/ccblogs/p/5260949.html 一. 效果图 二. 功能介绍 支持滚动和点击选择年月。&#xff08;目前只支持设置年月的最大最小值&#xff0c;不支持整体的最大最小值&#xff09; 三. 代码 1. 在你的html中添加如下代码&#xff1a; 直接加载<body>里面…

昆明网站建设教学视频wordpress判断是否是子分类

1.遇到的问题 服务网关 | RuoYi 最近调试若依的微服务版本需要用到Sentinel这个组件&#xff0c;若依内部继承了这个组件连上即用。 Sentinel是阿里巴巴开源的限流器熔断器&#xff0c;并且带有可视化操作界面。 在日常开发中&#xff0c;限流功能时常被使用&#xff0c;用…

wordpress 网站维护wordpress的设置网址导航

概率基础——极大似然估计 引言 极大似然估计&#xff08;Maximum Likelihood Estimation&#xff0c;简称MLE&#xff09;是统计学中最常用的参数估计方法之一&#xff0c;它通过最大化样本的似然函数来估计参数值&#xff0c;以使得样本出现的概率最大化。极大似然估计在各…

网站建设开发费用预算泉州做网站优化的公司

美女姜培琳&#xff1a;传授独家心经 不同职业的面试着装技巧。 一般来说&#xff0c;职场中精英女性的装扮&#xff0c;首要应讲求端庄、稳重。人们对服饰过于花哨怪异者的工作能力、工作作风、敬业精神、生活态度等&#xff0c;都会持怀疑的态度。 其实&#x…

成都营销型网站建设价格网站构建工具

Python2.7.13 安装 说明 以下所有操作都基于centos6.9 1. Issue zlib zlib-devel是安装setuptools依赖的模块&#xff0c;需要在安装python之前先安装这两个模块 2. Install Base #基础依赖 yum -y install gcc gcc-c zlib zlib-devel openssl-devel#删除当前mysql版本 yum rem…

坂田做网站多少钱wordpress怎么建加盟网

动态规划、DFS 和回溯算法&#xff1a;二叉树问题的三种视角 在计算机科学中&#xff0c;算法是解决问题的核心。特别是对于复杂的问题&#xff0c;不同的算法可以提供不同的解决方案。在本篇博客中&#xff0c;我们将探讨三种算法&#xff1a;动态规划、深度优先搜索&#xf…

Elastic Search 安装部署最全教程(Docker)

@@docker es 安装https://blog.csdn.net/Grey_fantasy/article/details/131561847   https://blog.csdn.net/qq_33034733/article/details/130857381     https://blog.csdn.net/yueyue763184/article/details/…

大型网站开发pdf英文网站建设 江门

几个删除重复记录的SQL语句在大的数据库应用中&#xff0c;经常因为各种原因遇到重复的记录&#xff0c;造成数据的冗余和维护上的不便。1.用rowid方法2.用group by方法3.用distinct方法 1。用rowid方法据据oracle带的rowid属性&#xff0c;进行判断&#xff0c;是否存在重复,语…

详细介绍:C#多线程全家桶:从Thread到async/await

详细介绍:C#多线程全家桶:从Thread到async/await2025-10-04 09:18 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

十堰的网站建设威海建设集团招聘信息网站

要使用Django开发一个抽奖活动的后台&#xff0c;需要进行以下步骤&#xff1a; 安装Django&#xff1a;首先确保已经安装了Python和pip&#xff0c;然后使用pip安装Django库&#xff1a; pip install django 创建Django项目&#xff1a;在命令行中执行以下命令创建一个新的Dja…

详细介绍:图像分割:PyTorch从零开始实现SegFormer语义分割

详细介绍:图像分割:PyTorch从零开始实现SegFormer语义分割pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

用html5做的静态网站网站wordpress修改首页名称

一、常用的常用的生命周期钩子&#xff1a; mounted: 发送 ajax 请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】 mounted() {console.log(vm 实例被挂载之后&#xff1a;mounted);this.timer setInterval(() > {...} }beforeDestroy: 清除定时器、解绑自定…

网络营销方案seo入门到精通

考察点 大数&#xff0c;快排知识点 题目 分析 本题目给一个整型数组&#xff0c;要求他能排出来的最小的数字。这道题目我们大可以通过排列的方式枚举出所有的数字然后求一个最小的&#xff0c;只不过这种方式时间复杂度非常高。接下来我们通过举例的方式观察我们的思维和数…