IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 C 语言和汇编语言混合编程 -> 正文阅读

[嵌入式]STM32 C 语言和汇编语言混合编程

目录

一、C语言调用汇编函数?

二、将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100

三、在汇编函数中调用一个 C语言写的函数

四、总结

五、参考链接:MDK下C与汇编语言混合编程 - the7


?

一、C语言调用汇编函数?

? ?1.打开keil 5新建工程

? ?

??

2.右击Source Group1 添加新项目

?

?

3.点击 Asm File(.s) ,输入name ,点击Add

?

?

4.输入代码:

5.重复第三步新建c File(.c)?文件,代码如下:

?

6.准备环境,实现硬件仿真

?

点击Debug?

7.调试

看图中代码7、8行初始化寄存器R1为1、R2为2,单步调试 ,看右边core中R1,R2初始化完成。

?

二、将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100

下面由于要涉及到arm寄存器的一些分析,所以我在这先简单介绍一下。

R1~R3通常用来传递函数参数
R4~R11用来保存程序运算的中间结果或函数的局部变量
R12通常用来作为函数调用过程中的临时寄存器
R13寄存器是堆栈寄存器(SP),用来保存堆栈的当前指针
R14寄存器是链接寄存器(LR),用来保存函数的返回地址
R15寄存器是程序寄存器(PC),指向程序当前的地址

修改main.c

#include <stdio.h>
extern int Init_1(int x);
int main()
{
	Init_1(10);
	return 0;
}

修改func.s

Init_1
    ADD R0,R0,#100	;R0记录传入的形参,并且执行R0=R0+100;
	BX LR           ;跳转的LR的地址执行,在这里,LR记录main函数调用子函数的返回地址

初始化形参?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?R0初始化为我设置的给定值10

?

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? R0=R0+100执行成功?

?

?

?

?当程序运行到如上图所示时,点击单步调试,注意观察到R14(LR)中的地址-1被加载到R15(PC)指针,PC指针指向该地址,即可返回主程序。

?

?

三、在汇编函数中调用一个 C语言写的函数

如在MDK下stm32程序的执行过程为

先执行.s的汇编程序,再.s文件中执行以下操作

  1. 初始化堆栈指针 SP=_initial_sp
  2. 初始化 PC 指针 =Reset_Handler
  3. 初始化中断向量表
  4. 配置系统时钟
  5. 调用 C 库函数 _main 初始化用户堆栈,从而最终调用 main 函数去到 C 的世界

然后再跳转到main函数,执行一些c语言程序。
在一些对性能要求比较高的情况下,有时也会在c语言程序在内嵌一些汇编代码。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?初始化R0为3,R1为4

?

?

此代码实现了在c函数中调用汇编函数,再从汇编函数中调用c函数,调用方式与之前大同小异,但是了解c程序和汇编程序相互调用,混合编程还是很有帮助的。?

四、总结

通过这次练习学到了混合编程的过程,汇编语言更能看出代码运行的过程,对代码运行更容易理解。

五、参考链接:MDK下C与汇编语言混合编程 - the7

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:57:21  更:2021-10-15 11:58:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:28:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码