|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
江湖救急!~ |
作者:高建明 栏目:MCU技术 |
本人现在用SH69P55F芯片,有一问题比较郁闷:该芯片有4页8KROM,当程序运行在高4Krom的时候,此时来了一个定时中断,程序能不能返回到0页的中断向量?当中断退出后,程序能不能自动返回高4K?还是需要设置BNK寄存器?请高手解答,谢谢. |
2楼: | >>参与讨论 |
作者: warm_ice 于 2006/11/3 22:13:00 发布:
可以 因为ROM的每个页为4K,但其中有2K是共用的,所以来中断的响应和返回都不会有问题的.你可以试一下,仿真是可以仿出来的. |
3楼: | >>参与讨论 |
作者: 高建明 于 2006/11/4 8:06:00 发布:
谢谢 你好,谢谢你的解答,可是我仿真是错误的,SH69P55总共有4页,8KROM, 我把主程序放在0页,子程序放在3页(最后2KROM空间),但是第3页程序执行过程中的中断确实可以响应到,但是不能返回到第3页的子程序中,仿真的情况就是这样的.虽然我不希望这样,但是我还是认为应该是对的,应为第0页主程序调用第3页子程序是需要通过寄存器换页的,而中断返回时,执行的RTNI指令是没有换页操作的,所以最后就会跳到错误的地方去,不知我这样理解对不对?还有如何做才能达到我希望的情况? |
4楼: | >>参与讨论 |
作者: 高建明 于 2006/11/4 8:30:00 发布:
难道是堆栈溢出? 我换页的时候没有关中断 |
5楼: | >>参与讨论 |
作者: warm_ice 于 2006/11/4 15:33:00 发布:
最好把中断放在前2K内 最好把中断放在前2K内,因为这2K空间是共用的,无论程序运行在哪个ROM页区,都可以正常响应中断并返回. |
6楼: | >>参与讨论 |
作者: 高建明 于 2006/11/4 20:48:00 发布:
这样的程序结构合理吗? ORG 0000H JMP RESET JMP TIMER0 JMP TIMER1 JMP TIMER2 JMP INT TIMER1:RTNI TIMER2:RTNI INT:RTNI TIMER0:;中断位于BANK0 ........ ....... ...... RTNI RESET:CALL MAIN;调用BANK0程序 JMP RESET MAIN: LCALL BANK1_ROM;长调用BANK1程序 LCALL BANK2_ROM;长调用BANK2程序 LCALL BANK3_ROM;长调用BANK3程序 RTNI ORG 800H BANK1_ROM: CALL AAA;调用BANK1范围内的子程序 RTNI AAA:RTNI ORG 1000H BANK2_ROM: CALL BBB;调用BANK2范围内的子程序 RTNI BBB:RTNI ORG 1800H BANK3_ROM: CALL CCC;调用BANK3范围内的子程序 RTNI CCC:RTNI END |
7楼: | >>参与讨论 |
作者: 未雨绸缪 于 2006/11/6 13:59:00 发布:
你的程序结构完全合理 对于中颖芯片rom超出4k的程序就要这样写的。 对于你的问题,如果程序严格按照你规划的架构来写,可以正常相应中断的。 中颖芯片规划Rom区的Bank是按照下面方式来执行的: SH6XX系列的程序计数器用于寻址程序 ROM。该计数器有12 位:页寄存器(PC11),和循环递增计数器(PC10-PC0)。所以SH6XX系列以2K ROM為一個BANK,4K ROM為一個页面。 程序计数器装入与该条指令相关的数据。对于目标地址大于2K 的ROM 空间,可通过无条件跳转指令(JMP)设置页寄存器位的值实现跳转。程序计数器只能寻址4K 程序ROM 空间。所以對於超過4KROM空間的芯片就有一個ROMBANK寄存器控制ROM页面的切換。 如下面的寄存器1F( ROMBANK寄存器): $1F - - - BNK0 R/W Bit0: Bank register for ROM 页切换技术用于扩展CPU 寻址范围。在SH6XX系列CPU的ROM空間地址結構為低2K的ROM地址($000-$7FF)映射为ROM页面基本2K地址。CPU 地址空间的高2K 映射为ROM 页面的擴展地址,所以SH69P55的縂8K ROM空間被劃分為3 个ROM页面(BNK 0, 1,2)。 ROM 页面空间的 CPU 實際地址如下: CPU Address ROM Space BNK = $00 BNK = $01 $000 - $7FF $0000 - $07FF (BANK 0) $0000 - $07FF (BANK 0) $800 - $17FF $0800-$0FFF (BANK 1) $1000 - $17FF (BANK 2) BNK-= $02 $000 - $7FF $0000 - $07FF (BANK 0) $1800 - $1FFF $1800-$1FFF (BANK 3) 助记符 指令代码 功能 标记位改变 CALL X 11000 xxxx xxx xxxx ST <- CY, PC +1 PC <- X ( 不包括p) JMP X 1110P xxxx xxx xxxx PC <- X ( 包括p) 從指令代碼中可以CALL指令只能訪問到2K ROM空間,而且還不能跨BANK,JMP指令可以訪問4K ROM空間,可以在一個页面跨BANK訪問。但不能跨页面訪問。 由於中斷發生時,PC指針會自動壓棧,壓棧内容是PC12位地址和進位位,然後PC指針會指向ROM 0001-0004地址;所以在改變ROMBANK寄存器值,來切換页面時要先屏蔽掉中斷,再用JMP指令完成換页動作。否則中斷響應發生在擴展地址的改變ROMBANK寄存器值和JMP語句之間時,從堆棧返回PC時就會因ROMBANK寄存器值不同,而不能正常返回到發生中斷響應的地方。但是如果在基本2K地址就不會有問題。 所以如果程序中到處有屏蔽中斷的語句,就會增加編寫程序的困難度,因而這裡用一個技巧來解決這個問題。由於每個ROM页都包含了基本2K ROM地址,所以可以把所有主流程都放在基本2K ROM地址,然後用CALL子程序和JMP的方式來完成擴展,這樣就不會要屏蔽中斷,下面的宏指令就是為滿足這個要求而編寫的,可以看為新的指令.新的指令可以實現從BANK0調用任何BANK的子程序和跳轉地址而不用管ROMBANK寄存器值。 ;功能: Bank0-->直接跳转,Bank123-->跨页跳转,修改RomBank寄存器 ;条件: 仅用于Bank0 <--> Bank123间跨页跳转,可直接用RTNI返回 LONGJUMP MACRO FUNCLABEL LDI TEMP,(FUNCLABEL>>11)&0FH BAZ $+2 LDI ROMBANK,((FUNCLABEL>>11)-1)&0FH JMP FUNCLABEL ENDM ;--------------------------------------------------------------- ;功能: Bank0<-->Bank123间相互子程序长调用,地址范围 8K ;条件: 1.主程序与子程序在同一Bank ; 2.主程序与子程序分在Bank0<-->Bank123两个页面中 ;如果扩展此指令功能,使之支持8K内任意调用,则返回指令亦需改造,call前备份Rombank,RTNI前恢复之. LONGCALL MACRO FUNCLABEL CALL $+2 JMP $+5 LDI TEMP,(FUNCLABEL>>11)&0FH BAZ $+2 LDI ROMBANK,((FUNCLABEL>>11)-1)&0FH JMP FUNCLABEL ENDM |
8楼: | >>参与讨论 |
作者: 高建明 于 2006/11/6 17:06:00 发布:
所有问题都已经解决了,谢谢你的回答 现在只剩下时间问题了. |
9楼: | >>参与讨论 |
作者: 未雨绸缪 于 2006/11/7 19:44:00 发布:
时间有什么问题 |
10楼: | >>参与讨论 |
作者: 高建明 于 2006/11/7 19:56:00 发布:
我是说技术问题解决了,只剩下程序编写时间了 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |