控制寄存器

栈帧ebp,esp详解

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-29 21:20:12
栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置 入栈操作:push eax; 等价于 esp=esp-4,eax->[esp];如下图 出栈操作:pop eax; 等价于 [esp]->eax,esp=esp+4;如下图 我们来看下面这个C程序在执行过程中,栈的变化情况 void func(int m, int n) { int a, b; a = m; b = n; } main() { ... func(m, n); L: 下一条语句 ... } 在main调用func函数前,栈的情况,也就是说main的栈帧: 从低地址esp到高地址ebp的这块区域,就是当前main函数的栈帧。当main中调用func时,写成汇编大致是: push m push n; 两个参数压入栈 call func; 调用func,将返回地址填入栈,并跳转到func 当跳转到了func,来看看func的汇编大致的样子: __func: push ebp; 这个很重要,因为现在到了一个新的函数,也就是说要有自己的栈帧了,那么

第二季-专题6-点亮指路灯

独自空忆成欢 提交于 2019-11-29 04:14:19
专题6-点亮指路灯 1. LED原理图分析 在嵌入式系统软件(bootloader, kernel)开发初期,由于串口等硬件尚未被初始化,因此调试手段相当有限,这时通常会采用LED来作为程序调试的重要手段。 左边的图是低电平导通,右边的图是高电平导通。 LED的引脚究竟接在哪里是依靠核心板的电路图来识别的,依靠核心板的GPIO到底是接在哪里来判断的。 2. GPIO GPIO(General-Purpose Input/Output Ports)通用输入/输出端口。在嵌入式系统中, CPU经常需要控制许多结构简单的外部设备或者电路,这些设备通常只要求两种状态(开/关), 对这些设备的控制,使用传统的串口或者USB口就显得复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O端口”,也就是GPIO。 一个GPIO端口至少需要两个寄存器,一个是“控制寄存器”,用于选择该端口作为输入还是输出。另一个是存放数据的”数据寄存器”。 s3c2440有130个IO引脚,分成了A-J一共9个组;6410有187个IO引脚,被分成了A-Q一共17个组 3. 设计流程 (1)设置GPIO控制寄存器,把引脚设置为输出功能 (2)根据原理图设置GPIO数据寄存器,点亮LED 4. 写代码 TQ2440: 在TQ210的电路原理图上,可以观测到它的LED启动方式的低电平启动,对应的名称为nLED_1

米联客 ZYNQ/SOC精品教程 S02-CH08 定时器中断实验

纵然是瞬间 提交于 2019-11-28 21:49:31
软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛: www.osrc.cn 答疑解惑专栏开通,欢迎大家给我提问!! 8.1 概述 本课将中断对于实时系统是非常重要。本课简要介绍了ZYNQ的中断原理和中断类型,详细介绍了私有定时器,在ZYNQ的纯PS里实现私有定时器中断。每隔一秒钟中断一次,在中断函数里计数加1,通过串口打印输出。 8.2 中断原理 中断对于保证任务的实时性非常必要,ZYNQ中集成了中断控制器GIC(Generic Interrupt Controller).GIC可以接受I/O外设中断IOP和PL中断,将这些中断发给CPU。 中断体系结构框图图下: 8.2.1 软件中断(SGI) SGI通过写ICDSGIR寄存器产生SGI. 8.2.2 共享中断SPI 通过PS和PL内各种I/O和存储器控制器产生。 8.2.3 私有中断(PPI) 包含:全局定时器,私有看门狗定时器,私有定时器以及来自PL的FIQ/IRQ。本文主要介绍PPI,其它的请参考官方手册ug585_Zynq_7000_TRM.pdf。 ZYNQ每个CPU连接5个私有外设中断,所有中断的触发类型固定不变。并且来自PL的快速中断信号FIQ和中断信号IRQ反向。尽管在ICDICFR1寄存器内反应它们是低电平触发,但是PS

STM32F4 阿波罗寄存器点亮LED灯

假如想象 提交于 2019-11-28 07:38:00
学习步骤: 使用寄存器点亮LED灯,需要进行如下的步骤, LED 灯属于外设部分,首先需要开启外设的时钟使能,然后 LED 灯是 PB1 口,(芯片是正点原子的阿波罗),接着定义 GPIOB 口的输出模式,为上拉、推挽、 100M ,最后定义 B 口的 1 引脚为低电平就可以实现点亮了。 这一部分内容耗时有点长,最后发现关键原因在于调试的时候未按复位键,这个原因我也是很无语啊,怪不得在之前下载完程序,第二天早上去开电源的时候,一个灯亮了,原来程序写的是对的呀~~~ 错误与总结: 错误就是按键问题,下载完程序我一看灯没亮,于是就继续修改程序,修改了好几个版本了,可能之前的也是对的吧。此外,过程之中也对代码做了很多修改与检查,由于寄存器的地址需要自己查找,所有有时候会写错,不过我应该是看了好多遍,现在印象很深刻了呢。首先确保时钟使能开启的是AHB1,然后对GPIOB口进行定义,初始地址与偏移地址一定要加对哦。 中间有很多C语言代码的位操作,现在补充一下: 置位 |= 清零 =&= ~ a>>b 指的是a这个数向右移b位 a<<b 指的是a这个数向左移b位 需要修改下魔术棒之中target的晶振 mini板为8 ,阿波罗为12 代码: #include "stm32f429xx.h" int main(void) { //使能时钟AHB1 *(unsigned int *

韦东山嵌入式Linux学习笔记05--存储管理器

