zoukankan      html  css  js  c++  java
  • 迅为-imx6ull开发板之C语言实现LED例程

    第九章我们使用汇编编写了 LED 灯的实验,在实际开发过程中大部分还是使用 语言,汇编只是用来完成 语言环境的初始化,本章我么就来实现用汇编完成 语言环境的初始化,然后用 语言实现 LED 的例程。
    10.1 C 程序版LED例程简介
    汇编完成 C 语言环境的初始化主要包括内存初始化,设置堆栈指针等等,当这些工作完成以后就可以跳转到 语言,执行 程序了,所以我们有两部分事情要做:
    1.汇编文件,用来完成 语言的环境初始化
    2.C 语言文件,主要实现我们的业务功能,比武我们本章的点亮 LED
    10.2 原理图分析 原理图分析
    本章用到的硬件资源和第 6 章的一样,可以参照第六章的硬件原理分析。
    10.3 程序编写
    本实验对应的例程在光盘资料的:i.MX6UL 终结者光盘资料4_裸机例程源码2_led_C program 目录下,我们在 Ubuntu 系统建立“1_Led_C program”文件夹,然后在“Led_C program”文件夹下建立文件:start.Smain.cmain.h。其中 start.S 是汇编文件,main.c 和 main.h 是 语言文件。
    我们在前面新建的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 寄存器中的低 位清零,也就是 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 函数(语言的入口函数。
    至此汇编部分的程序我们就完成了,主要用来设置处理器在 SVC 模式下运行,然后初始化 SP 指针,最后跳转到 程序的 main 入口函数。如果大家有接触过三星的 S3C2440
  • 相关阅读:
    初识C++
    Linux下死锁的调研
    C语言实现单链表面试题(进阶篇)
    C语言实现单链表面试题(基础篇)
    IPC之—共享内存
    IPC之—信号量
    IPC之—消息队列
    初识多线程
    Mysql5.7安装
    RabbitMQ单节点安装/使用!
  • 原文地址:https://www.cnblogs.com/liyue3/p/13218560.html
Copyright © 2011-2022 走看看