深入理解ARM体系结构-编译器使用指南

深入理解ARM体系结构-编译器使用指南
共58节 3人在学 课程详情
  • 课程简介

    • 课程简介
    • 答疑说明
  • 工具链介绍

    • 工具介绍
    • 手动构建工程
    • Keil的工程构建分析
    • 深入了解背后工作过程
  • 控制编译器的行为

    • 常用编译选项
    • 传递宏定义
    • 读懂警告信息
    • 代码优化等级含义
    • 使用volatile避免过度优化(1)
    • 使用volatile避免过度优化(2)
    • 使用volatile避免过度优化(3)
    • 使用内联函数提升运行速度
    • 优化结构体占用的存储空间
    • 优化枚举类型占用的存储空间
    • 强制保留变量或函数以避免优化
    • 指示存储的对齐位置
    • 使用纯汇编实现C函数
  • 可执行程序是如何生成的

    • 目标文件里有哪些东西
    • 可执行文件的如何生成
    • 程序是如何加载运行的
    • 为什么会有bss区域
    • 获取可执行文件的详细信息
  • 控制链接过程

    • 段类型映射
    • 加载域与执行域
    • 分析map文件中的加载域执行域
    • 使用命令行配置加载域和执行域配置
    • 使用分散加载文件配置加载域和执行域
    • 分散加载文件简介
    • 示例一:简单的内存布局(1)
    • 示例一:简单的内存布局(2)
    • 示例二:一个加载和多个连续的执行域
    • 示例三:一个加载域和多个非连续执行域
    • 示例四:多个加载域和非连续执行域
    • 直接指定变量和函数的存放地址
    • 利用分散加载文件指定变量的存放地址
    • 利用分散加载文件指定函数的存放地址
    • 将指定文件的代码放到外部Flash
    • 指定未分配段的存放地址
    • 根区域和inrootsection
    • 获取加载域的相关信息
    • 获取执行域的相关信息
    • 栈和堆是如何分配的
    • 获取栈使用情况
    • 强符号与弱符号
    • 自动去除未用的函数和变量(1)
    • 自动去除未用的函数和变量(2)
  • C库使用

    • C库简介
    • 程序启动流程:从__main()到main()
    • 堆的使用
    • 定制输入输出函数(1)
    • 定制输入输出函数(2)
    • 多线程环境下访问C库问题(1)
    • 多线程环境下访问C库问题(2)
    • C微库简介
  • 其它

    • fromelf工具的使用

    订阅失败

    深入理解ARM体系结构-编译器使用指南
    深入理解ARM体系结构-编译器使用指南 ...

    订阅列表已满,请先移出部分订阅内容。

    当前章节需购买后观看
    开通超级会员免费看!专家精选系列课程,满足你从入门到精通!更有问答月卡免费送,你的问题有问必答!
    提交答案

    购买课程

    扫码完成付费,可继续学习全部课程内容

    加载中...
    播放页问题反馈
    视频学习中有任何产品建议都可由此反
    馈,我们将及时处理!

    课时介绍

    多线程环境下访问C库问题(1)多线程环境下访问C库问题(1)多线程环境下访问C库问题(1)

    课程介绍

    注意注意!本课程所用Keil自带的编译器版本为AC6。由于AC5与AC6在使用时有些地方差异较大,如果你使用AC5(老版本Keil自带的)来学习本课程,则可能会出现各种奇怪的编译、汇编错误。

    建议如果不是特别需要,请更新到最新版本的Keil 5.4.x以上版本。否则,学习过程中出现的一些问题我可能无法帮你解决。

    ---------------

    为什么我会制作该课程?

    若干年前,有同学问我:是否会制作关于分散加载文件的相关课程?还有同学问我:能不能教我怎样看map文件?

    实际上,这些问题都是与ARM工具链相关的。因此,根据同学们的实际需求,我仔细研究了ARM编译工具链的相关手册,并结合实际的开发需求,制作出了这门课程。

    为什么学习本课程?

    一次学习,吃透 ARM 编译工具链

    平时我们使Keil等工具来完成工程构建时,往往只是“按部就班地使用”,对它们的底层机制几乎一无所知。

    而一旦出现构建错误、链接异常或内存溢出等问题,往往只能靠搜索、猜测、试错,既低效又不可靠。 此外,对于某些特殊的需求(如控制数据存放到指定位置)往往无能为力。

    这些问题的根源,在于我们只是“用工具”,而不是“理解工具”。所以我开发了这门课,希望带你真正吃透常用的 ARM 编译工具链,打下坚实的构建基础。 
    本课程从实际工程中常见的痛点出发,带你深入剖析编译工具链的内部机制,掌握从源码到可执行文件的完整流程。你将学到:
    ✅ 工程构建背后到底发生了什么,编译、汇编、链接如何协同完成
    ✅ 可执行文件(ELF)的结构都有哪些内容,这些内容如何从源码转换而来
    ✅ 常用编译器和链接器选项的使用技巧,以及如何写出更高效的代码
    ✅ 如何精确控制内存布局,把函数和变量放到你想要的位置
    ✅ 程序运行时的内存管理机制(如堆栈的组织与使用)

    ✅ 如何将可执行文件转换成 bin、hex 等目标文件,适配不同下载工具  

    此外,无论是在开发过程中,还是面试过程时,你是否有遇到以下问题:

    ✅ 资源不足,却无从下手?

    • Flash/RAM不够用,但不知道哪些代码可以优化? 

    • 如何通过编译优化减少30%的代码体积,降低硬件成本?

    ✅ 优化选项导致玄学Bug?

    • 开了-O2/-O3后,程序偶尔跑飞,但关掉优化又性能不足? 

    • 优化选项(-O2/-O3)导致程序行为异常,但不懂如何调整?

    • volatile有什么用处?在什么时候需要使用?

    • 为什么加了volatile还是被编译器优化掉?

    ✅ 需要特殊内存布局,但不会实现?

    • 如何把关键函数放到RAM里加速执行?

    • 怎么让中断向量表固定到指定地址? 

    ✅ 面试时的致命问题

    • .bss段和.data段有什么区别?为什么要有.bss?

    • RO、RW、ZI各是什么?与程序中的哪些东西相关?

    • 程序启动时,__main到底做了什么?

    • 为什么有些函数明明没调用,却被链接进最终固件?

    • 在RTOS中,多个任务能否调用printf()库函数时可能会引发什么问题?如何解决?

    通过该课程,你将解决以上问题。

    image/jpegimage/jpegimage/jpegimage/jpeg

     

     

     

     

    推荐课程

    信息系统项目管理师自考笔记

    李明 · 867人在学

    python从0到1:期货量化交易系统(CTP实战,高频及合成K线数据

    王先生 · 22649人在学

    手把手搭建Java超市管理系统【附源码】(毕设)

    汤小洋 · 4282人在学

    Java毕设springboot外卖点餐系统 毕业设计毕设源码 使用教

    黄菊华 · 824人在学

    基于SSM酒店管理系统(毕设)

    小尼老师 · 890人在学

    java项目实战之购物商城(java毕业设计)

    Long · 5195人在学

    手把手搭建Java求职招聘系统【附源码】(毕设)

    汤小洋 · 1525人在学

    Python Django 深度学习 小程序

    钟翔 · 2390人在学

    城管局门前三包管理系统+微信小程序(vue+springboot)

    赖国荣 · 666人在学

    Vue+Uni-app(uniapp)入门与实战+赠送仿美团点餐小程序

    李杰 · 4067人在学

    正在试验
    后自动删除环境
    课程实验
    本次实验时间已到期 00:00:00
    课件正在飞速打包中,请耐心等待几秒钟~