基于IMX6ULLmini的linux裸机开发系列二:使用C语言和SDK点亮LED

引入sdk头文件

 sudo chown -R gec /opt

用这条命令给gec赋权限,否则访问权限不够,无法读取,如下图成功

目的:解决寄存器地址难查难设置

  • devices/MCIMX6Y2/MCIMX6Y2.h

    记录外设寄存器及其相关操作

  • devices/MCIMX6Y2/drivers/fsl_iomuxc.h

    记录引脚复用及其相关操作

注意

MCIMX6Y2.h注释以下头文件包含

#include "core_ca7.h"  
#include "system_MCIMX6Y2.h"   

增加以下宏定义:

#define __O  volatile
#define __IO  volatile 
#define __I  volatile const 
​
#define uint32_t unsigned int
#define uint16_t unsigned short
#define uint8_t unsigned char

使用C语言

目的:提高开发效率

bin文件组成介绍

段是程序的基本组成元素:

  • .text段:代码文本

  • .rodata段:只读变量,如const修饰的变量

  • .data段:非零的全局变量、静态变量

  • .bss:值为 0 的全局变量、静态变量

  • .comment:存放注释

  • ...

准备C语言环境

  • bss段清零

bss段是一种在程序运行时需要初始化的全局或静态变量的存储区域。bss段中的变量在编译时不分配具体的内存空间,而是在程序加载到内存后,运行时会被清零。

将bss段清零的操作称为"bss段清零",其含义是将bss段中的所有变量的内存空间初始化为零。这通常是在程序启动时进行的操作。通过清零bss段,可以确保所有的全局和静态变量在使用之前都被初始化为零值。这样可以避免在未初始化状态下使用这些变量时出现不可预料的行为。

bss段清零是由操作系统或运行库负责执行的,它们会在加载程序到内存时遍历bss段的内存空间,并将其内容设置为零。这样,在程序开始执行之前,所有位于bss段的变量都将具有预定义的默认值,即零值。

需要注意的是,只有位于bss段的变量才会被清零,已经在代码中显式初始化的全局或静态变量不会受到影响。

  • 栈指针(sp)

栈指针 (Stack Pointer) 是指向程序运行时堆栈 (Stack) 顶部的指针。堆栈是用于存储函数调用、局部变量和其他临时数据的一种数据结构,遵循后进先出(LIFO)的原则。

栈指针 (SP) 在程序执行期间动态地移动,以反映当前堆栈顶部的位置。通常,栈指针向下移动(减小)一次指向堆栈上一个条目。

当函数被调用时,它会将返回地址、参数以及其他必要的数据压入堆栈。栈指针会相应地向下移动以适应新的数据。当函数退出时,栈指针会向上移动,以释放先前压入堆栈的数据。

栈指针的具体实现方式取决于底层的硬件架构和操作系统。在某些架构中,栈指针可以保存在特定的寄存器中,如 x86 架构中的 ESP (Extended Stack Pointer) 或 ARM 架构中的 SP (Stack Pointer) 寄存器。在其他情况下,栈指针可能存储在内存中的特定位置。

栈指针的正确使用对于程序的正确执行和内存管理非常重要。在编程过程中,我们应该遵循正确的堆栈操作,确保栈指针在函数调用和返回过程中正确地移动,并避免栈溢出等问题

裸机程序控制外设

特点:读数据手册、设寄存器值

  • 找出外设有哪些相关寄存器

  • 找出外设相关寄存器如何设置

链接脚本引入

目的:指定链接地址、起始代码在text段的位置,其他段的位置

官方资料:Using LD, the GNU linker

SECTIONS{
​
    . =xxx //链接起始地址
    .段名
    {
        xxx
        *(.段名)
    }
    ...
}

这是一个链接器脚本片段示例,用于定义程序的内存布局和段的起始地址。下面是对每个段的简要说明:

  • .text:包含程序的可执行代码和只读数据。.text 段对齐到 4 字节边界,并包含了 build/start.o 目标文件和其他所有的 .text 节。
  • .rodata:包含只读的常量数据。.rodata 段对齐到 4 字节边界,并包含了所有的 .rodata 节。
  • .data:包含已初始化的全局和静态变量。.data 段对齐到 4 字节边界,并包含了所有的 .data 节。
  • .bss:包含未初始化的全局和静态变量。.bss 段对齐到 4 字节边界,并包含了所有的 .bss 节和 COMMON 节。

此链接脚本还定义了两个符号 __bss_start__bss_end,分别指向 .bss 段的起始地址和结束地址。这些符号可以在程序中使用,以确定 BSS 段的大小和位置。

值得注意的是,这只是一个链接器脚本的示例片段,具体的内存布局和段定义可能因目标平台和工具链而异。在实际使用时,你需要根据你的需求和目标环境来编写和调整链接器脚本。

Makefile修改

  • 兼容.s汇编文件

  • 添加编译程序命令

  • 添加sd卡烧录命令

 有报错

gec@ubuntu:~/bare_mental/part_3$ make burn
cp  build/led.bin /home/embedfire/bare_mental/part_1/download_tool
cp: 无法创建普通文件'/home/embedfire/bare_mental/part_1/download_tool': 没有那个文件或目录
Makefile:45: recipe for target 'burn' failed
make: *** [burn] Error 1

 

 这里改为自己当前的用户名就行

猜你喜欢

转载自blog.csdn.net/qq_51519091/article/details/132347501