实用指南:玳瑁的嵌入式日记---0923(ARM)

news/2025/9/24 17:22:41/文章来源:https://www.cnblogs.com/ljbguanli/p/19109608

实用指南:玳瑁的嵌入式日记---0923(ARM)

1.链接脚本的作用?各个段存放什么类型数据

SECTIONS
{
. = 0x87800000;
.text :
{
obj/start.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata*)}
.data  ALIGN(4) : {*(.data)}
__bss_start = .;
.bss ALIGN(4) : {*(.bss) *(COMMON)}
__bss_end = .;
}
链接脚本的整体作用

这个链接脚本定义了程序在内存中的布局,指定了各代码段和数据段的加载地址、排列顺序及对齐方式,最终指导链接器将多个目标文件合并为一个可执行文件。具体来说,它搞定了以下工作:

  1. 设定程序的起始加载地址为 0x87800000(通常是嵌入式系统中的 RAM 或 Flash 地址)
  2. 规定了各段(.text、.rodata、.data、.bss)的排列顺序和对齐要求
  3. 定义了 __bss_start 和 __bss_end 符号,用于标记.bss 段的起止位置(方便运行时初始化)
各段的具体含义及存储数据类型
  1. .text 段

    • 起始地址:0x87800000(通过 . = 0x87800000 设定)
    • 包含内容:
      • 优先存放 obj/start.o(通常是启动文件,包含程序入口、中断向量表等关键代码)
      • 随后合并所有目标文件的 .text 段(*(.text)
    • 存储数据:程序的可执行指令(机器码),如函数实现、汇编指令等,只读可执行
  2. .rodata 段

    • 特性:ALIGN(4) 表示按 4 字节对齐(提高访问效率)
    • 包含内容:*(.rodata*) 表示合并所有目标文件的只读数据段
    • 存储数据:只读常量,如字符串常量("hello")、const 修饰的全局变量等,只读不可修改
  3. .data 段

    • 特性:ALIGN(4) 按 4 字节对齐
    • 包含内容:*(.data) 合并所有目标文件的已初始化数据段
    • 存储数据:已初始化的全局变量和静态变量,如 int a = 10;,可读可写
  4. .bss 段

    • 特性:ALIGN(4) 按 4 字节对齐
    • 包含内容:
      • *(.bss) 合并所有目标文件的未初始化数据段
      • *(COMMON) 处理未初始化的全局变量(C 语言中未显式初始化的全局变量默认放在 COMMON 块)
    • 存储数据:未初始化的全局变量和静态变量(如 int b;),运行时会被自动初始化为 0,可读可写
    • 特殊符号:
      • __bss_start = .; 标记.bss 段的起始地址
      • __bss_end = .; 标记.bss 段的结束地址(这两个符号通常在启动代码中用于实现.bss 段的清零初始化)
总结

        该脚本典型用于嵌入式系统(如 ARM 架构开发板),通过固定起始地址和规范段布局,确保程序能在指定内存空间正确加载和运行。各段按 .text.rodata.data.bss 的顺序排列,符合程序执行时的内存使用逻辑(代码→只读数据→已初始化数据→未初始化数据)。

2.编译过程需要哪些工具,分别什么作用?

  1. 交叉编译器工具链 (arm-linux-gnueabihf-)这是针对 ARM 架构的交叉编译器具链,用于在 x86 等主机平台上编译能在 ARM 架构设备上运行的软件。

  2. gcc (交叉编译版本:arm-linux-gnueabihf-gcc)

    • 作用:C 语言编译器
    • 在这里负责将 C 源代码 (.c) 和汇编源代码 (.S) 编译为目标文件 (.o)
    • 使用了-Wall(显示所有警告)、-nostdlib(不链接标准库)、-c(只编译不链接)等选项
  3. ld (交叉编译版本:arm-linux-gnueabihf-ld)

    • 作用:链接器
    • 负责将所有目标记录 (.o) 链接成可执行的 ELF 格式文件 (.elf)
    • 通过-Timx6ull.lds指定链接脚本,控制链接过程和内存布局
  4. objcopy (交叉编译版本:arm-linux-gnueabihf-objcopy)

    • 作用:目标材料转换工具
    • 在这里将 ELF 格式的可执行文件 (.elf) 转换为二进制文件 (.bin)
    • 使用-O binary指定输出格式为二进制,-S移除符号表和重定位信息,-g移除调试信息
  5. objdump (交叉编译版本:arm-linux-gnueabihf-objdump)

    • 作用:目标文件反汇编工具
    • 用于将 ELF 格式文件反汇编,生成汇编代码文本文件 (.dis)
    • 通过-D选项对所有段进行反汇编,方便调试和分析

这些器具共同完成了从源代码到可在 ARM 设备上运行的二进制文件的完整编译流程:源代码编译→目标记录链接→格式转换→反汇编分析。

3.led点灯程序需要进行哪些步骤?

一、硬件基础准备

  1. 硬件连接确认
    • 确定 LED 与 MCU 引脚的连接:代码中使用GPIO1_IO03引脚(通过GPIO1->DR操作第 3 位),需确保硬件上 LED 通过此引脚控制(通常 LED 串联限流电阻后连接到该引脚和地 / 电源)。
    • 确认电路逻辑:代码中led_on()通过清除DR寄存器第 3 位(输出低电平)点亮 LED,说明硬件采用 “低电平有效”(LED 另一端接电源)。

二、软件搭建步骤

1. 系统时钟初始化(clock_init()
  • 作用:使能外设时钟,确保 GPIO 等模块能正常工作。
  • 代码中通过设置CCM(时钟控制模块)的CCGR0~CCGR6寄存器为0xFFFFFFFF,全使能所有外设的时钟(简化操作,实际可按需使能)。
2. GPIO 引脚初始化(led_init()
  • ① 调整引脚复用功能通过IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0)将物理引脚复用为 GPIO 功能(而非其他外设功能如 UART、SPI)。
  • ② 配置引脚电气属性通过IOMUXC_SetPinConfig(...)设置驱动强度(代码中0x10B0包含驱动强度等参数)、上下拉电阻、速度等硬件特性。
  • ③ 配置 GPIO 为输出模式通过GPIO1->GDIR |= (1 << 3)设置GPIO1的第 3 位为输出模式(GDIR寄存器:1 = 输出,0 = 输入)。
  • ④ 初始状态设置调用led_off()初始化 LED 为熄灭状态(设置GPIO1->DR第 3 位为 1,输出高电平)。
3. 实现 LED 控制逻辑
  • 亮灯(led_on()GPIO1->DR &= ~(1 << 3)清除第 3 位,输出低电平(根据硬件逻辑点亮 LED)。
  • 灭灯(led_off()GPIO1->DR |= (1 << 3)置位第 3 位,输出高电平(LED 熄灭)。
  • 闪烁(led_toggle()GPIO1->DR ^= (1 << 3)通过异或操作翻转第 3 位电平,实现亮灭切换。
4. 主程序循环(main()
  • 初始化流程:先初始化时钟(clock_init()),再初始化 LED(led_init())和蜂鸣器(beep_init())。
  • 主循环:通过led_toggle()beep_toggle()实现 LED 与蜂鸣器同步闪烁 / 鸣叫,led_delay()提供简单延时控制频率。

三、编译与运行

  1. 交叉编译:使用arm-linux-gnueabihf-gcc等工具链编译,结合链接脚本(如imx6ull.lds)生成可执行文件。
  2. 烧录运行:凭借 J-Link 或 SD 卡等方式将程序烧录到 i.MX6ULL 开发板,复位后 LED 即按设定逻辑工作。

核心逻辑总结

LED 点灯的本质是 **“配置 GPIO 引脚为输出模式,并通过寄存器控制其高低电平”**,步骤可简化为:使能时钟 → 配置引脚复用 → 设定电气属性 → 配置为输出 → 控制电平高低。代码中通过寄存器操作直接控制硬件,体现了嵌入式开发中 “直接操作底层外设” 的特点。

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

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

相关文章

个人博客搭建记录【hexo】

安装hexo 部署环境Node.js GitNode.js 部署,建议版本大于 12.0Node.js 安装中步骤中需要注意其中两处:Add to PATH 选上,使其集成到系统环境中: ​此处勾选会安装各种编程环境和软件,这对于安装hexo是不必要的: …

喵喵喵

笨蛋循环。笨蛋黑白染色。笨蛋欧拉回路。笨蛋欧拉回路!!笨蛋性质。笨蛋反图。笨蛋典题。笨蛋困难难题目。笨蛋猫猫。笨蛋煎蛋。笨蛋,眼睛瞎了。

Ansible自动化管理 - 指南

Ansible自动化管理 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

flink不同环境切换 - --

代码: package com.yourcompany.flink; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;import java.util.Properties; /** * 最简版 - 所有代码在一个文件中 */public class Minima…

网站原则广州网站开发公司

RabbitMQ&#xff1a;高效的消息队列中间件及其 PHP 实现 一、什么是 RabbitMQ&#xff1f; RabbitMQ 是一个开源的消息队列中间件&#xff0c;使用 Erlang 编写&#xff0c;遵循 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议。它的主要功能是提供一种…

ps-填充色

ps-填充色一、填充颜色用矩形选框选中范围; Ctrl + delete:填充背景色; Alt + delete:填充前景色;不将就,不强求!

PythonStudio_圆的面积demo源代码

# Powered By Python Studio, The best Python GUI IDE to download from glsite.com. import os from glcl import *class Form1(Form):def __init__(self, owner):self.Button3 = Button(self)self.Button2 = Button…

HarmonyOS 5分布式数据同步实战:跨设备待办事项应用

🔧 一、前期准备:配置与权限 在开始编码前,需要进行一些基础配置。模块配置 (module.json5): 在 module.json5文件中申请分布式数据同步权限。 {"module": {"requestPermissions": [{"na…

深入理解HarmonyOS 5的AVSession:构建跨设备媒体播放器

🎯 一、AVSession 概述与核心价值 AVSession(媒体会话)是HarmonyOS分布式媒体控制的核心框架。它允许应用程序将本地播放的媒体信息和控制能力暴露给系统,使得其他设备(如手机、平板、智慧屏)可以发现、查看和控…

Extjs小例子

Extjs小例子 1.监听文本框是否已经修改过xtype : textfield,  fieldLable : 标题,  listeners : {     change : function(field,newValue,oldValue){ alert(newValue+---+oldValue);  …

郑州网站建设怎么样短视频推广方案怎么做

随着半导体技术的不断进步&#xff0c;晶圆制造作为集成电路产业的核心环节&#xff0c;对生产过程的精密性和洁净度要求日益提高。在众多晶圆制造工具中&#xff0c;PFA&#xff08;全氟烷氧基&#xff09;晶圆夹以其独特的材质和性能&#xff0c;在近年来逐渐受到业界的广泛关…

HT-AD4PS-1+ 一分四射频功分器:1-500 MHz 小尺寸/低插损,通信、医疗全能打

HT-AD4PS-1+ 一分四射频功分器:1-500 MHz 小尺寸/低插损,通信、医疗全能打成都恒利泰(HenryTech)HT-AD4PS-1+ 是一款全国产化的一分四表贴功分器/合路器,频率覆盖 1-500 MHz,插入损耗≤1.8 dB,体积小巧,可直接…

HarmonyOS资源管理与访问:多分辨率与多语言适配

本文将深入探讨HarmonyOS应用开发中的资源管理机制,重点介绍多分辨率适配和多语言本地化的完整解决方案。1. 资源管理系统架构 HarmonyOS提供了统一的资源管理框架,支持应用资源的分类、访问和适配。资源管理系统采用…

面试官:为什么没有虚拟线程池?

Java 官方文档明确指出:Do not pool virtual threads. 虚拟线程不是昂贵资源,永远不应该被池化。 应该为每个任务创建一个新的虚拟线程,它们应该是短暂的、任务级别的。这是为什么呢?为什么只有虚拟线程 Virtual T…

做外国网站自媒体网络工程师和做网站哪个难

————— 第二天 —————————————————下面我们一起来研究这三个问题。问题1&#xff1a;哪些是需要回收的&#xff1f;首先我们需要知道如何哪些垃圾需要回收&#xff1f;判断对象是否需要回收有两种算法。一种是引用计数算法、一种是可达性分析算法。引用计…

润生软件简介:以“重构与共生”引领商业未来

2014年,广东企业家陈总敏锐洞察到:当算力实现百倍跃升,数字信息将深刻重塑社会结构,传统行业与企业形态面临全面重构。基于此,他发起创立了润生公司(Reconstruction-Symbiosis Framework,简称RS),开启一场以“…

Python 并发编程

Python 并发编程是提升程序执行效率的核心技术,尤其在处理多任务场景(如网络请求、数据计算、文件 IO 等)时至关重要。 1、threading与线程池 多线程是 Python 中最常用的并发方式之一,通过创建多个线程实现任务并…

博物馆展陈设计公司搜索引擎优化什么意思

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 1.请重点的掌握I/O的。 场景&#xff1a;最近你在企业也想搞一个短视频又想搞一个存储的云盘&#xff0c;你一听回想到自己对于这些存储的基础还不是很清楚&#xff0c;于是回家开始了…

做液压的公司网站成都营销型网站建设中账号

文章目录 1. 命令概述2. 命令格式3. 常用选项4. 相关描述4.1 tree 命令安装 5. 参考示例5.1 创建树形目录5.2 使用 tree 命令查看树形目录 1. 命令概述 tree 命令用于在命令行界面以树状图形式显示目录及其子目录的内容。这个命令递归地列出所有子目录&#xff0c;并可选择显示…

安装pyautogui时与setuptool时冲突报错-module setuptools.dist has no attribute check_test_suite

采用离线的安装方式: 下载 命令: pip install E:\Codes\Wheels\PyAutoGUI-0.9.54.tar.gz --no-deps --target=..\myyolo1\Lib\site-packages