一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(知识点补充)
知识点补充:
Linux进程中的五个段
BSS段(Block Started bySymbol,意为“以符号开始的块”):
BSS,是Unix链接器产生的未初始化数据段。通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS段属于静态内存分配。
代码段(code segment/text segment):
代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
堆(heap):
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈(stack):
栈又称为堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。它是由操作系统分配的,内存的申请与回收都由OS管理。
PS:
全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;而函数内的自动变量都在栈上分配空间。.bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化,因此造成了上述情况。
bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。
data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。 数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。
BSS段为什么要初始化/清除?
BSS段是不会出现在程序下载文件(*.bin *.hex)中的,因为全都是0。如果把它们出现在程序下载文件中,会增加程序下载文件的大小。实际应用中,通常只需要把bss段的起始地址和结束地址保存起来,而不需要将程序下载文件中出现bss段(一堆0)将来真正运行程序的时候,再根据这两个数据进行bss段的初始化就行了。
可执行映像文件
ELF:Linux操作系统下可执行映像文件格式,在Linux环境下用GCC编译器生成的可执行映像文件格式即为ELF格式,在Linux操作系统下可直接运行。
可执行映像文件主要分为3个段,即RO段、RW段和ZI段,如下图所示:

- RO段:只读代码段;
- RW段:RW区域放的是已赋值(赋0除外)的全局变量;
- ZI段:ZI区域放的是未赋值的全局变量或初始化为0的全局变量。
ARM裸板开发流程:
ARM系统上电后,首先就运行系统初始化程序,系统初始化程序主要完成系统最基本的硬件初始化,为后面的C语言应用程序提供运行环境。ARM系统初始化启动代码完成的主要功能如下:
- 初始化ARM CPU异常处理向量表;
- 禁止看门狗;
- 禁止中断;
- 初始化系统时钟,包括CPU主频FCLK、系统总线时钟频率HCLK、外设总线时钟频率PCLK;
- 初始化SDRAM控制器;
- 设置ARM CPU在各种模式下的栈指针(栈顶);
- 设置ARM中断向量表,安装中断处理程序;
- 搬运可执行映像文件的RW段到RAM中,并初始化ZI段为0;
- 跳转到C语言应用程序的Main函数,开始执行C语言应用程序。
到此,系统的初始化启动程序就完成了ARM系统的启动过程。
ARM系统的初始化启动代码一般用汇编语言编写,根据以上的分析,我们知道ARM系统初始化启动程序的流程如下图所示:

