Freescale 16位单片机的地址映射

发布者:rnm888最新更新时间:2015-08-11 来源: dzsc关键字:Freescale  16位单片机  地址映射 手机看文章 扫描二维码
随时随地手机看文章
前言:
原来一直不太明白单片机的地址映射,也没有仔细的研究过,我想这就是我不是牛人的原因吧。通常开始学单片机,都是写一些比较小的程序,如果不做项目开发之类的,以飞思卡尔16位单片机的资源配置来说也足够了。但是前一阵子遇到了一个问题,需要在RAM中存一个比较大的常数数组,但是单单存在RAM中的话,肯定是存不下,考虑到数组是常数,所以只能存在ROM里,但是当时时间较短,没有研究明白,还得到了非常惨痛的教训,觉得不甘心,打算再花时间研究了一下。在以后的文章中我会把我的研究心得记录下来,希望大家提出意见。

飞思卡尔16位单片机的资源配置
以MC9S12XS128MAL为例,其实DG128之类的类似。如图一,128代表的是单片机中的FLASH大小为128K Byte,同理64代表的是单片机中的FLASH大小为64 K Byte,256代表的是单片机中的FLASH大小为256 K Byte。但是S12(X)所使用的内核CPU12(X)的地址总线为16位,寻址范围最大为2^16 =64K Byte,而这64K Byte的寻址空间还包括寄存器、EEPROM(利用Data Flash模拟)、RAM等,因此不是所有的64K Byte都是用来寻址FLASH。所以在S12(X)系列单片机中,很多资源是以分页的形式出现的,其中包括EEPROM、RAM、FLASH。EEPROM的每页大小为1K Byte,RAM的每页大小为4K Byte,FLASH的每页大小为16K Byte。因此XS128中EEPROM的页数为8K/1K = 8页,RAM的页数为8K/4K = 2页,Flash的页数为128K/16K = 8页。
[转载][转载]Freescale <wbr>16位单片机的地址映射
图一
[转载][转载]Freescale <wbr>16位单片机的地址映射
图二
在单片普通模式中,复位后,所有内存资源的映射如图二所示,其中从0x0000-0x07FF的2K范围内映射为寄存器区,如I/O端口寄存器等,当然寄存器没有那么多,后面的一部分其实没有使用;
从0x0800-0x0BFF,共1K的空间,映射为EEPROM区,由上面的分析,XS128中共有8页的共8K的EEPROM,所以这8页的EEPROM都是以分页的形式出现的,可以通过设置寄存器EPAGE选择不同的页并进行访问;
从0x0C00到0x0FFF的1K空间为保留区(其实这里面也有学问,以后探讨);
从0x1000到0x3FFF的12K空间为RAM区,分为三页,但是和前面所说的EEPROM不同,这三页中有2页(对于XS128和XS256)或一页(对于XS64)为固定页,位于12K空间的后一部分,以XS128为例,其内部的RAM资源为8K,所以其三页中的最后两页(0x2000-0x3FFF)为固定页,第一页(0x1000-0x1FFF)为窗口区,通过设置寄存器RPAGE来映射其他分页的RAM,当然在单片普通模式下,XS128内部已经没有其他的RAM了,所以这一页其实也没有用。但是对于XS256,这一页是有用的,因为它总共有12K的RAM。但是,在单片普通模式下,即没有外扩RAM的情况下,用户是不用刻意的去配置RPAGE的,因为复位的时候,已经默认指向那一页的RAM。
从0x4000-0xFFFF的总共48K的空间为Flash区,分为三页。其中第一页和第三页为固定的Flash页,中间的一页(0x8000-0xBFFF)为窗口区,通过设置PPAGE寄存器,可以映射到其他的分页Flash。
在最后的一页固定的Flash区域中的最后256字节中,保存的是中断向量。

对于RAM和Flash来说,其实固定页和其他的分页资源是统一编址的,不同的是固定页不可以通过寄存器(RPAGE、PPAGE)改变映射,而其他的页必须通过寄存器的设置来选择映射不同的页。

