[国嵌攻略][043][栈初始化]

栈概念

栈是一种具有后进先出性质的数据组织方式。栈底是第一个进栈的数据所处的位置,栈顶是最后一个进栈的数据所处的位置

满栈和空栈

根据sp指针指向的位置,栈可以分为满栈和空栈:

1.满栈,当堆栈指针sp总是指向最后一个压入堆栈的数据

2.空栈,当堆栈指针sp总是指向下一个将要放入数据的空位置

3.ARM采用满栈

升栈和降栈

根据sp指针移动的方向,栈可以分为升栈和降栈:

1.升栈,随着数据的入栈,sp指针从低地址到高地址移动

2.降栈,随着数据的入栈,sp指针从高地址到低地址移动

3.ARM采用降栈

栈帧

1.一个进程会用到一个栈,进程中每个函数会分割栈的一个部分

2.栈帧就是一个进程中的函数所使用的那部分栈,进程中所有函数的栈帧串起来组成了一个完整的栈

3.栈的边界分别由上边界fp(r11)和下边界sp(r13)来限定。调用函数的栈帧保存在被调用的函数的栈帧中

栈的作用

1.保存调用该函数的函数寄存器值

2.传递函数的参数。当函数参数个数小于等于4时用r0到r4寄存器传递参数;当函数参数个数大于4个时,其他参数用栈来保存

3.保存函数的局部变量

C程序工作流程

1.首先,进入函数时,建立函数的栈帧。如果传入参数超过4个,则超过部分保存在栈中

2.然后,保存被调用函数的函数寄存器值,用来返回时恢复调用函数的寄存器环境

3.接着,执行函数功能。如果用到局部变量,在栈中存储局部变量

4.最后,退出函数时,恢复调用函数的寄存器环境

代码编写

堆栈的初始化就是指定sp指针的位置,sp指针位置的指定根据内存的最大地址来指定。当堆栈使用时,该位置就会从最大位置递减。例如2440的sp指针位置为0x30000000+400000(64M)=0x34000000

/********************************************************************
*外设预处理
********************************************************************/
/*
*名称:init_stack
*功能:初始化堆栈
*/
init_stack:
	ldr sp, =STACK_INIT_ADDR
	mov pc, lr
时间: 2024-10-16 19:30:51

[国嵌攻略][043][栈初始化]的相关文章

[国嵌攻略][044][初始化Bss段]

BSS段的作用 1.变量存储的空间 初始化的全局变量:数据段 未初始化的全局变量:BSS段 局部变量:栈 动态分配变量:堆 2.为什么要对BSS段初始化 未初始化的全局变量在使用时才被赋值,未了避免在使用时忘记赋值,导致使用随机值.由系统工程师在系统启动时,把BBS清零. 初始化BSS段 找到BSS段起始地址和结束地址向其中填零,BSS段地址记录在链接器脚本中 /* *名称:init_bss *功能:初始化BSS段 */ init_bss: ldr r1, =bss_start ldr r2,

[国嵌攻略][050][2440按键中断编程]

程序结构优化 1.把不同的功能放到不同的文件里面 2.一般在bootloader中不使用MMU,所以关掉MMU 按键初始化 1.打开开发板的原理图,找到按键 2.把对应的GPIO配置成中断,对中断源进行初始化 初始化中断控制器 1.SUBMASK和MASK必须要保证没有屏蔽中断,GPIO是不属于子中断,所以不用设置SUBMASK,MODE和Priority保存默认值即可,设置INTMSK(0x4A000008) 2.EINT4_7对应4个中断,分开设置需要设置EINTMASK(0x560000A

[国嵌攻略][087][多线程程序设计]

线程概念 1.线程就是轻量级的进程. 2.线程与创建它的进程共享代码段和数据段. 3.线程拥有自己独立的栈. 线程特点 线程可以和进程做相同或不同的工作,但是与进程共享资源. 线程互斥 在实际应用中,多个线程往往会访问同一个数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁(mutex)互斥机制就是其中一种. thread.c #include <pthread.h> #include <stdio.h> #include <unistd.h> pthr

[国嵌攻略][164][USB驱动程序设计]

USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.USB client driver:为USB外部设备提供驱动程序 USB设备模型 device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次.一个usb driver(驱动)对应的是一个interface(接口).一个接口

[国嵌攻略][061][2440LCD驱动设计]

LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数 VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算 HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数 HFPD(horizon

[国嵌攻略][136][DM9000网卡驱动深度分析]

网卡初始化 1.分配描述结构,alloc_etherdev 2.获取平台资源,platform_get_resource 2.1.在s3c_dm9k_resource中有相关的资源 2.2.add地址由CS4和ADD2决定,是20000000 2.3.dat地址由CS4和ADD2决定,是20000004 2.4.中断资源是EINT7 3.虚拟地址映射,ioremap 4.读取芯片类型 5.设置操作函数集 6.读取MAC地址 7.注册网卡驱动,register_netdev 8.启动发送队列,ne

[国嵌攻略][122][按键定制器去抖]

按键抖动 按键所用的开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,开关不会马上稳定地接通或断开.因而在闭合及断开的瞬间总伴随有一连串的抖动. 按键去抖动的方法主要有两种,一种是硬件电路去抖:另一种就是软件延时去抖.而延时去抖一般又分为两种,一种是for循环等待,另一种是定时器延时.在操作系统中,由于效率方面的原因,一般不允许使用for循环来等待,只能使用定时器. 内核定时器 Linux内核使用struct timer_list来描述一个定时器: struct timer_l

[国嵌攻略][070-095][Linux编程函数手册]

第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 <time.h> 1.1.5 返回值 成功:日历时间失败:-1 1.1.6 参数说明 t:不为空的情况下保存返回值   1.2 获取格林威治时间 1.2.1 函数名 gmtime 1.2.2 函数原形 struct tm *gmtime(const time_t *timep) 1.2.3 函数功

[国嵌攻略][049][中断处理流程深度剖析]

中断的生命周期 1.串口控制器产生事件,送到中断控制器,如果通过中断控制器的过滤,由中断控制器把事件送到CPU核 2.中断信号产生(中断源)->中断信号过滤(中断控制器)->中断信号处理(CPU) 中断源在中断的生命周期中,中断源的作用是负责产生中断信号.2440支持60个中断源:6410支持64个中断源:210支持93个中断源 中断过滤 1.中断信号送到中断控制器来了之后,中断控制器要进行过滤 2.串口子中断TX0的过滤过程: 2.1.首先,当TX0产生中断后SUBSRCPND中相应的位会被