基于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.mzph.cn/news/41370.shtml

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

相关文章

干翻Dubbo系列第十一篇:Dubbo常见协议与通信效率对比

文章目录 文章说明 一:协议 1:什么是协议 2:协议和序列化关系 3:协议组成 (一):头信息 (二):体信息 4:Dubbo3中常见的协议 5:…

华为在ospf area 0单区域的情况下结合pbr对数据包的来回路径进行控制

配置思路: 两边去的包在R1上用mqc进行下一跳重定向 两边回程包在R4上用mqc进行下一跳重定向 最终让内网 192.168.10.0出去的数据包来回全走上面R-1-2-4 192.168.20.0出去的数据包来回全走 下面R1-3-4 R2和R3就是简单ospf配置和宣告,其它没有配置&#…

影响力再度提升,Smartbi多次蝉联Gartner、IDC等权威认可

近期,思迈特软件捷报频传,Smartbi凭借技术创新实力和产品能力,成功入选Gartner中国增强数据分析代表厂商及自助分析代表厂商,同时,连续三年蝉联“IDC中国FinTech 50”榜单。 Part.1 再次被Gartner提名 Smartbi深度融…

重塑DTC规则:元气森林的全渠道转型

元气森林作为迄今为止用5-6年时间最快达到70亿年销售额的饮料品牌(统一、可口可乐、东鹏特饮都花了15年左右,康师傅花了10年)。元气森林于2016年在北京创立,凭借健康产品理念和新潮营销方式,一款主打“0糖0卡0脂”概念…

激活函数总结(十一):激活函数补充(Absolute、Bipolar、Bipolar Sigmoid)

激活函数总结(十一):激活函数补充 1 引言2 激活函数2.1 Absolute激活函数2.2 Bipolar激活函数2.3 Bipolar Sigmoid激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、…

“代码驭宠而行“:探索Python的魔法世界,开启编程奇幻之旅!

文章目录 🍀引言🍀第一步:安装Python和开发环境🍀第二步:掌握基本语法🍀第三步:使用Python库和模块🍀第四步:实践项目和练习🍀第五步:学习进阶主题…

origin修改默认的字体等

因为默认是中文宋体,每次切换成英文尤其是希腊字母就很麻烦。 选择菜单栏的【设置】——【选项】点击。 弹出窗口中选择【文本字体】 设置成你需要的字体就好。 这里同样可以更改页面、图等的默认设置。 效果: 选择插入文字后,自动更改成…

Python爬虫的应用场景与技术难点:如何提高数据抓取的效率与准确性

作为专业爬虫程序员,我们在数据抓取过程中常常面临效率低下和准确性不高的问题。但不用担心!本文将与大家分享Python爬虫的应用场景与技术难点,并提供一些实际操作价值的解决方案。让我们一起来探索如何提高数据抓取的效率与准确性吧&#xf…

python3实现线性规划求解

Background 对于数学规划问题,有很多的实现。MatlabYALMIPCPLEX这个组合应该是比较主流的,尤其是在电力相关系统中占据着比较重要的地位。MATLAB是一个强大的数值计算工具,用于数学建模、算法开发和数据分析。Yalmip是一个MATLAB工具箱&#…

Windows上使用dump文件调试

dump文件 dump文件记录当前程序运行某一时刻的信息,包括内存,线程,线程栈,变量等等,相当于调试程序时运行到某个断点上,把程序运行的信息记录下来。可以通过Windbg打开dump,查看程序运行的变量…

go_并发编程(1)

go并发编程 一、 并发介绍1,进程和线程2,并发和并行3,协程和线程4,goroutine 二、 Goroutine1,使用goroutine1)启动单个goroutine2)启动多个goroutine 2,goroutine与线程3&#xff0…

在 React 中获取数据的6种方法

一、前言 数据获取是任何 react 应用程序的核心方面。对于 React 开发人员来说,了解不同的数据获取方法以及哪些用例最适合他们很重要。 但首先,让我们了解 JavaScript Promises。 简而言之,promise 是一个 JavaScript 对象,它将…

排序+运算>直接运算的效率的原因分析

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

ADIS16470和ADIS16500从到手到读出完整数据,附例程

由于保密原因,不能上传我这边的代码,我所用的开发环境是IAR, 下边转载别的博主的文章,他用的是MDK 下文的博主给了你一个很好的思路,特此提出表扬 最下方是我做的一些手册批注,方便大家了解这个东西 原文链…

如何利用 ChatGPT 进行自动数据清理和预处理

推荐:使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 ChatGPT 已经成为一把可用于多种应用的瑞士军刀,并且有大量的空间将 ChatGPT 集成到数据科学工作流程中。 如果您曾经在真实数据集上训练过机器学习模型,您就会知道数据清理和预…

novnc 和 vnc server 如何实现通信?原理?

参考:https://www.codenong.com/js0f3b351a156c/

随机微分方程

应用随机过程|第7章 随机微分方程 见知乎:https://zhuanlan.zhihu.com/p/348366892?utm_sourceqq&utm_mediumsocial&utm_oi1315073218793488384

复习3-5天【80天学习完《深入理解计算机系统》】第七天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

Linux与bash(基础内容一)

一、常见的linux命令: 1、文件: (1)常见的文件命令: (2)文件属性: (3)修改文件属性: 查看文件的属性: ls -l 查看文件的属性 ls …

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 摘要当前的检测sota模型网络架构swin Transformer和Vision Transformer的不同之处整体架构Patch Partition结构Linear Embedding结构Swin Transformer Block结构 Patch MergingW-MSAMSA模块计算量W-M…