三星cpu s3c2440 的中断向量表问题

发布者:chi32最新更新时间:2018-06-04 来源: eefocus关键字:三星cpu  s3c2440  中断向量表 手机看文章 扫描二维码
随时随地手机看文章

以前一直搞不明明白,2440 的中断向量表为什么会是在 _ISR_STARTADDRESS=0x33FF_FF00?cpu是这么跳转到这个位置的? 在零地址的终端向量表有做什么用。

今天有空,仔细研究了下,终于看清楚了。

 

 注意一下代码:


  1. ENTRY  

  2.   

  3. ;1)The code, which converts to Big-endian, should be in little endian code.  

  4. ;2)The following little endian code will be compiled in Big-Endian mode.  

  5. ;  The code byte order should be changed as the memory bus width.  

  6. ;3)The pseudo instruction,DCD can't be used here because the linker generates error.  

  7. ASSERT  :DEF:ENDIAN_CHANGE  

  8. [ ENDIAN_CHANGE  

  9.     ASSERT  :DEF:ENTRY_BUS_WIDTH  

  10.     [ ENTRY_BUS_WIDTH=32  

  11.     b   ChangeBigEndian     ;DCD 0xea000007  

  12.     ]  

  13.   

  14.     [ ENTRY_BUS_WIDTH=16  

  15.     andeq   r14,r7,r0,lsl #20   ;DCD 0x0007ea00  

  16.     ]  

  17.   

  18.     [ ENTRY_BUS_WIDTH=8  

  19.     streq   r0,[r0,-r10,ror #1] ;DCD 0x070000ea  

  20.     ]  

  21. |  

  22.     b   ResetHandler  

  23.    ]  

  24. b   HandlerUndef    ;handler for Undefined mode  

  25. b   HandlerSWI  ;handler for SWI interrupt  

  26. b   HandlerPabort   ;handler for PAbort  

  27. b   HandlerDabort   ;handler for DAbort  

  28. b   .       ;reserved  

  29. b   HandlerIRQ  ;handler for IRQ interrupt  

  30. b   HandlerFIQ  ;handler for FIQ interrupt  ENTRY  

  31.   

  32. ;1)The code, which converts to Big-endian, should be in little endian code.  

  33. ;2)The following little endian code will be compiled in Big-Endian mode.  

  34. ;  The code byte order should be changed as the memory bus width.  

  35. ;3)The pseudo instruction,DCD can't be used here because the linker generates error.  

  36. ASSERT  :DEF:ENDIAN_CHANGE  

  37. [ ENDIAN_CHANGE  

  38.     ASSERT  :DEF:ENTRY_BUS_WIDTH  

  39.     [ ENTRY_BUS_WIDTH=32  

  40.     b   ChangeBigEndian     ;DCD 0xea000007  

  41.     ]  

  42.   

  43.     [ ENTRY_BUS_WIDTH=16  

  44.     andeq   r14,r7,r0,lsl #20   ;DCD 0x0007ea00  

  45.     ]  

  46.   

  47.     [ ENTRY_BUS_WIDTH=8  

  48.     streq   r0,[r0,-r10,ror #1] ;DCD 0x070000ea  

  49.     ]  

  50. |  

  51.     b   ResetHandler  

  52.    ]  

  53. b   HandlerUndef    ;handler for Undefined mode  

  54. b   HandlerSWI  ;handler for SWI interrupt  

  55. b   HandlerPabort   ;handler for PAbort  

  56. b   HandlerDabort   ;handler for DAbort  

  57. b   .       ;reserved  

  58. b   HandlerIRQ  ;handler for IRQ interrupt  

  59. b   HandlerFIQ  ;handler for FIQ interrupt  


 

以上代码就是中断向量,这个不用怀疑。

 

  1.         MACRO  

  2. $HandlerLabel HANDLER $HandleLabel  

  3.   

  4. $HandlerLabel  

  5.     sub sp,sp,#4    ;decrement sp(to store jump address)  

  6.     stmfd   sp!,{r0}    ;PUSH the work register to stack(lr does't push because it return to original address)  

  7.     ldr     r0,=$HandleLabel;load the address of HandleXXX to r0  

  8.     ldr     r0,[r0]  ;load the contents(service routine start address) of HandleXXX  

  9.     str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack  

  10.     ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)  

  11.     MEND  


 

这个是宏定义

 

  1.     LTORG  

  2. HandlerFIQ      HANDLER HandleFIQ  

  3. HandlerIRQ      HANDLER HandleIRQ  

  4. HandlerUndef    HANDLER HandleUndef  

  5. HandlerSWI      HANDLER HandleSWI  

  6. HandlerDabort   HANDLER HandleDabort  

  7. HandlerPabort   HANDLER HandlePabort  


 

中断向量函数, 注意:HandlerIRQ      HANDLER HandleIRQ 会根据上面的宏展开。

 

  1.     AREA RamData, DATA, READWRITE  

  2.   

  3.     ^   _ISR_STARTADDRESS       ; _ISR_STARTADDRESS=0x33FF_FF00  

  4. HandleReset     #   4  

  5. HandleUndef     #   4  

  6. HandleSWI       #   4  

  7. HandlePabort    #   4  

  8. HandleDabort    #   4  

  9. HandleReserved  #   4  

  10. HandleIRQ       #   4  

  11. HandleFIQ       #   4  


 

定义在 0x33FF_FF00 位置的中断向量表。

 

基本上代码的流程是,每次中断到达后,还是执行 0 地址的中断向量表,中断向量调用HandlerIRQ    HANDLER HandleIRQ,HandlerIRQ      HANDLER HandleIRQ 展开后,实际执行 HandleIRQ  #   4。

 

另外需要注意的是,mmu 的设置 MMU_SetMTT(0x00000000,0x07f00000,(int)__ENTRY,RW_CNB);  保证 (int)__ENTRY 的位置永远在 0x00000000;


关键字:三星cpu  s3c2440  中断向量表 引用地址:三星cpu s3c2440 的中断向量表问题

上一篇:keil5(MDK5)配置S3C2440裸机开发调试环境
下一篇:S3C2440体系架构

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

S3c2440ARM异常与中断体系详解8---定时器中断程序示例
这节课我们来写一个定时器的中断服务程序 使用定时器来实现点灯计数 查考资料就是第10章PWM TIMER 我们先把这个结构图展示出来 这个图的结构很好 这里面肯定有一个clk(时钟), 1 、每来一个clk(时钟)这个TCNTn减去1 2、 当TCNTn == TCMPn时,可以产生中断,也可以让对应的SPWM引脚反转,(比如说原来是高电平,发生之后电平转换成低电平) 3、 TCNTn继续减1,当TCNTn == 0时,可以产生中断,pwm引脚再次反转 TCMPn 和 TCNTn的初始值来自TCMPBn,TCNTBn 4 、TCNTn == 0时,可自动加载初始 怎么使用定时器? 1、 设置时钟 2 、设置初值 3
[单片机]
S3c2440ARM异常与中断体系详解8---定时器中断程序示例
s3c2410与s3c2440的部分细节区别整理
这两个soc都是arm920,cpuid都是0x41129200,很多寄存器设置都是一样的,但是你要想直接把2410的bootloader、内核拿到2440上用,那是肯定会出错的 网上这样的文章很多,大多都仅仅是宏观上比划两句,如摄像头驱动、主频之类,没有什么意义 细节是魔鬼,只有在细节上充分积累的工程师才会在技术上有成长的空间 这里仅仅集合了我能找到的不同,难免不全,一切还是以datasheet为本。 1、主频不同,总线定时所要求的时钟数也会不一样,不重新设置自然串口乱码,需要设置的寄存器也不同 2440需要额外多设置一个寄存器CAMDIVN,分频比可选择的范围也比2410(1:1:1、1:2:4、1:4:4、1:2:2)多很
[单片机]
S3C2440 U-Boot移植--Norflash驱动支持- S29AL016
U-Boot版本:2008.10 开发板:Mini2440 之前根据国嵌的实验手册移植了很久都没有成功,关键是国嵌手册上的Norflash型号是SST1601,而我的Mini2440开发板上配置的是Spansion公司的S29AL016J芯片,两者型号不同,修改的地方差异很大。后来通过在网上查资料发现S29AL016J芯片与smdk2410默认使用的芯片(AMD的AM29LV400)除了大小不一样外,其他如命令序列,操作方式都是一样的(也难怪在做完国嵌实验手册的2.4以后就可以进行环境变量的保存)。所以根据AM29LV400来移植的话所做的修改不多。 查询datasheet后,得到如下信息; 该Norflash芯
[单片机]
浅谈S3C2440的中断寄存器及中断过程
S3C2440一共有60个中断源,其中有15个子中断源,它们与SUBSRCPND寄存器中的每一位相对应,其他45个中断源与SRCPND中的每一位相对应。要注意的是EINT4~7对应的是同一位SRCPND ,而EINT8~23对应的也是SRCPND 一位。 1 S3C2440的中断寄存器 中断分两大类:外部中断和内部中断。 1.1 外部中断寄存器 24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体可参考datesheet数据手册。 寄存器: EX
[单片机]
浅谈<font color='red'>S3C2440</font>的中断寄存器及中断过程
S3C2440开发工具realview MDK4.22之库的使用
一。与c库会强制链接 如果你写了一个c程序,必然会和c库链接,尽管你没有直接使用c库函数。这是因为编译器为了改进程序,可能隐含的产生了对c库函数调用。 即便你的程序没有main()函数,也只是说c库没变初始化而已,一些c库函数仍然可以使用并且编译器可以隐含地调用这些函数。 二。ARM的c的运行时库 c标准库由以下组成: ISO99标准库定义的所有函数。 依赖于目标的函数,用来在semihosted环境中执行c库函数。你可以在你的应用程序中重定义这些函数。 被编译器隐含调用的函数。 由ARM扩展的,但是不是由ISO C定义,且包含在这个库里的。 c微型库由以下组成(可以代替c标准库,它是非常适合只有小容量内存的
[单片机]
<font color='red'>S3C2440</font>开发工具realview MDK4.22之库的使用
S3C2440 初步接触之程序烧写
使用OpenJTAG烧写:(裸板程序) 1、安装驱动 2、将 oflash.exe FTD2XX.dll 拷贝到 C:Windowssystem32 下。(oflash.exe 和 FTD2XX.dll 在 百问网JZ2440v2主光盘windowstools中) 3、然后在 Windows 命令行就可以直接使用了。 4、接线。 5、在命令 Windows 命令行中使用 oflash 烧写: 进入要烧写的文件所在目录 执行 oflash xxx.bin (xxx.bin 是指要烧写的那个文件) 输入 OpenJTAG 对应的数字 输入 开发板 CPU 对应的数字(我的是S3C2440) 输入 要烧写到那个存储设备上。(视频中所说,
[单片机]
S3C2440学习三(基础模块的使用1)
如果一个人学习一样东西或做一件事,达到忘我的境界,那么他将变得成功。 ①如何实现UART输出的?UART使用到的寄存器如下,(1)UART线性控制寄存器ULCONn,(2)UART控制寄存器UCONn,(3)UART FIFO控制寄存器UFCONn,(4)UART MODEM控制寄存器UMCONn,(5)UART 接收发送状态寄存器UTRSTATn,(6)UART 错误状态寄存器UERSTATn,(7)UART FIFO状态寄存器UFSTATn,(8)UART MODEM状态寄存器UMSTATn,(9)UART发送缓存寄存器UTXHn,(10)UART接收缓冲寄存器URXHn,(11)UART波特率除数寄存器UBRDIVn。 1.
[单片机]
基于S3C2440微处理器的工业超声探伤仪设计
  超声探伤仪广泛应用在航空航天、石油化工、冶金造船等行业,用于检测金属或非金属内部缺陷以及分析材质,是无损检测领域重要的检测仪器之一。   超声探伤时,应用得最多的是A型显示,如图1所示。在A型显示中,横坐标代表被测物的深度,纵坐标代表回波信号的幅度。   目前同内生产的数字式超声探伤仪仍主要以单片机为核心,单片机固有的性能瓶颈制约了仪器的性能指标和功能扩展,与国外先进水平相比,国产产品技术水平仍有较大的差距。   本文介绍的新型嵌入式数字超声探伤仪以32位RISC CPUS3C2440为控制中心,以高性能FPGA Spartan3为信号采集及处理核心,并辅以功能强大的Linux操作系统和MiniGUI图形库,实现了一
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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