MOV PC,LR 指令解析
- SP(R13寄存器)
- LR(R14寄存器)
- pc(R15寄存器)
MOV PC,LR
LR寄存器保存了子程序的返回地址
而PC保存的是当前的地址,将LR的值给PC,即从子程序返回
LR寄存器在使用完跳转指令BL后会保存LR子程序的地址
如下例程:
.text
.global _start
_start:
//设置栈
ldr sp,=0x80200000
bl clean_bss //清除bss段
bl main
halt:
b halt
//清除BSS段
clean_bss:
ldr r1, =__bss_start
ldr r2, =__bss_end
mov r3, #0
clean:
str r3, [r1] //r1寄存器中的值所指向的地址处清零
add r1, r1, #4 //r1寄存器加4
cmp r1, r2 //r1的值减去r2的值,并改变相应的标志寄存器的值
bne clean //零标志位不等于零时跳转到标号clean处执行
mov pc, lr //子程序返回
mov pc, lr 起到的作用是在清除完bss段后回到bl clean处继续往下执行下一个指令(bl main)
LR寄存器一般来说有两个作用:
1、当使用bl或者blx跳转到子过程的时候,r14保存了返回地址,可以在调用过程结尾恢复。
2、异常中断发生时,这个异常模式特定的物理R14被设置成该异常模式将要返回的地址。
子程序返回的三种方法:
1.MOV PC,LR
2.BL LR
3.在子程序入口处使用以下指令将R14存入堆栈
STMFD SP!, {<Regs>,LR}
对应的,使用以下指令可以完成子程序的返回
LDMFD SP! , {<Regs>,LR}
GPIO普遍适用的操作方法
GPIO:general-purpose input/output,通用输入输出口
GPIO的一般结构:
有多组的GPIO,每组有多个GPIO口
- 使能:电源/时钟
- 模式(Mode):引脚可用于GPIO或其他功能
- 方向:引脚Mode设置为GPIO时,可以继续设置它是输出引脚还是输入引脚
- 数值:对于输出引脚,可以设置寄存器让它输出高、低电平
对于输入引脚们可以读取寄存器得到引脚的当前电平
对GPIO寄存器的操作
在芯片手册中找到介绍power/clock的相关章节,根据所述内容设置对应寄存器某个GPIO模块(Module)有些芯片的GPIO没有使能开关,是默认使能的,有的话则需要设置
具体到一个引脚,可以用于GPIO、串口、USB或其他的功能,有对应的寄存器来选择到底使用哪一个功能(芯片手册)
对于已经设置为GPIO功能的引脚,有方向寄存器用来设置它的方向:输出、输入
对于已经设置为GPIO功能的引脚,有数据寄存器用来读、写引脚电平状态
GPIO寄存器的2种操作方法
在平时开发时原则上是不能影响到其他的位
直接读写:读出、修改对应位、写入
模板:
设置bit n:
val = data_reg;
val = val | (1<<n);
data_reg = val;
要清除bit n:
val = data_reg;
val = val & ~(1<<n);
data_reg = val;
set-and-clear protocol:
set_reg , clr_reg , data_reg 三个寄存器对应的是同一个物理寄存器
要设置bit n:set_reg = (1<<n);
要清除bit n:clr_reg = (1<<n);
GPIO的其他功能:防抖动、中断、唤醒(后续补充)
对于IMX6ULL芯片的GPIO口
1、设置引脚功能(Mode、功能)
见IMX6ULL芯片手册——Chapter 32:IOMUX Controller (IOMUX)
一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(知识点补充)的更多相关文章
- 讯为iTop4412嵌入式开发板学习之-------前言
一.linux 工作的分类以及培养时间 Linux 作为一个庞大的体系,有很多相关的研究领域,总结起来大致有五个方向: 1.服务器维护:需要了解 Linux 服务,熟练使用 Shell,了解网络配置. ...
- 【4412嵌入式开发板学习笔记】认识uboot
转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...
- 嵌入式开发板iTOP4412学习开发板
网站:http://www.topeetboard.com 淘宝:https://item.taobao.com/item.htm?_u=okcahs0f42a&id=38712193806 ...
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...
- 【arm学习】我的第一个裸板程序
初学ARM感觉写个裸板程序还真的不容易,可能是没有用到ADS,keil之类的开发平台的缘故吧.编译,链接过程在linux平台上完成,这样学起来更有实感,还能顺便熟悉linux环境,以及命令,何乐而不为 ...
- 学习嵌入式开发板的Android平台体系结构和源码结构
本文转自迅为论坛资料:http://www.topeetboard.com 推荐学习嵌入式开发板平台:iTOP-4412开发板 下面这张图出自Google官方,展示了Android系统的主要组成部分. ...
- 嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结
1.在uboot中我可以添加自己的命令,添加的方法是找到一个uboot的命令,然后模仿着去增加属于自己的命令代码以及实现函数就可以 2.记住在使用printf进行调试的时候,在遇到指针或者字符串的时候 ...
- S5PV210裸板驱动:启动
以往2440和6410的启动方式,只要我们把裸板代码烧写到NAND FLASH的开始位置,当开发板上点启动时,处理器会自动从NAND FLASH上拷贝前面一段的代码到内部的RAM中执行.按照以前的方法 ...
- 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式
1.linux系统中的中断处理 1.0裸板中中断异常是如何处理的? 以s5p6818+按键为例 1)按键中断的触发 中断源级配置 管脚功 ...
- 【嵌入式开发板】8月终极暑促迅为Cortex-a9四核入门开发板
核心板参数 尺寸 50mm*60mm 高度 连同连接器在内0.26cm CPU Exynos4412,四核Cortex-A9,主频为1.4GHz-1.6GHz 内存 1GB 双通道 DDR3(2GB ...
随机推荐
- Windows性能监控工具Perfmon的使用、性能指标分析
Fighting_001 关注 0.1 2018.08.25 22:18* 字数 1488 阅读 7604评论 0喜欢 4 目录结构 一.Perfmon简介.性能监控指标.性能对象指标 1.常用的性 ...
- 支付对接常用的加密方式介绍以及java代码实现
京东科技 姚永健 一.术语表: 1.对称算法 加密解密密钥是相同的.这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥.对称算法的安全性依赖于密钥,泄漏密钥就意味着 ...
- 学习Java Day18
一.面向对象(面向过程) 1. 面向对象 找对象(封装了过程)来干. 例如:洗衣服(洗衣机就是对象). 2. 面向对象思想特点 是一种更符合我们思想习惯的思想. 可以将复杂的事情简单化. 将我们从执行 ...
- 储存环束流3D参数测量系统程序1.0版使用说明
经过几个月的改进,4通道同时采是从3月份开始的,主要通过这两个月的在线测试和不断改进,现在程序弄得还算好用了,可以拿出来分享了. 我这点小伎俩拿出来可千万别觉得我在卖弄,主要是觉得可以为兄弟单位愿意搞 ...
- 【CTO变形记】整体系统思维-从现象到本质
前言:我们的⼤脑⾥的认知不是⼀块⽩板,⽽是写满着密密麻麻对这个世界形成的各种观念.信念.塞满了对事物的各个表象,我们脑中的表象世界,对应着外部世界的各种事物. 如果感觉本篇看起来有点不适应,可以看看之 ...
- 看完这一篇,ShardingSphere-jdbc 实战再也不怕了
谈到分库分表中间件时,我们自然而然的会想到 ShardingSphere-JDBC . 这篇文章,我们聊聊 ShardingSphere-JDBC 相关知识点,并实战演示一番. 1 ShardingS ...
- Git多分支 远程仓库 协同开发以及解决冲突
目录 一.Git多分支及远程仓库 1.Git多分支 2.正常密码链接远程仓库 3.ssh公钥私钥方式链接远程仓库 三.协同开发及解决冲突 1.协同开发 2.解决冲突 四.线上分支合并及远程仓库回滚 1 ...
- Socket:由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作
https://blog.csdn.net/weixin_45932157/article/details/113999801 最近服务器的Socket代理软件经常报这个错误:log:Error On ...
- cascader卡顿
<el-cascader :options="categoryTree" :props="props" collapse-tags v-model=&qu ...
- Google Earth Engine——基于新的Landsat SR数据集去云处理
根据GEE官方公告,明年原来的Landsat/LT05/C01/T1_SR和Landsat/LC08/C01/T1_SR数据集将停止更新,并提供了新的地表反射率数据,就是LANDSAT/LT05/C0 ...