新建light.c:
修改start.S:
修改Makefile:加light.o
最后make成功,烧写成功。
同样,我们也可以在C函数里调用我们的汇编里面的函数:
修改start.S:把light_led申明为global:
在light.c中被调用:
Make编译烧写到开发板:发现灯是可以被点亮的。在C中调用汇编函数成功。
接下来的是在C中嵌入汇编代码,而不是调用:
C中嵌入汇编代码:
格式:
C内嵌汇编以关键字'__asm__'或者'asm'开始,包含四个部分的内容,如上图,各个部分用':'分开,第一部分是必须写的,后面三个部分是可以忽略的,但是分号:不能省略。
汇编语句
输出部分:C语言中修改的变量
输入部分:从C传来的参数
破坏描述:寄存器的值被修改,寄存器就要列在这里。
简单实例:
在C语言里实现读出CPSR里的c1寄存器的值:
上面的汇编语句中,注意到通用寄存器的位置被一个参数%0,凡是要去读出的部分都放在输入部分,凡是要去写的部分都放在输出部分。
上面的输入部分的'r'是通用寄存器,由系统分配的,后面括号value是存在寄存器里的值。
在C语言里实现写入CPSR里的c1寄存器的值:
参数寄存器是输出cpsr里寄存器的值。
等号是只写的意思,就是对寄存器r进行只写的操作,还要把寄存器里的值写到value里。
破坏部里有memory,是告诉系统,在汇编语句里,修改了内存里变量的值。
Volatile是告诉cpu不要优化该代码:
实现点灯:
上面用%0和%1来表示这里是两个参数,参数的值是两个通用寄存器里的值。'r'(GPKCON)中的'r'表示通用寄存器,值是GPKCON。'r0'是破坏部,因为整个操作会影响r0的值。
Make烧写,灯亮。
关键字:汇编 混合编程
引用地址:
37.C与汇编混合编程
推荐阅读最新更新时间:2024-11-09 04:15
TDK推出为USB-C提供完整ESD保护的超紧凑型TVS二极管
TDK株式会社 针对USB-C端口和其他高速接口的ESD保护应用推出一款超紧凑型TVS二极管。 对于USB-C等符合USB4(第1版)规范且传输速度高达40 Gbit/s的高速接口 (Tx / Rx),ESD保护应用特别需要具有超低寄生电容和低钳位电压的TVS二极管。新的B74111U0033M060和B74121U0033M060型元件的在1 MHz条件下的寄生电容分别为0.48 pF和0.65 pF,钳位电压仅为3.8 V或3.9 V,ITLP为8 A,不会干扰信号完整性,因此非常适合此类应用。这些TVS二极管保护元件的设计ESD放电电压高达15 kV,并采用超紧凑的WLCSP 01005和WLCSP 0201扁平结构封装,高
[电源管理]
基于LPC2119和μC/OSII的CAN中继器设计
引 言 CAN总线的直接通信距离只有10 km左右,而且由于收发器驱动能力的限制,总线上最多只能挂110个节点,给系统组网带来一定的困难。CAN中继器就是为了解决这个问题而设计的。对CAN中继器初始化参数进行设置,可以在不同的网段内采用不同的通信速率,还可以对报文进行过滤,减轻总线负担。 1 CAN中继器的硬件设计 1.1 微控制器LPC2119简介 CAN中继器是以ARM微控制器LPC2119为核心的软硬件系统。LPC2119是Philips公司生产的一款基于支持实时仿真和跟踪的16/32位ARM7TDMISMCU,带有128 KB嵌入的高速Flash存储器。独特的加速结构使32位代码能够在最大时钟速率下
[单片机]
C语言一百例第十九例
代码: /* C语言第19例 题目:一个数如果恰好等于它的因子之和,这个数就称为 完数 。例如6=1+2+3.编程找出1000以内的所有完数。 程序分析:请参照:C 练习实例14。 */ #include stdio.h #define N 1000 int main() { int i,j,k,n,sum; int a ; for(i=2;i =N;i++) { sum=a =1; k=0; for(j=2;j =(i/2);j++) { if(i%j==0) { sum+=j; a =j; }
[单片机]
八、ARM 汇编程序格式和程序控制
8.1 汇编程序格式 源程序中的语句可以分为两种类型:指令性语句、指示性语句 指示性语句就是一些伪操作,在 MDK 编译环境下的伪操作有下面几种: 符号定义伪操作 数据定义伪操作 汇编控制伪操作 其他伪操作 8.1.1 符号定义伪操作 符号定义伪操作用于定义 ARM 汇编程序中的 “变量”,此变量不会在内存上分配空间,只是用来辅助编译器工作,帮助我们用于循环控制、逻辑运算和条件判断等等操作 用于定义全局变量的 GBLA、GBLL 和 GBLS 用于定义局部变量的 LCLA、LCLL 和 LCLS 用于对变量赋值的 SETA、SETL、SETS 为一个通用寄存器列表定义别名:RLIST(List RL
[单片机]
Linux下s3c6410的GPIO操作(1)
1、arch/arm/plat-s3c64xx/gpiolib.c文件中有如下: arch_initcall(s3c64xx_gpiolib_init);这个应该实在系统初始化时调用。 static __init int s3c64xx_gpiolib_init(void) { s3c64xx_gpiolib_add(gpio_4bit, ARRAY_SIZE(gpio_4bit), s3c64xx_gpiolib_add_4bit); s3c64xx_gpiolib_add(gpio_4bit2, ARRAY_SIZE(gpio_4bit2), s3c64xx_gpiolib_add_4bit2);
[单片机]
对s3c2440、s3c2410的存储控制及启动代码的理解
对于s3c2440、s3c2410这样的片子,并不是想51那样简单的内存和启动操作 1、这两种芯片的地址线为addr0~addr26共有27条地址线即为128MB的寻址范围,为了更广的范围芯片厂家就多加了nGCS0~nGCS7(有了所谓的bank0~bank7),8个引脚作为外部的扩展即128*8MB=1GB的寻址范围。理论上这芯片有4GB(2的23次方)的寻址范围和采用统一编址的方式。但并不是全都用到的一般只用到其中的一部分。即可分为:外部地址空间bank0~bank7(0x00000000~0x40000000)、内部寄存器地址(0x48000000~0x5FFFFFFF)主要用于特殊功能寄存器 、未用地址段,这三个大部分组成
[单片机]
#C51串口通讯4-#一串数据#中断即时解析用户自定义协议(握手接收应答)
前言 提示: 1.上一章测试一种方法:简单协议下利用串口中断实时接收数据并校验后进行解析。 2.实际项目开发时,主机下发命令后,从机首先进行握手确认,数据错误情况下要进行相应回应(如错误指令)。 3.本章继续丰富开发,增加主从应答机制 提示:以下是本篇文章正文内容,下面案例可供参考 一、场景 示例: 主机下发命令,从机中断解析并应答,主函数处理事件 二、编程实现 1.自定义协议 如: ##主机类型定义命令类型(查询,设置,器件控制等等) 以控制数码管显示0x01为例 ##从机握手应答: a.数据正确回复:BB66BB8000 b.和校验错误回复:BB66BB8100 c.异或校验错误回复:BB66BB820
[单片机]
如何使用带有I2C和SPI解码的示波器排查系统问题
大多数基于微控制器的设计都使用I2C或SPI,或两者兼用,来实现控制器之间以及控制器与外围芯片之间的通信。当芯片发送特定的I2C或SPI数据包时,能够看到嵌入式系统内部的操作对于排除故障至关重要。许多管理相对较慢参数的芯片,如温度传感器、电机控制器、人机界面或电源管理等,都将这些总线作为与系统其他部分通信的主要手段。其他高速芯片,如通信集成电路、时钟和模数转换器,通常也通过这些总线进行配置。例如,在电源启动后排查冷却风扇问题时,查看发送到风扇控制器集成电路的SPI命令的时序和结构,以及风扇的驱动信号和电源,可能会有所帮助。 I2C和SPI总线定义明确且相对稳健,但仍然可能受到噪声、板级布局、复位问题以及实现上的微妙差异的影响。
[测试测量]