基于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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/71023.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSAPP Lab2:Bomb Lab

说明 6关卡,每个关卡需要输入一个字符串,通过逆向工程来获取对应关卡的字符串 准备工作 环境 需要用到gdb调试器 apt-get install gdb系统: Ubuntu 22.04 本实验会用到的gdb调试器的指令如下 r或者 run或者run filename 运行程序,run filename就是…

数据生成 | MATLAB实现WGAN生成对抗网络数据生成

数据生成 | MATLAB实现WGAN生成对抗网络数据生成 目录 数据生成 | MATLAB实现WGAN生成对抗网络数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 1.WGAN生成对抗网络,数据生成,样本生成程序,MATLAB程序; 2.适用于MATL…

网络

mcq Java 传输层:拆分和组装,完成端到端的消息传递,流量控制,差错控制等 网络层: 寻址、路由,复用,拥塞控制,完成源到宿的传递。 显然A选项是错误的,有流量控制的是传输层…

爬虫逆向实战(三)--天某云登录

一、数据接口分析 主页地址:天某云 1、抓包 通过抓包可以发现登录接口是account/login 2、判断是否有加密参数 请求参数是否加密? 通过“载荷”模块可以发现password、comParam_signature、comParam_seqCode是加密的 请求头是否加密? 无…

数据结构—树表的查找

7.3树表的查找 ​ 当表插入、删除操作频繁时,为维护表的有序表,需要移动表中很多记录。 ​ 改用动态查找表——几种特殊的树 ​ 表结构在查找过程中动态生成 ​ 对于给定值key ​ 若表中存在,则成功返回; ​ 否则&#xff0…

vue中的路由缓存和解决方案

路由缓存的原因 解决方法 推荐方案二,使用钩子函数beforeRouteUpdate,每次路由更新前执行

Fortinet数据中心防火墙及服务ROI超300%,Forrester TEI研究发布

近日,专注网络与安全融合的全球网络安全领导者 Fortinet(NASDAQ:FTNT)联合全球知名分析机构Forrester发布总体经济影响独立分析报告,详细阐述了在企业数据中心部署 FortiGate 下一代防火墙(NGFW&#xff09…

Prometheus流程图(自绘)-核心组件-流程详解

阿丹手绘流程图:图片可能有点小查看的时候放大看看哈! prometheus核心组件 prometheus server Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。Prometheus Server可以通过静态配置管理…

生物笔记——暑期学习笔记(四)

生物笔记——暑期学习笔记(四) 文章目录 前言一、R篇1. unname()2. duplicated()3. 数据提取4. 分组 二、生信篇1. 文本处理常用命令2. 命令输出1. 重定向2. 多命令执行 3. 文本工具4. 本地hmm鉴定1. hmmer软件安装2. 文件准备3. 基于hmm的鉴定 总结 前言…

c++--SLT六大组件之间的关系

1.SLT六大组件: 容器,迭代器,算法,仿函数,适配器,空间配置器 2.六大组件之间的关系 容器:容器是STL最基础的组件,没有容器,就没有数据,容器的作用就是用来存…

【计算机网络篇】UDP协议

✅作者简介:大家好,我是小杨 📃个人主页:「小杨」的csdn博客 🐳希望大家多多支持🥰一起进步呀! UDP协议 1,UDP 简介 UDP(User Datagram Protocol)是一种无连…

【目标检测系列】YOLOV2解读

为更好理解YOLOv2模型,请先移步,了解YOLOv1后才能更好的理解YOLOv2所做的改进。 前情回顾:【目标检测系列】YOLOV1解读_怀逸%的博客-CSDN博客 背景 通用的目标检测应该具备快速、准确且能过识别各种各样的目标的特点。自从引入神经网络以来&a…