codewarrior中的prm文件
网上广泛流传的一篇文章讲述的是8位飞思卡尔单片机的内存映射,这几天,研究了一下Codewarrior 5.0 prm文件,基于16位单片机MC9S12XS128,一点心得,和大家分享。有什么错误请指正。
正文:
关于Codewarrior 中的 .prm 文件

要讨论单片机的地址映射,就必须要接触.prm文件,本篇的讨论基于 Codewarrior 5.0 编译器,单片机采用MC9S12XS128。
通过项目模板建立的新项目中都有一个名字为“project.prm”的文件,位于Project Settings->Linker Files文件夹下。一个标准的基于XS128的.prm文件起始内容如下:

.prm文件范例:




NAMES
END

SEGMENTS





RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;


ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;

//OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF;


EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;
EEPROM_01 = READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF;
EEPROM_02 = READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF;
EEPROM_03 = READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF;
EEPROM_04 = READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF;
EEPROM_05 = READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF;
EEPROM_06 = READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF;
EEPROM_07 = READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF;





PAGE_F8 = READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;
PAGE_F9 = READ_ONLY DATA_FAR IBCC_FAR 0xF98000 TO 0xF9BFFF;
PAGE_FA = READ_ONLY DATA_FAR IBCC_FAR 0xFA8000 TO 0xFABFFF;
PAGE_FB = READ_ONLY DATA_FAR IBCC_FAR 0xFB8000 TO 0xFBBFFF;
PAGE_FC = READ_ONLY DATA_FAR IBCC_FAR 0xFC8000 TO 0xFCBFFF;

PAGE_FE = READ_ONLY DATA_FAR IBCC_FAR 0xFE8000 TO 0xFEBFFF;

END

PLACEMENT

_PRESTART,
STARTUP,
ROM_VAR,
STRINGS,
VIRTUAL_TABLE_SEGMENT,
//.ostext,
DEFAULT_ROM, NON_BANKED,
COPY
[page]
INTO ROM_C000 ;

OTHER_ROM INTO PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;

//.stackstart,
SSTACK,
//.stackend,
PAGED_RAM,

DEFAULT_RAM
INTO RAM;

DISTRIBUTE DISTRIBUTE_INTO
ROM_4000, PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;
CONST_DISTRIBUTE DISTRIBUTE_INTO
ROM_4000, PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;
DATA_DISTRIBUTE DISTRIBUTE_INTO
RAM;
//.vectors INTO OSVECTORS;
END

ENTRIES

//_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStart
END

STACKSIZE 0x100


VECTOR 0 _Startup
//VECTOR 0 Entry
//INIT Entry

1 .prm 文件组成结构
按所含的信息的不同.prm文件有六个组成部分构成,这里仅讨论和内存空间映射关系紧密的三个部分,其他的不做讨论。
· SEGMENTS … END
定义和划分芯片所有可用的内存资源,包括程序空间和数据空间。一般我们将程序空间定义成ROM,把数据空间定义成RAM,但这些名字都不是系统保留的关键词,可以由用户随意修改。用户也可以把内存空间按地址和属性随意分割成大小不同的块,每块可以自由命名。例如同样是RAM,可以使用不同的属性,使其有复位后变量清零和不清零之分。
关于内存划分的具体方法在后面详解。
· PLACEMENT … END
将指派源程序中所定义的各种段,如数据段DATA_SEG、CONST_SEG和代码段CODE_SEG 被具体放置到哪一个内存块中。它是将源程序中的定义描述和实际物理内存挂钩的桥梁。
· STACKSIZE
定义系统堆栈长度,其后给出的长度字节数可以根据实际应用需要进行修改。堆栈的实际定位取决于RAM内存的划分和使用情况。默认的情况下,堆栈放在RAM区域的起始部分。当然,堆栈的定义不只有这种方式,还可以使用STACKTOP关键字。后面将详细讨论。

2 内存划分的具体方式
由SEGMENTS开始到END为止,中间可以添加任意多行内存划分的定义,每一行用分号结尾。定义行的语法型式为:
[块名] = [属性1] [属性2] ,… ,[属性n] [起始地址] TO [结束地址];
其中,

· “块名”的定义和C语言变量定义相同,是以英文字母开头的一个字符串,用户可以自己任意定义块名。

· “属性”用户是不能自己定义的,因为属性名指定了上面所说的“块名”所对应的不同的内存类型和访问方式,而不同物理内存的类型和访问方式是一定的。
对于“属性1”,Codewarrior 5.0中可以有三种不同的类型,对于只读的Flash-ROM区属性一定是READ_ONLY,对于可读写的RAM区属性可以是READ_WRITE,也可以是NO_INIT。它们两者的关键区别是ANSI-C的初始化代码会把定位在READ_WRITE块中的所有全局和静态变量自动清零,而NO_INIT块中的变量将不会被自动清零。当然只是复位时不清零,掉电时还是清零的,但是对于单片机系统,变量在复位时不被自动清零这一特性有时是很关键的,在某些应用中有特殊的用途。
对于“属性2 … 属性n”,根据上面给出的.prm的范例文件可以看出来,可能的形式有“DATA_FAR”、“DATA_NEAR”、“IBCC_FAR”、“IBCC_NEAR”四种类型。其中,“DATA_FAR”和“DATA_NEAR”相对应,当内存区域包含变量或者是常量时(通常是RAM、Flash和EEPROM),必须指明上面两种属性中的一种,由于涉及到内存的分页,可以这样理解:“DATA_FAR”属性指定的内存块为可以保存数据的非固定页,而“DATA_NEAR”属性指定的内存块为可以保存数据的固定页;同理“IBCC_FAR”和“IBCC_NEAR”相对应,当内存区域包含代码时(Flash和EEPROM),必须指明上面两种属性中的一种,“IBCC_FAR”属性指定的内存块为可以保存代码的非固定页,而“IBCC_NEAR”属性指定的内存块为可以保存代码的固定页

讨论到这里,细心的读者已经发现,在上面的.prm文件范例中,RAM的属性有“DATA_FAR”和“DATA_NEAR”两种,Flash的属性中也是四种都有,但是EEPROM中却只有“DATA_FAR”和“IBCC_FAR”两种,这正好验证了上一篇文章(飞思卡尔16位单片机的资源配置)中所提到的,RAM、Flash中都有固定页,但是EEPROM中全部是非固定页。

· 起始地址和结束地址决定了一内存块的物理位置,对于固定页,用4位16进制数表示,而对于非固定页,则用6位16进制表示,多出来的两位其实是寄存器EPAGE、RPAGE或PPAGE的值,可见,对于分页的资源,是通过寄存器(EPAGE、RPAGE或PPAGE)和16位的地址总线的组合来进行寻址的。
“TO”是系统保留的关键字,必须大写。

下面,根据上面范例提供的内容,举几个例子:
例1 RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
上面这句话的意思是:分配0x2000-0x3FFF的区域的块名为“RAM”(当然可以定义别的名称),由上一篇文章而知,这一区域的物理内存的性质为RAM,属性应该为“READ_WRITE”,并且这一区域中的两页都为固定页,所以为“DATA_NEAR”。

例2 将8K字节RAM的后面4K字节定义成非自动清零的数据保留区,则应如下定义:
SEGMENTS
……
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x2FFF;
RAM_NO_INIT = NO_INIT DATA_NEAR 0x3000 TO 0x3FFF;
……
END
注意,各部分RAM的分配地址不应该存在重叠的部分,否则会发生错误。

例3 EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;
XS128单片机中的EEPROM由Data-Flash模拟,所以属性为READ_ONLY。EEPROM全部为非固定页,所以用“DATA_FAR”、“IBCC_FAR”。后面的起始地址和结束地址分别为6位的16进制数,前两位的“00”实质指的是EEPROM分页寄存器EPAGE的值为0x00。

用SEGMENTS只是从单片机的物理内存这一角度对其进行空间划分。源程序本身并不知道物理内存被分割和属性定义的这些细节。它们两者之间必须通过下面的PLACEMENT建立联系。

