落风的个人空间 https://www.eechina.com/space-uid-138363.html [收藏] [复制] [RSS]

博客

http://www.eechina.com/thread-594802-1-1.html

已有 525 次阅读2020-7-1 10:50

第九章我们使用汇编编写了 LED 灯的实验,在实际开发过程中大部分还是使用 C 语言,汇编只是用来完成 C 语言环境的初始化,本章我么就来实现用汇编完成 C 语言环境的初始化,然后用 C 语言实现 LED 的例程。

 

10.1 C 程序版LED例程简介

汇编完成 C 语言环境的初始化主要包括内存初始化,设置堆栈指针等等,当这些工作完成以后就可以跳转到 C 语言,执行 C 程序了,所以我们有两部分事情要做:

1.汇编文件,用来完成 C 语言的环境初始化

2.C 语言文件,主要实现我们的业务功能,比武我们本章的点亮 LED

 

10.2 原理图分析 原理图分析

本章用到的硬件资源和第 6 章的一样,可以参照第六章的硬件原理分析。

 

10.3 程序编写

本实验对应的例程在光盘资料的:i.MX6UL 终结者光盘资料\04_裸机例程源码\2_led_C program 目录下,我们在 Ubuntu 系统建立“1_Led_C program”文件夹,然后在“Led_C program”文件夹下建立文件:start.Smain.cmain.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 指针设置成 0X802000000X80200000-0X80000000,是 2MB 的栈空间,足够我们使用了)。

13 行是挑喜欢到 main 函数(C 语言的入口函数。

至此汇编部分的程序我们就完成了,主要用来设置处理器在 SVC 模式下运行,然后初始化 SP 指针,最后跳转到 C 程序的 main 入口函数。如果大家有接触过三星的 S3C2440S3c6410 或者 S5PV210 的处理器,我们在使用内存之前必须先初始化 CPU 的内存控制器,所以在他们的汇编文件中一定有内存控制器的初始化代码(比如 Uboot 的汇编中)。大家可能会发现我们上面编写的 start.S 文件中并没有发现初始化内存控制器的代码,但是确将 SVC 模式下的 SP 指针设置到了内存的地址范围里面,这样不是有问题吗?大家还记得在

第六章我们在编译生成led.bin”文件以后,通过 create_imx 工具在“led.bin”文件添加了一些数据包头吗,也就是 DCD 数据,在第六章我们已经讲过 DCD 数据里面包含了内存控制器的参数配置了,i.MX6ULL 内存固化的 Boot ROM 程序会读取 DCD 数据中的内存控制器参数,bin 完成内存控制器的初始化配置。

接下来我们开始实现 C 语言部分,首先我们打开前面建立的“main.h”文件,然后输入下面的代码:

1. #ifndef __MAIN_H

2. #define __MAIN_H

3. /*

4. * CCM 鐩稿叧瀵勫瓨鍣ㄥ湴鍧


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部