只愿长相守 提交于 2019-11-28 01:47:34
SDRAM:    原理图如下: jz2440 v3开发板上面用的内存芯片为钰创科技公司生产的EM63A165TS,一片内存大小为32MB大小,一共有两块,共64MB的大小. SDRAM接的是BANK 6,所以他的起始地址是 0x30000000. SDRAM的基本寻址关系 SDRAM的存储结构逻辑如上图, SDRAM内部是一个存储阵列,阵列就如同表格一样,将数据"填进去".和表格的检索原理一样,先指定一个行,再指定一个列,两点确定一个坐标,就可以准确地找到所需要的 单元格,这就是SDRAM寻址的基本原理.这个单元被称为存储单元,这个表格(存储阵列)就是逻辑Bank(就是L-Bank).SDRAM一般含有四个L-Bank. 对SDRAM的访问可以分为如下几个步骤:   1.CPU发出的片选信号nSCS0有效,它选中SDRAM芯片.   2.SDRAM有四个L-Bank,需要两根地址线来选中其中的一个,根据开发板的设计, 选用了ADDR24和ADDR25作为L-Bank的选择信号.   3.对被选中的芯片进行统一的行/列(存储单元)寻址.     根据SDRAM芯片的列地址线数目设置CPU的相关寄存器后,CPU就会从32位的自动分出L-Bank选择信号, 行地址信号,列地址信号,然后发出行地址信号,列地址信号. L-Bank选择信号在发出行地址信号的同时发出,并维持到列地址信号结束.

闪存寄存器

风格不统一 提交于 2019-11-27 12:52:25
附:stm32闪存编程手册链接https://wenku.baidu.com/view/586bac0c763231126edb11ac.html 1.闪存访问控制寄存(FLASH_ACR) 地址偏移:0x00 复位值:0x0000 0030 各位描述: 2.FPEC键寄存器(FLASH_KEYR) 地址偏移:0x04 复位值:xxxx xxxx 3.闪存OPTKEY寄存器(FLASH_OPTKEYR) 地址偏移:0x08 复位值:xxxx xxxx 4.闪存状态寄存器(FLASH_SR) 地址偏移:0x0C 复位值:0x000 0000 5.闪存控制寄存器(FLASH_CR) 地址偏移:0x10 复位值:0x0000 0080 6.闪存地址寄存器(FLASH_AR) 地址偏移:0x14 复位值:0x0000 0000 7.选项字节寄存器(FLASH_OBR) 地址偏移:0x1C 复位值:0x03FF FFFC 注意: 这个寄存器的复位数值与写入选项字节中的数值相关,OPTERR位的复位值与加载选项字节时对选项字节和它的反码进行比较的结果相关。 8.写保护寄存器(FLASH_WRPR) 地址偏移:0x20 复位值:0xFFFF FFFF 来源: https://blog.csdn.net/yigedaluobo/article/details/99676123

反射内存卡编程

一个人想着一个人 提交于 2019-11-27 08:08:49
反射内存卡编程 基本 RFM5565 反射内存写入和读取操作需要很少或根本不需要编程知识。反射内存板上电后进入功能模式。用户将需要访问 PCI配置寄存器(基址寄存器 0,1,2 和 3)获取系统 BIOS 分配寄存器组和反射内存的基址。反射内存的寄存器组的基址和内存地址可以比较随意,。对于超出了基本的设置,如启用或禁用中断或 DMA 周期的操作,用户必须知道三个寄存器组内具体寄存器分配,本章提供的这些信息。 这三个寄存器组如下: PCI 配置寄存器 本地配置寄存器 反射内存控制和状态寄存器 PCI 配置寄存器 PCI 配置寄存器位于 256 字节的 PCI 配置空间,它遵循 PCI 规范V2.2 定义的模板。第一个 64 字节的 PCI 配置空间完全由预定的标头组成的。在该区域中,每个设备只实现必要和相关的寄存器。然而,所有的寄存器和位功能存在必须符合 PCI 规范的定义。除了第一个64 字节边界,每个设备都可以实现额外的设备独特的寄存器。虽然 PCI 配置寄存器可在任何时候访问,但一般他们都很少被用户修改。 表 3-1 PCI 配置寄存器 来源: https://blog.csdn.net/weixin_43549463/article/details/99586126

单口RAM、双口RAM、FIFO

偶尔善良 提交于 2019-11-26 20:02:32
单口与双口的区别在于,单口只有一组数据线与地址线,因此读写不能同时进行。而双口有两组数据线与地址线,读写可同时进行。FIFO读写可同时进行,可以看作是双口。 双口RAM分伪双口RAM(Xilinx称为Simple two-dual RAM)与双口RAM(Xilinx称为true two-dual RAM)。伪双口RAM,一个端口只读,另一个端口只写;而双口RAM两个端口都可以读写。 FIFO也是一个端口只读,另一个端口只写。FIFO与伪双口RAM的区别在于,FIFO为先入先出,没有地址线,不能对存储单元寻址;而伪双口RAM两个端口都有地址线,可以对存储单元寻址。 异步时钟域的缓存只要是双口器件都可以完成。但FIFO不需对地址进行控制,是最方便的。 摘录: 根据我的设计经验,其实FIFO的核心还是一片RAM。只不过把RAM的操作封装了一下,添加了两个指针,也就是两个地址寄存器,一个写地址寄存器,一个读地址寄存器。 当FIFO初始化时,读地址寄存器和写地址寄存器皆为零; 当FIFO写一个数据时,把数据写入当前地址寄存器指向的RAM地址,然后写地址寄存器加1;如果加到RAM的底部了,就再次变为零; 当FIFO读数据时,把读地址寄存器的数据读出来,然后读地址寄存器加1;如果读到RAM的底部了,就再次变为零; 如果读地址寄存器追上写地址寄存器,就说明读空了,没数据可读了;