3 程序段和数据段的放置
PLACEMENT-END内所描述的信息是告诉连接器源程序中所定义的各类段应该被具体放置到哪一个内存块中去。其语法型式为:
[段名1], [段名2],... , [段名n] INTO [内存块名1],[内存块名2],… ,[内存块名n];

[段名1], [段名2],... , [段名n] DISTRIBUTE_INTO [内存块名1],[内存块名2],… ,[内存块名n];

其中

· 段名就是在源程序中用“#pragma”声明的数据段、常数段或代码段的名字。如果用缺省名“DEFAULT”,则默认的数据段名为DEFAULT_RAM,代码段和常数段名为DEFAULT_ROM。若程序中定义的段名没有在PLACEMENT中提及,则将被视同为DEFAULT。几个相同性质但不同名字的段可以被放置到同一个内存块中,相互之间用逗号分隔。

· INTO 是系统保留的关键词,在这里为“放入”的意思。

· DISTRIBUTE_INTO 也是系统的保留关键字。Codewarrior 具有内存自动优化的功能,但是在“Small memory”模式中,这种功能不会被启用,只有当16-bit的地址空间不能存放下所有的变量和代码时,才会启用这种功能。

在SEGMENTS-END区域中,当在内存模块的属性中加上“DATA_FAR”、“DATA_NEAR”、“IBCC_FAR”、“IBCC_NEAR”四种属性中的任何一种时,那么在PLACEMENT-END区域中,就需要指定段名“DISTRIBUTE”, “CONST_DISTRIBUTE”, “DATA_DISTRIBUTE”(系统默认的,非关键字,用户可以自行更改)所分配的内存空间,这就需要使用“DISTRIBUTE_INTO”关键字。

关于内存自动优化功能,可以参考freescale的官方技术手册“TN 262.pdf”。

· 内存块名就是前面介绍的用SEGMENTS划分好的不同的内存块名字。
利用这样直观的定位描述文本可以方便灵活的将数据或代码定位到芯片内存任意可能的位置,实现某些特殊目的的应用。

下面的例子,说明了各种段名、PLACEMENT 和SEGMENTS之间的对应关系。
例4 定义非自动清零的数据段

SEGMENTS
……
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x2FFF;
RAM_NO_INIT = NO_INIT DATA_NEAR 0x3000 TO 0x3FFF;
……
END

PLACEMENT
……
DATA_PERSISTENT INTO RAM_NO_INIT;
……
END

//源程序编写:
#pragma DATA_SEG DATA_PERSISTENT //定义复位时非自定清零数据段
byte sysState;
#pragma DATA_SEG DEFAULT

4 堆栈的设置
关于堆栈的设置,Codewarrior提供了两种方式:“STACKSIZE”命令方式和“STACKTOP”命令方式。这两种方式在同一个.prm文件中,不能同时存在。当用户只关心堆栈的大小而不关心堆栈的存放位置时,推荐使用STACKSIZE方式。
系统默认的方式为使用STACKSIZE方式。

STACKSIZE命令方式:
当使用STACKSIZE命令方式时,如果在PLACEMENT-END部分声明了“SSTACK INTO RAM”,这样的话,堆栈区就被放在RAM区域的起始部分,下面的例子说明了这种方式:

例5
SEGMENTS
……
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
……
END

PLACEMENT
……
SSTACK, PAGED_RAM, DEFAULT_RAM INTO RAM;
……
END
STACKSIZE 0x100

上面的例子将堆栈区域存放的地址为0x20FF-0x2000,初始的堆栈指针指向栈顶地址0x20FF。
相反,如果在PLACEMENT-END部分没有声明“SSTACK INTO RAM”,则堆栈被分配在RAM区域中已分配空间的后面。请参见例6。

例6
SEGMENTS
……
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
……
END

PLACEMENT
……
PAGED_RAM, DEFAULT_RAM INTO RAM;
……
END
STACKSIZE 0x100

