这里,我们要准备两个文件,一个是汇编文件start.S,另一个是C文件led.c。汇编文件套用C文件中的开关灯函数,C文件套用汇编文件中延时函数。
//start.S
.global led_init
led_init:
@;GPC1CON
@;GPC1PUD
loop:
mov r0,#1 @将1存到寄存器r0中,实现LED开灯效果
bl led_ops @调用C文件中的led_ops函数,此时led_ops函数调用的参数会自动从寄存器中取,即r0
mov r0,#0 @将0存到寄存器r0中,实现LED关灯效果
bl led_ops
b loop @执行循环,使LED灯不停闪烁
delay:
sub r0,r0,#1
cmp r0,#0
bne delay
mov pc,lr
下面是C文件
//led.c
void led_ops(int a){
if(a){
volatile int *p=(int *)0xe0200080; //volatile关键字确保本条指令不会因编译器的优化而省略,且要求每次直接读值,注意这个关键字在嵌入式C中非常重要
*p=*p | (1<<3);
}
else{
volatile int *p=(int *)0xe0200080;
for(int i=0;i<3;i++){ //执行位清零操作
*p++=0x00000000;
}
}
delay(0xff0000); //调用汇编文件中delay标签,执行延时
}
编译方法如下:
arm-linux-gcc led.c -o led.o
arm-linux-gcc start.S -o start.o
arm-linux-gcc -nostartfiles -nostdlib start.o led.o
关键字:ARM C语言 汇编 相互套用
引用地址:
ARM学习笔记14——C语言和汇编相互套用
推荐阅读最新更新时间:2024-11-23 19:01
GEC210 LED裸机开发 c语言实现 ADS方式
软件环境: ADS1.2 开发板 :GEC210 理论知识: 参考led原理介绍 因为ADS默认需要从汇编进入,所以我们的代码先调用一段短汇编,然后直接跳转到c语言 源代码如下 start.s AREA _start,code,readonly ;设置段属性,代码段,代码段取名inti,只读属性 entry ;入口,同一个工程不应该出现多个入口 import main_c bl main_c end led.c #define GPJ2CON (*(volatile unsigned long*)0xe0200280) #d
[单片机]
[ARM笔记]虚拟地址和物理地址的关系
对于内核物理内存映射区的虚拟内存,使用virt_to_phys()可以实现内核虚拟地址转化为物理地址,phys_to_virt()可以实现物理地址转化为内核虚拟地址。 #define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET) static inline unsigned long virt_to_phys(void *x) { return __virt_to_phys((unsigned long)(x)); } 上面的转换过程的PaGE_OFFSET通常为3GB,而PHYS_OFFSET则定义为DRAM内存的基地址。因此,对于LDD6410电路板
[单片机]
Arm 计算平台加持,全新 Llama 3.2 LLM实现AI 推理的全面加速和扩展
在 Arm CPU 上运行 Meta 最新 Llama 3.2 版本,其云端到边缘侧的性能均得到显著提升,这为未来 AI 工作负载提供了强大支持 Meta 与 Arm 的合作加快了用例的创新速度,例如个性化的端侧推荐以及日常任务自动化等 Arm 十年来始终积极投资AI领域,并广泛开展开源合作,为 1B 至 90B 的 LLM 实现在 Arm 计算平台上无缝运行 人工智能 (AI) 的迅猛发展意味着大语言模型 (LLM) 的新版本不断推陈出新。要充分发挥 AI 的潜力并抓住其带来的机遇,需要实现 LLM 从云端到边缘侧的广泛部署,而这也伴随着对计算和能源需求的大幅增长。整个生态系统正携手寻找应对这一挑战的解决方
[嵌入式]
ARM汇编语言和C语言混合编程
ATPCS规则体现了一种 模块化 设计的思想,其基本内容是C模块(函数)和汇编模块(函数)相互调用的一套规则(C51中也有类似的一套规则)。我感觉比在线汇编功能强大(不用有很多忌讳),条理更清楚(很简单的几条规则)。 ATPCS规则内容: 1)寄存器的使用规则 1、子程序之间通过寄存器r0~r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0~r3可记作A1~A4。 2、在子程序中,使用寄存器r4~r11保存局部变量。因此当进行子程序调用时要注意对这些寄存器的保存和恢复。此时r4~r11可记作V1~V8。 3、寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。 4、寄存器r13用作堆栈指
[单片机]
基于ARM和FPGA的微加速度计数据采集系统设计
0 引言 加速度计是一种应用十分广泛的惯性传感器,它可以用来测量运动系统的加速度。目前的加速度计大多采用微机电技术(MEMS)进行设计和制造的微型加速度计,由于采用了微机电技术,其设计尺寸大大缩小,一个MEMS加速度计只有指甲盖的一小部分,MEMS加速度计具有体积小、重量轻、能耗低等优点。 随着微加速度计的应用越来越广泛,对于微加速度计的数据信号采集和存储变得极为重要。传统的数据采集方法多数是用单片机完成的,其编程简单、控制灵活,但缺点是控制周期长、速度慢,特别是对高速转换的数据来说,单片机的慢速度极大地限制了数据传输速度。而FPGA(现场可编程门阵列)具有单片机无法比拟的优势。FPGA时钟频率高,内部延时小,全部控制逻辑
[单片机]
德州仪器推出高性能单内核 ARM® Cortex™-A8 与高集成度的 AM389x Sitara™ ARM 处理器
日前,德州仪器 (TI) 宣布推出可显著提升性能与集成度的最新 AM389x Sitara ARM MPU,进一步壮大了其业界领先的 Sitara™ ARM® 微处理器 (MPU) 的产品阵营。AM389x Sitara ARM MPU 采用性能可达 1.5 GHz 的业界最高性能单内核 ARM Cortex™-A8,并集成多种外设,是单板计算机、网关、路由器、服务器、工业自动化、人机接口 (HMI) 以及服务点数据终端等应用的理想选择。上述最新高性能 AM389x Sitara ARM MPU 可实现更快的终端产品,不但具有网络连接、图形用户界面与显示功能,而且还可同时运行多个应用,支持 Linux、Microsoft®
[嵌入式]
这样的三大技术才是汽车电子的顶梁柱
首先是电气化。大量的报道都在讨论电气化,电气化实际上是把电动马达添加到原本仅有汽油机或者柴油机的系统中,而这却为大众市场带来了激动人心的变化。这背后有诸多原因,然而很重要的一点是增加成本的回报率。所谓混合动力系统包含了一个辅助的电动马达,它能帮助实现燃油效率的大幅提升。这个马达并不主导驾驶,但是它却能提升传统发动机的能力,使主引擎可以“瘦身”。主引擎体积越小,那么它的功耗则会下降,而效率将得以提升。而这套系统的成本比全电动汽车要少得多。 其次是先进的安全系统。该系统主要以摄像头监控为基础(也有基于或采用雷达功能的系统)以确保驾驶更安全。其中包含了对驾驶员的监控,车道偏离报警,监测汽车盲点或处于危险区域行人等功能。研究表明,80
[汽车电子]
学习ARM开发(10)
/* 用循环调用所有初始化函数 */ for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) { /* 当每个函数初始化失败时,就会挂机在这里。 */ hang(); } } 上次说到在函数指针数组里,不断地调用所有初始化函数进行初始化,下面就来仔细地分析一下,它们到底是做什么的,做什么样的初始化,怎么样为后面做好运行的准备工作。看到第一个初始化函数,就是CPU初始化(cpu_i
[单片机]