汇编写启动代码之设置栈和调用C语言2

本文介绍了如何在汇编启动代码中调用C语言函数,通过设置栈来调用led_blink()函数。同时,讲解了C语言访问寄存器的语法,利用指针读写内存地址,并讨论了volatile关键字在易变变量上的作用。在编译过程中遇到的链接错误`undefined reference to '__aeabi_unwind_cpp_pr1'`,通过添加`-nostdlib`选项解决了问题。
摘要由CSDN通过智能技术生成

1、C语言函数的编写和调用
在工程中新建并添加一个C语言源文件(led.c),注意添加时要修改Makefile(在第一行依赖中添加led.o)
在汇编启动代码中设置好栈后,使用bl xxx(c函数名)的方式来调用C中的函数xxx(这里就是led_blink)
2、使用C语言来访问寄存器的语法
寄存器的地址类似于内存地址(IO与内存统一编址的),所以这里的问题是用C语言读写寄存器,就是用C语言来读写内存地址。用C语言来访问内存,就要用到指针。
unsigned int *p = (unsigned int *)0xE0200240; //等号右边的(unsigned int )是强制类型转换,目的是使符值等号两边类型一 p = 0x11111111; //致这个明白了再看这句代码实质是一句指针的初始化语句。
上面这两句其实可以简化为1句:((unsigned int )0xE0200240)这个代表p的话。((unsigned int )0xE0200240)前面加个()不就是
p吗?所以上面两句可写成:
((unsigned int *)0xE0200240)=0x11111111 我们程序中是把等号左边的直接定义为宏来用。

注:这两步是用C访问内存的模式化代码。理解(这里定义了一指针变量p,p的这个值就是0xE0200240。把寄存器地址理解成一个指针,这个指针指向了一个内存空间,这个内存空间就用P这个指针来指向。*p=0x11111111就是向p指向的内存地址写数据,也就是指针的访问)
3、神奇的volatile

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值