在这个例子中,如果RAM区域中已经分配的变量占用了4个字节(从0x2000到0x2003),则堆栈放在这四个字节的后面,从0x2103到0x2004,初始的堆栈指针指向0x2103。

STACKYOP命令方式:
当使用STACKTOP命令方式时,如果在PLACEMENT-END部分声明了“SSTACK INTO RAM”,同样,堆栈区就被放在RAM区域的起始部分,初始的栈顶则由STACKTOP指定。若没有相应的声明,则初始的栈顶由STACKTOP指定,而堆栈的大小则根据处理器的不同由编译器自行设定,其大小足够装下处理器的PC寄存器的值。
关键字:Freescale  16位单片机  地址映射 引用地址:Freescale 16位单片机的地址映射

上一篇:分享牛人解释的volatile关键字
下一篇:以前的一些单片机DIY作品

推荐阅读最新更新时间:2024-03-16 14:28

飞思卡尔采用先进的汽车雷达技术帮助提升乘客安全
2015年7月21日,德国慕尼黑讯-飞思卡尔半导体(NYSE:FSL)和Continental基于长期合作,日前宣布计划将飞思卡尔的新一代77 GHz雷达技术集成在Continental的新一代短程和中程汽车雷达模块上。这一举措表明Continental综合高级驾驶员辅助系统(ADAS)雷达解决方案的新进展,有助于汽车制造商遵守安全法规并将ADAS安全优势应用到更多车辆。 飞思卡尔的新一代雷达芯片组,从一开始定义和开发就符合ISO 26262标准,集成了一个完整的雷达系统,全面覆盖整个车辆的各种应用,如紧急制动、盲点检测、车道保持辅助和行人检测。该系统为处理能力、通道数目、视野以及至关重要的安全性提供了可扩展性,使用多个雷达
[汽车电子]
基于飞思卡尔HCS08的汽车ECAS设计
0 引言 空气悬架主要有被动悬架和可控电子悬架。被动悬架一定程度上抑制和降低了车体和车 轮的动载和振动,保证了车辆行驶安全性和乘坐舒适型。但由于被动悬架的刚度和阻尼系数一般按经验选取,只在特定环境下是最优,而一旦载荷,路况,速度等因素发生变化,被动悬架不能随之而自动调节,更不能手动调节。为了克服这一缺陷,电子空气悬架系统(ECAS)由此产生。ECAS 是目前最先进的汽车悬架系统,它可以随着路况,载荷,速度等变化因子自动调节悬架刚度,车身高度,减少了空气消耗,且具有反应迅速,安装容易,操作简单等优点,因此可控电子悬架已经成为汽车电子领域研究的一个热门课题,其有着广阔的发展前景。 1 ECAS 的组成及原理 电控空气悬架系统由电
[单片机]
基于<font color='red'>飞思卡尔</font>HCS08的汽车ECAS设计
飞思卡尔微控制与MSCAN ----自学笔记
概述 飞思卡尔半导体是全球最大的半导体公司之一。 飞思卡尔是车用半导体微控制器(MCU)领域排名第一的供应商。 飞思卡尔在业内提供最高质量的Flash存储器。 飞思卡尔的微控制器按CPU字长分为8位、16位和32位。 飞思卡尔微控制器 飞思卡尔8位微控制器MC9S08DZ60 它在一个单芯片上提供了更多的存储器和组件。 S08DZ系列是S08D系列中的旗舰号,提供了飞思卡尔最低成本的内嵌CAN的微控制器,并且将内嵌CAN,内嵌EPROM和片上仿真/调试模式结合在一起,该单片集成了所有的功能,设计人员可以便捷地转向其设计流程。 MC9S08DZ60系列器件主要用于需要融合CAN网络和内嵌的EEPROM的应用中,它有助于帮助用
[单片机]
ARM地址映射机制
ARM体系结构中,系统上电或复位后,处理器将从地址0x0处取第一条指令,因此,上电的时候,地址0x0处必须是非易失性的ROM或FLASH。但是,为了加快中断响应速度,方便更改中断向量表,有时需要把中断向量表复制到RAM中去,然后把RAM重新映射到地址0x0处,这就用到了地址重映射机制。因为地址重映射是在程序执行过程中进行的,必须考虑程序执行流程的连续性。 引导加载程序: 一个嵌入式系统的软件通常可以分为3个部分:引导加载程序, 嵌入式操作系统, 用户应用程序. 引导加载程序是系统加电后运行的第一段软件代码. 简单地说, 就是在操作系统内核运行之前运行的一段小程序(在嵌入式系统中通常叫做Bootloader). 通过这段小程序, 可
[单片机]
ARM<font color='red'>地址</font>重<font color='red'>映射</font>机制
飞思卡尔推多核远程通信处理器旗舰产品 综合生态系统支持
领先开发工具和操作系统厂商宣布支持这款最先进的远程通信应用嵌入式处理器 德州奥斯汀--2007年8月29日 --五家业界领先的开发工具和实时操作系统(RTOS)厂商日前宣布支持飞思卡尔半导体推出的MPC5121e系统芯片处理器。这款多核MPC5121e处理器基于Power Architecture技术,是飞思卡尔最强大的、高度集成的设备,适合远程通信、以及需要复杂图像、多媒体和实时声音处理的工业和商业应用。 飞思卡尔为远程通信系统开发商提供广泛MPC5121e支持,包括CodeWarrior Development Studio mobileGT处理器版本、针对mobileGT 架构和MPC5121e开发平台做了优化的Lin
[新品]
基于16位单片机的逆变电源系统的设计
1、引言 近来,逆变电源在各行各业的应用日益广泛。本文介绍了一种以16位单片机8XC196MC为内核的逆变电源系统的设计。8XC196MC片内集成了一个3相波形发生器WFG,这一外设装置大大简化了产生同步脉宽调制波形的控制软件和外部硬件,可构成最小单片机系统同时协调完成SPWM波形生成和整个系统的检测、保护、智能控制、通讯等功能。 2、 电源系统的基本原理 该电源由蓄电池输入24V直流电,然后通过桥式逆变电路逆变成SPWM波形,经低通滤波器得到正弦波输出。SPWM波形由8XC196MC的3相波形发生器WFG产生,可输出所需电压和频率的正弦波。 3、 系统硬件设计 该逆变电源系统可实现调频、调压功能。通过A/D转换,自动反
[应用]
飞思卡尔推出使用QUICC Engine 技术的通信处理器
飞思卡尔半导体推出第一款基于其QorIQ 通信平台,并且融入 QUICC Engine多协议技术的处理器。QorIQ P1012/P1021 产品系列为使用传统多协议接口的客户提供了向全IP环境迁移的高性能、低功耗路径。 大多数嵌入式多核处理器集成了通用 CPU,这些CPU不是面向数据平面进行优化,因此要求更多更快的 CPU 来为多协议处理提供同等水平的性能。通过集成最新的QUICC Engine技术以及一个或两个基于Power Architecture®技术的800 MHz内核,飞思卡尔的最新 QorIQ P1012 以及 P1021 处理器提供高效的多核处理。QorIQ 与 QUICC Engine技术的结合赋予
[网络通信]
<font color='red'>飞思卡尔</font>推出使用QUICC Engine 技术的通信处理器
飞思卡尔HCS12中断
默认状态: 在进入中断服务程序时,I位自动置1,禁止其他可屏蔽中断 即使有优先级更高的中断请求,也必须等当前中断服务程序执行完以后才能响应 优先级的作用只有在多个中断源同时请求中断时在能体现 无法实现中断嵌套 如果在进入中断服务程序时,手动对I位清零: 任何其他可屏蔽中断都可以被响应,无论其优先级有多高 中断响应由时间控制,可以实现中断嵌套 对中断执行无法预测 HPRIO寄存器 写入HPRIO中的中断向量的后八位,可以改变该中断的优先级 同样,优先级的作用只有在多个中断源同时请求中断时在能体现 中断优先处理机制: 1:在中断服务程序中,首先对I为清零,即EnableInterrupts 2:选择优先级
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved