[ZLG-MCU] 求助:进不了systick中断

[复制链接]
 楼主| ATmega32L 发表于 2008-2-21 20:58 | 显示全部楼层 |阅读模式
#include&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&quot;srcsystick.h&quot;<br />#include&nbsp;&quot;srcsysctl.h&quot;<br />#include&nbsp;&quot;hw_ints.h&quot;<br />#include&nbsp;&quot;hw_nvic.h&quot;<br />#include&nbsp;&quot;srcinterrupt.h&quot;<br />#include&nbsp;&quot;srcgpio.h&quot;<br />#include&nbsp;&quot;hw_memmap.h&quot;<br /><br />#define&nbsp;PINS&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PIN_4<br /><br />void&nbsp;SysTickISR(void)<br />{<br />static&nbsp;unsigned&nbsp;int&nbsp;temp=PINS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTB_BASE,PINS,temp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=~temp;<br />}<br /><br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTB_BASE,PINS,GPIO_DIR_MODE_OUT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTB_BASE,PINS,PINS);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysTickPeriodSet(SysCtlClockGet()/1000-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysTickIntRegister(SysTickISR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysTickEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysTickIntEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntMasterEnable();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br /><br />}<br /><br /><br /><br />不知道哪里有问题,总是进不了SYSTICK中断。<br />KEIL&nbsp;3.05A<br />
zlgarm 发表于 2008-2-22 12:05 | 显示全部楼层

在中断表中有没有填写"SysTickISR"?

在中断表中有没有填写&quot;SysTickISR&quot;?<br /><br />(zlgarm_ZSG)
hotpower 发表于 2008-2-22 15:52 | 显示全部楼层

哈哈~~~楼主整天迷糊~~~

  
hotpower 发表于 2008-2-22 15:59 | 显示全部楼层

哈哈~~~都是楼主的"IAR 可以不用setup.c"的高见造成~~~

  <br /> 相关链接:<a href='https://bbs.21ic.com/club/bbs/list.asp?boardid=42&page=1&t=2859527'>https://bbs.21ic.com/club/bbs/list.asp?boardid=42&page=1&t=2859527</a>
 楼主| ATmega32L 发表于 2008-2-22 16:06 | 显示全部楼层

没必要把SysTickISR填写到中断向量表里

在中断表中有没有填写&quot;SysTickISR&quot;?<br />没有。<br /><br />既然调用SysTickIntRegister(SysTickISR),就没必要把SysTickISR填写到中断向量表里。<br /><br /><br />void<br />SysTickIntRegister(void&nbsp;(*pfnHandler)(void))<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Register&nbsp;the&nbsp;interrupt&nbsp;handler,&nbsp;returning&nbsp;an&nbsp;error&nbsp;if&nbsp;an&nbsp;error&nbsp;occurs.<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;IntRegister(FAULT_SYSTICK,&nbsp;pfnHandler);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Enable&nbsp;the&nbsp;SysTick&nbsp;interrupt.<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;HWREG(NVIC_ST_CTRL)&nbsp;|=&nbsp;NVIC_ST_CTRL_INTEN;<br />}<br /><br /><br /><br /><br />void<br />IntRegister(unsigned&nbsp;long&nbsp;ulInterrupt,&nbsp;void&nbsp;(*pfnHandler)(void))<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;ulIdx;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Check&nbsp;the&nbsp;arguments.<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(ulInterrupt&nbsp;&lt&nbsp;NUM_INTERRUPTS);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Make&nbsp;sure&nbsp;that&nbsp;the&nbsp;RAM&nbsp;vector&nbsp;table&nbsp;is&nbsp;correctly&nbsp;aligned.<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(((unsigned&nbsp;long)g_pfnRAMVectors&nbsp;&&nbsp;0x000003ff)&nbsp;==&nbsp;0);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;See&nbsp;if&nbsp;the&nbsp;RAM&nbsp;vector&nbsp;table&nbsp;has&nbsp;been&nbsp;initialized.<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;if(HWREG(NVIC_VTABLE)&nbsp;!=&nbsp;(unsigned&nbsp;long)g_pfnRAMVectors)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Copy&nbsp;the&nbsp;vector&nbsp;table&nbsp;from&nbsp;the&nbsp;beginning&nbsp;of&nbsp;FLASH&nbsp;to&nbsp;the&nbsp;RAM&nbsp;vector<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;table.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(ulIdx&nbsp;=&nbsp;0;&nbsp;ulIdx&nbsp;&lt&nbsp;NUM_INTERRUPTS;&nbsp;ulIdx++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pfnRAMVectors[ulIdx]&nbsp;=&nbsp;(void&nbsp;(*)(void))HWREG(ulIdx&nbsp;*&nbsp;4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Point&nbsp;NVIC&nbsp;at&nbsp;the&nbsp;RAM&nbsp;vector&nbsp;table.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWREG(NVIC_VTABLE)&nbsp;=&nbsp;(unsigned&nbsp;long)g_pfnRAMVectors;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Save&nbsp;the&nbsp;interrupt&nbsp;handler.<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;g_pfnRAMVectors[ulInterrupt]&nbsp;=&nbsp;pfnHandler;<br />}<br /><br /><br /><br />启动时,默认中断向量表里面的前4个中断向量有用。<br />当程序启动完毕后调用IntRegister,会将在FLASH区里面的中断向量表复制到RAM中,并且将要注册的中断地址写道相应的中断向量里,与中断向量之前的值无关。
hotpower 发表于 2008-2-22 16:08 | 显示全部楼层

哈哈~~~晕呀~~~你自己玩吧...厉害可就是不"晕醒"

  
 楼主| ATmega32L 发表于 2008-2-22 16:53 | 显示全部楼层

用CrossWorks可以了

用CrossWorks编译就可以了<br />怀疑kiel3.05a有问题或者是我用的DriverLib库文件不对。<br /><br /><br />#include&nbsp;&quot;hw_ints.h&quot;<br />#include&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&quot;src/gpio.h&quot;<br />#include&nbsp;&quot;src/sysctl.h&quot;<br /><br />#define&nbsp;PINS&nbsp;&nbsp;&nbsp;&nbsp;(GPIO_PIN_4|GPIO_PIN_5)<br /><br />void&nbsp;delay(int&nbsp;d)<br />{<br />&nbsp;&nbsp;for(&nbsp;;&nbsp;d;&nbsp;--d);<br />}<br /><br />void&nbsp;SysTickISR(void)<br />{static&nbsp;int&nbsp;i=0;<br />&nbsp;&nbsp;&nbsp;if(++i&gt=1000)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_5,~GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_5));<br />&nbsp;&nbsp;&nbsp;}<br />}<br /><br />int&nbsp;main(void)<br />{<br />IntMasterDisable();<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlClockSet(SYSCTL_SYSDIV_1&nbsp;|&nbsp;SYSCTL_USE_OSC&nbsp;|&nbsp;SYSCTL_OSC_MAIN&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_XTAL_6MHZ);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTB_BASE,&nbsp;PINS,&nbsp;GPIO_DIR_MODE_OUT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SysTickIntRegister(SysTickISR);<br />&nbsp;&nbsp;&nbsp;&nbsp;SysTickPeriodSet(SysCtlClockGet()/1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;SysTickEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SysTickIntEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;IntMasterEnable();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_4,GPIO_PIN_4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(200000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_4,~GPIO_PIN_4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(200000);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />用crossworks编译得到elf,再用KEIL软件仿真,可以正常进入systick中断。<br /><br />但是用keil编译后软件仿真总是有问题。<br /><br /> <br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20082/2008222165319884.rar'>https://bbs.21ic.com/upfiles/img/20082/2008222165319884.rar</a>
zlgmcu 发表于 2008-2-22 16:57 | 显示全部楼层

一般请不要使用中断注册,这会导致运行效率严重下降

所以,还是用启动文件为好。<br /><br />(zlgmcu_wdx)
 楼主| ATmega32L 发表于 2008-2-22 16:57 | 显示全部楼层

这个程序在CrossWorks下也可以

这个程序在CrossWorks下也可以,<br />Keil是咋回事就是不行呢?<br /><br /><br />#include&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&quot;srcsystick.h&quot;<br />#include&nbsp;&quot;srcsysctl.h&quot;<br />#include&nbsp;&quot;hw_ints.h&quot;<br />#include&nbsp;&quot;hw_nvic.h&quot;<br />#include&nbsp;&quot;srcinterrupt.h&quot;<br />#include&nbsp;&quot;srcgpio.h&quot;<br />#include&nbsp;&quot;hw_memmap.h&quot;<br /><br />#define&nbsp;PINS&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PIN_4<br /><br />void&nbsp;SysTickISR(void)<br />{<br />static&nbsp;unsigned&nbsp;int&nbsp;temp=PINS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTB_BASE,PINS,temp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=~temp;<br />}<br /><br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTB_BASE,PINS,GPIO_DIR_MODE_OUT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTB_BASE,PINS,PINS);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysTickPeriodSet(SysCtlClockGet()/1000-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysTickIntRegister(SysTickISR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysTickEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysTickIntEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntMasterEnable();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br /><br />}<br />
zlgmcu 发表于 2008-2-22 17:06 | 显示全部楼层

Cross用的是GCC编译器,操作方便些

GCC编译器操作方便,能够自动搞定。但编译生成的代码效率低。<br />Keil和IAR的编译器效率高,但中断入口必须要在启动文件里手工设定。<br /><br />(zlgmcu_wdx)
 楼主| ATmega32L 发表于 2008-2-22 17:13 | 显示全部楼层

中断注册严重降低效率不同意

中断注册严重降低效率不同意。<br /><br /><br />1.中断注册只是一个小函数,只有第一次注册时,才复制所有中断向量表到RAM里,以后再注册不会复制中断向量表。<br />2.如果中断向量表已经注册,则中断响应速度是一样的。<br />(没发现哪里有说中断向量表在RAM里面或者在FLASH里面中断相应速度不同,即使不同,也应该是RAM比Flahs快)<br />3.使用中断注册灵活性更强,并且可以不必理会启动文件。<br />(我的目的是完全不要启动文件,不过IAR软件仿真不能仿真中断,<br />目前尚不知道完全不要启动文件是否有问题)
hotpower 发表于 2008-2-22 18:14 | 显示全部楼层

哈哈~~~在工控中俺认为中断向量表还是在FLASH中心安~~~

可以看出Cortex&nbsp;M3的中断体系和MCU有多么相似~~~
hhtek 发表于 2008-2-22 18:34 | 显示全部楼层

可能是编译器的问题

我在把用ICC&nbsp;AVR做的程序往cotex&nbsp;m3上移植,发现一个现象!<br /><br />只有两个&nbsp;.c文件<br />a.c中有函数&nbsp;void&nbsp;mc(void){;}<br />b.c中可以直接调用&nbsp;a.c中的函数,而且不需要extern申明<br /><br />的确比较“厉害”!!!!<br /><br />但是我试过的其他很多c编译器,必须extern一下,不然不能编译的
hotpower 发表于 2008-2-23 00:28 | 显示全部楼层

俺不喜欢g_pfnRAMVectors,俺喜欢g_pfnVectors~~~

哈哈~~~看看图还是有趣的~~~这个&quot;联络图&quot;够清晰的吧~~~<br /><br />记得俺在ARM7核的LPC213X上折腾了半天就是想把类似的<br />g_pfnRAMVectors改成g_pfnVectors.<br /><br />这倒好,Cortex&nbsp;M3给你不折腾的机会你还要反折腾~~~~<br /><br />哈哈~~~服了楼主了~~~
 楼主| ATmega32L 发表于 2008-2-23 07:54 | 显示全部楼层

多谢。

多谢。<br /><br /><br />__root&nbsp;const&nbsp;uVectorEntry&nbsp;g_pfnVectors[]&nbsp;@&nbsp;&quot;INTVEC&quot;&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;.ulPtr&nbsp;=(uint32)&nbsp;__segment_end(&quot;CSTACK&quot;)&nbsp;},<br />//是__segment_end(&quot;CSTACK&quot;)还是__segment_end(&quot;CSTACK&quot;)+1<br />&nbsp;&nbsp;&nbsp;&nbsp;__program_start,&nbsp;&nbsp;&nbsp;//如何让程序识别__program_start,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;NmiSR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FaultISR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />请问:<br />1.如何让程序识别__program_start,<br />2.最初加载堆栈指针是__segment_end(&quot;CSTACK&quot;)还是__segment_end(&quot;CSTACK&quot;)+1<br />(CORTEX-M3堆栈是空堆栈还是满堆栈?)
hotpower 发表于 2008-2-24 02:24 | 显示全部楼层

中断向量的首项应该是栈顶地址

例如:<br />unsigned&nbsp;int&nbsp;stack_base[STACK_SIZE];<br />....<br /><br />ISR_VECTOR_TABLE&nbsp;vector_table_at_0<br />{<br />&nbsp;&nbsp;stack_base&nbsp;+&nbsp;sizeof(stack_base);<br />//......<br />};
 楼主| ATmega32L 发表于 2008-2-24 10:38 | 显示全部楼层

说明CORTEX-m3应该是空减堆栈。

stack_base&nbsp;+&nbsp;sizeof(stack_base);<br />应该是&stack_base[STACK_SIZE];<br /><br />&stack_base[STACK_SIZE]是数组最后一个元素的下一个地址。<br /><br />说明CORTEX-m3应该是空减堆栈。<br /><br /><br />
zlgarm 发表于 2008-2-24 21:27 | 显示全部楼层

不建议把程序复制到RAM中运行

不建议在CORTEX-M3中,把程序复制到RAM中运行,原因有二:<br />1)安全问题.<br />2)速度问题.&nbsp;Cortex-M3的FLASH同时使用指令总线(INTRUCTION&nbsp;BUS)和数据总线(DATA&nbsp;BUS),&nbsp;每条指令都可在同一时钟下使用这两条总线.&nbsp;而RAM使用系统总线(SYSTEM&nbsp;BUS),&nbsp;它和指令总线,数据总线不能在同一时钟内使用的.任何品牌的CORTEX-M3都如此,这是ARM公司规定的.<br />&nbsp;&nbsp;例如:&nbsp;LDR&nbsp;R0&nbsp;[0X20000180],&nbsp;如果在FLASH中,由于LUMINARY的FLASH是单周期的,&nbsp;只需要一个时钟就完成;&nbsp;如果在RAM中,首先用系统总线读指令,然后用数据总线读0X200000180中的数据,&nbsp;要2个时钟.&nbsp;<br />&nbsp;&nbsp;所以FLASH中的指令比RAM的指令快得多!&nbsp;<br /><br />(zlgarm_zsg)
xwj 发表于 2008-2-24 21:50 | 显示全部楼层

呵呵,很多事情都不能光凭经验就一概而论啊

“把程序复制到RAM中运行”,这对于RAM速度可以跑得远远快于FLASH速度,并且在指令流水线做了相应优化的芯片却是能把速度显著提高,这是勿庸置疑的。<br /><br />但是!<br />对于Cortex-M3,<br />一则因为其内核速度有限,而FLASH又做了优化,设计上RAM速度和访问FLASH速度时一样的<br />二则由于其指令总线和数据总线(可同时访问),而RAM中运行却需要2次访问,结果程序放FLASH里反而比放RAM里快一倍!<br /><br /><br />因此,很多事情都不能光凭经验就一概而论哦,多读读资料还是有必要的:-)
hotpower 发表于 2008-2-24 22:57 | 显示全部楼层

学习了~~~

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

376

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部