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

news2024/11/23 16:46:49

引入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.coloradmin.cn/o/891553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分班情况通知如何下发?使用这个技术源一键搞定

在下发分班情况通知之前,我们需要制作好分班查询页面,我们先来看看利用易查分快速制作分班查询页面的教程,后面会分享具体的【分班情况通知范文】【分班情况通知下发方式】! 分班查询页面制作教程 在制作分班查询系统前&#xff…

《Go 语言第一课》课程学习笔记(四)

构建模式:Go Module 的 6 类常规操作 为当前 module 添加一个依赖 我们如何为一个 Go Module 添加一个新的依赖包呢? 如果我们要为项目增加一个新依赖:github.com/google/uuid,我们首先会更新源码:package mainimpor…

Docker 三要素

文章目录 Docker 简介Docker客户端Docker服务器Docker 镜像Docker 容器 Docker 简介 学习完容器的相关概念,开始学习docker的核心组件分别是Docker客户端、Docker服务器、Docker镜像、Docker容器、仓库。 学习之前,我们先思考一个问题,目前…

如何关闭“若要接收后续google chrome更新,您需使用windows10或更高版本”

Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Policies\Google\Chrome] "SuppressUnsupportedOSWarning"dword:00000001 如何关闭“若要接收后续 google chrome 更新,您需使用 windows 10 或更高版本” - 知乎

影视公司技术流程设计之服务器搭建

在影视公司,硬件的投入占相当大的比例, 大到存储, 服务器,工作站, 小到主机CPU,内存,显卡,手绘板。 而存储又是硬件上的大头,一套合理的存储解决方案,优为关键…

render和h函数的使用

// 如果没有配置项,则可以省略不写 {}h("div", [h(h-tooltip, // 在tooltip中进行改造// ----- h-tooltip 的配置项 -----Start{props: {placement: "top-start",// content: 提示内容,transfer: true},style: {overflow: hidden,text-overflow…

信安通用基础知识

文章目录 密码学经典误区PGP优良保密协议信安经典其它安全手段XSS与CSRF cross site request forgeryCSRF的利用逻辑CSRF示例CSRF防范检查Referer字段添加校验token XSS cross site scripting common weakness enumeration常见密码api误用(摘自毕设参考文献&#xf…

Java面试题目汇总

一、面向对象的三个基本特征 2、方法重载和方法重写的概念和区别 3、接口和内部类、抽象类的特性 4、文件读写的基本类 **5、串行化的注意事项以及如何实现串行化 6、线程的基本概念、线程的基本状态以及状态之间的关系 7、线程的同步、如何实现线程的同步 8、几种常用的数据结…

如何仿写简易tomcat 实现思路+代码详细讲解

仿写之前,我们要搞清楚都要用到哪些技术 自定义注解,比如Tomcat使用的是Servlet,我们可以定义一个自己的MyServlet构造请求体和返回体,比如tomcat使用HttpRequest,我们可以自己定义myHttpRequestjava去遍历一个指定目…

华为网络篇 单区域OSPF-32

难度1复杂度1 目录 一、相关原理 二、实验拓扑 三、实验步骤 四、实验过程 总结 一、相关原理 OSPF(Open Shortest Path First)是一种链路状态路由协议,它是由IETF的OSPF工作组开发的公有协议,所有的厂商都可以使用它。相比静…

算法01 跟左神刷题01

题目一 给定一个有序数组arr,代表坐落在X轴上的点,给定一个正数K,代表绳子的长度 返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。 题的理解 贪心也行, 然后比如绳子的最右端到了973 绳子长度为100 而这是个有序数组…

Docker是什么, 为什么这么火

Docker本质 Docker 本质其实是 LXC 之类的增强版,它本身不是容器,而是容器的易用工具。容器是 linux 内核中的技术,Docker 只是把这种技术在使用上简易普及了。Docker 在早期的版本其核心就是 LXC 的二次封装发行版。 Docker 作为容器技术的一…

LLM 回答更加准确的秘密:为检索增强生成(RAG)添加引用源

如何让你的大模型变得更强?如何确定其获取信息来源的准确性? 想要回答这两个问题,就不得不提到今天文章的主角——RAG。RAG,也就是检索增强生成(Retrieval-augmented generation) ,可以弥补现有 LLM 应用能…

WPF CommunityToolkit.Mvvm

文章目录 前言ToolkitNuget安装简单使用SetProperty,通知更新RealyCommandCanExecute 新功能,代码生成器ObservablePropertyNotifyCanExecuteChangedForRelayCommand其他功能对应关系 NotifyPropertyChangedFor 前言 CommunityToolkit.Mvvm(…

“去哪儿旅行”Java工程师内推资格——直入笔试,圆你大厂梦,放心啦,来源可靠,给你的梦想提提速!

岗位信息 Java开发工程师(2024) 所在地:北京市海淀区 工作职责: 按照需求,负责技术平台或业务支持系统的设计、维护,以及代码开发工作; 根据开发规范编写各种开发文档及项目文档; 协助需求方进行技术调研; 不断提高产品的代码质量,参与…

详解C#-static void Main(string[] args)

目录 简介: 举例: 输出结果:​编辑 总结: 简介: 在C#中static void Main(string[] args)这个句话有什么作用,分别代表什么意思!! 这句话是入口函数的声明,指定了C#程序的入口点,并定义了一个名为”Mai…

虹科分享 | 温度边缘效应对冻干成品含水量的影响(上)——原理和现象

01 冻干流程简介 生物制药成品的冻干过程通常包括以下三个步骤: 预冻(Freezing) 在冻干过程中,首先需要将生物制药成品冷冻至非常低的温度,通常在-40℃至-80℃之间。这有助于将水分转变为冰晶,减少冻干过…

低成本高收益,五金店小程序的秘密武器

如今,随着移动互联网的快速发展,小程序成为了许多企业进行线上业务拓展的重要方式之一。对于那些不懂代码的人来说,制作一个小程序可能会让人觉得困难重重。但是,现在,借助乔拓云平台,不懂代码的人也能轻松…

BUUCTF [安洵杯 2019]easy_serialize_php 1 详细讲解

题目来自buuctf&#xff0c;这是一题关于php序列化逃逸的题 1. 题目 题目给出的代码 <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_S…

JVM——类文件结构

文章目录 一 概述二 Class 文件结构总结2.1 魔数2.2 Class 文件版本2.3 常量池2.4 访问标志2.5 当前类索引,父类索引与接口索引集合2.6 字段表集合2.7 方法表集合2.8 属性表集合 一 概述 在 Java 中&#xff0c;JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class …