基于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,一经查实,立即删除!

相关文章

Windows+VMware+Ubuntu+Anaconda+VMware Tools

Q1:Windows不支持***agent模拟器 A1:在VMware安装Ubuntu虚拟机 P1: 下载 VMware-workstation-full-15.5.6-16341506.exe 安装包(峰哥电脑软件) P2: 下载Ubuntu镜像 地址 ubuntu-18.04.6-desktop-amd64.iso P3:搭载镜…

干翻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配置和宣告,其它没有配置&#…

搭建grafana+loki+promtail日志收集系统

准备工作 下载地址 https://github.com/grafana/loki/releases 安装包放在服务器目录:/opt wget https://github.com/grafana/loki/releases/download/v2.4.2/loki-linux-amd64.zip wget https://github.com/grafana/loki/releases/download/v2.4.2/promtail-lin…

【备战csp-j】csp常考题目详解(3)

三.排列组合 1. 7名学生站成一排,甲、乙必须站在一起有多少不同排法? 答案:1440 解析: 6组人进行全排列:A(6,6); 甲和乙的顺序有两种情况,所以结果要再乘2; …

影响力再度提升,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、…

C++ auto关键字

文章目录 一、auto的推导规则二、auto的限制 C11 中有:auto 类型推导 auto x 5; // OK: x 是 int 类型 auto pi new auto(1); // OK: pi 被推导为 int* const auto *v &x, u 6; // OK: v是const int*类型,u是const int类型 static auto y 0.0;…

【Java】批量生成条形码-itextpdf

批量生成条形码 Controller ApiOperation("商品一览批量生成商品条形码")PostMapping("/batchGenerateProdBarCode")public void batchGenerateProdBarCode(RequestBody ProductListCondition productListCondition,HttpServletResponse response){import…

使用Spring-Security后,浏览器不能缓存的问题

Spring-Security在默认情况下是不允许客户端进行缓存的,在使用时可以通过禁用Spring-Security中的cacheControl配置项允许缓存。 protected void configure(HttpSecurity http) throws Exception {// 允许缓存配置http.headers().cacheControl().disable(); }

Java中使用流将两个集合根据某个字段进行过滤去重?

Java中使用流将两个集合根据某个字段进行过滤去重? 在Java中,您可以使用流(Stream)来过滤和去重两个集合。下面是一个示例代码,展示如何根据对象的某个字段进行过滤和去重操作: import java.util.ArrayList; import java.util.List; impor…

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

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

origin修改默认的字体等

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

银河麒麟V10 达梦安装教程

安装前先准备要安装包,包需要需要区分X86和arm架构。 版本为:dm8_20230419_FTarm_kylin10_sp1_64.iso 达梦数据库下载地址: https://www.aliyundrive.com/s/Qm7Es5BQM5U 第一步创建用户 su - root 1. 创建安装用户组 dminstall。 groupad…

前馈神经网络优化器

引用的知乎上的文章内容,现在有些地方还不太明白,留待以后查看。 import math import numpy as np import matplotlib.pyplot as pltRATIO 3 # 椭圆的长宽比 LIMIT 1.2 # 图像的坐标轴范围class PlotComparaison(object):"""多种优化…

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

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

python3实现线性规划求解

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

MongoDB:MySQL,Redis,ES,MongoDB的应用场景

简单明了说明MySQL,ES,MongoDB的各自特点,应用场景,以及MongoDB如何使用的第一章节. 一. SQL与NoSQL SQL被称为结构化查询语言.是传统意义上的数据库,数据之间存在很明确的关联关系,例如主外键关联,这种结构可以确保数据的完整性(数据没有缺失并且正确).但是正因为这种严密的结…

神经网络基础-神经网络补充概念-34-正则化

概念 正则化是一种用于控制模型复杂度并防止过拟合的技术,在机器学习和深度学习中广泛应用。它通过在损失函数中添加一项惩罚项来限制模型的参数,从而使模型更倾向于选择简单的参数配置。 理解 L1 正则化(L1 Regularization)&a…