BSS段主要用来存放未初始化的全局变量
首先先查看我们的链接器脚本文件,也就是gboot.lds
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS {
. = 0x30008000;
. = ALIGN(4);
.text :
{
start.o (.text)
*(.text)
}
. = ALIGN(4);
.data :
{
*(.data)
}
. = ALIGN(4);
bss_start = .;
.bss :
{
*(.bss)
}
bss_end = .;
}
可以看到上面bss段的开始地址bss_start和结束地址bss_end,
bss主要是存放未初始化的全局变量,因为是没有初始化,因此值可能是随机值,如果被应用程序调用,可能会有影响,因此初始化bss,也就是将bss段的内容全部赋值为0
代码如下:
clean_bss:
ldr r0,=bss_start
ldr r1,=bss_end
mov r3,#0
cmp r0,r1
moveq pc,lr
clean_loop:
str r2,[r0],#4
cmp r0,r1
bne clean_loop
mov pc,lr
关键字:TQ2440 国嵌学院 gboot bss段初始化
引用地址:
TQ2440国嵌学院gboot-bss段初始化
推荐阅读最新更新时间:2024-03-16 14:34
TQ2440 学习笔记—— 13、GPIO 接口【实验:用汇编语言实现】
GPIO 操作实例:LED 和 按键 1、使用汇编代码点亮一个LED 操作步骤 a、编写源程序(程序) b、生成可执行程序(Makefile) c、烧写程序(USB 下载线烧写) d、运行程序 a、编写源程序 虽然是汇编代码,但是程序很简单,就不解释啦! b、Makefile make 指令比较 第 1 行中文件led_on.bin 和文件 led_on.S 的时间,如果 led_on.S 的时间 比 led_on.bin 的时间新(led_on.bin 未生成时,此条件默认成立),则执行第2,3,4行的命令重新生成led_on.bin 。也可以不用指令make,而直接一条一条的执行2,3,
[单片机]
tq2440JLink烧写裸机程序的问题
首先回顾一下编写裸机程序的步骤: 1 .使用ADS1.2创建工程,在DebugRel setting中的Language setting中要选中ARM920T,因为用的是S3C2440的CPU。ARM Linker中的起始地址是0x30000000,首先执行的文件为2440init.o,入口函数式init。 2 .添加所需要的文件到工程中,编写Main.c文件。当然入门的话只需要写这个文件就可以了。 3 .编译文件 4 .打开JLink,连接到开发板 5 .打开调试器AXD,下载编译好的axf文件到开发板上(文件在工程内的DebugRel文件夹下) 6 .运行。。。 但是在最后运行的时候却运行不起来,调
[单片机]
TQ2440 学习笔记—— 16、volatile关键字
大多数计算机拥有一系列寄存器,其存取速度比计算机主存更快。好的编译程序能进行一种被称为“冗余装入和存储的删去” (redundant load and store removal)的优化,即编译程序会在程序中寻找并删去这样两类代码:一类是可以删去的从内存装入数据的指令,因为相应的数据已经被存放在寄存器中;另 一种是可以删去的将数据存入内存的指令,因为相应的数据在再次被改变之前可以一直保留在寄存器中。 volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如: static int i=0; int main(void) { ... while (1) {
[单片机]
基于TQ2440的u-boot-1.1.6移植(基本步骤)
参考资料: 《移植u-boot-1.1.6到TQ2440文档》 天嵌移植好的源码 移植环境 系统:华清远见虚拟机搭建的Ubuntu12.04 开发板:TQ2440 交叉编译器:crosstools_3.4.5_softfloat CPU:S3C2440 SDRAM:64M NOR Flash:2M NAND Flsah:256M NET:DM9000 移植过程 1、源代码下载 ftp://ftp.denx.de/pub/u-boot/ 下载u-boot-1.1.6.tar.bz2并解压到Ubuntu中 2、文件删减 board/下除 smdk2410 以外的所有其它目标板文件夹删除 cpu/下除 arm920t 以外的
[单片机]