完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我们使用汇编编写了 LED 灯的实验,在实际开发过程中大部分还是使用 C 语言,汇编只是用来完成 C 语言环境的初始化,本章我么就来实现用汇编完成 C 语言环境的初始化,然后用 C 语言实现 LED 的例程。
|
|
相关推荐
2个回答
|
|
C 程序版LED例程简介
汇编完成 C 语言环境的初始化主要包括内存初始化,设置堆栈指针等等,当这些工作完成以后就可以跳转到 C 语言,执行 C 程序了,所以我们有两部分事情要做: 1.汇编文件,用来完成 C 语言的环境初始化 2.C 语言文件,主要实现我们的业务功能,比武我们本章的点亮 LED。 |
|
|
|
程序编写
本实验对应的例程在光盘资料的:i.MX6UL 终结者光盘资料/04_裸机例程源码/2_led_C program 目录下,我们在 Ubuntu 系统建立“1_Led_C program”文件夹,然后在“Led_C program”文件夹下建立文件:start.S、main.c、main.h。其中 start.S 是汇编文件,main.c 和 main.h 是 C 语言文件。 我们在前面新建的“srart.S”文件中输入下面的代码: 1. global _start /* 全局标号 */ 2. /* 3. * 描述: _start 函数,程序从此函数开始执行,此函数主要功能是设置 C 4. * 运行环境。 5. */ 6. _start: 7. /* 进入 SVC 模式 */ 8. mrs r0, cpsr 9. bic r0, r0, #0x1f /* 将 r0 寄存器中的低 5 位清零,也就是 cpsr 的 M0~M4 */ 10. orr r0, r0, #0x13 /* r0 或上 0x13,表示使用 SVC 模式 */ 11. msr cpsr, r0 /* 将 r0 的数据写入到 cpsr_c 中 */ 12. ldr sp, =0X80200000 /* 设置栈指针 */ 13. b main /* 跳转到 main 函数 */ 第 1 行定义了一个全局标号_start 第 6 行是程序的入口、 第 8 行到第 11 行是设置处理器进入 SVC 模式 第 12 行通过 ldr 指令设置 SVC 模式下的 sp 指针(0x80200000),i.MX6 ULL 终结者开发板上的内存地址范 围是 0X80000000~0XA0000000(512MB)或 0X80000000~0X90000000(256MB),所以不论是 512MB 版本还是256MB 版本的,其内存起始地址都是 0X80000000,由于 i.MX6ULL 的堆栈是向下正常的,所以 SP 指针设置成 0X80200000(0X80200000-0X80000000,是 2MB 的栈空间,足够我们使用了)。 第 13 行是挑喜欢到 main 函数(C 语言的入口函数。 至此汇编部分的程序我们就完成了,主要用来设置处理器在 SVC 模式下运行,然后初始化 SP 指针,最后跳转到 C 程序的 main 入口函数。如果大家有接触过三星的 S3C2440 |
|
|
|
只有小组成员才能发言,加入小组>>
815 浏览 0 评论
1162 浏览 1 评论
2536 浏览 5 评论
2871 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2720 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1113浏览 3评论
198浏览 2评论
465浏览 2评论
380浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
462浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 10:20 , Processed in 1.559144 second(s), Total 52, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号