[ZLG-ARM] 在KEIL RTL中使用IAP的试验.

[复制链接]
4706|10
 楼主| U200712308 发表于 2008-3-27 05:22 | 显示全部楼层 |阅读模式
程序用了KEIL 的RTL,工程中用了IAP,试用过程如下.请不要模仿.
lpc2000 发表于 2008-3-27 09:31 | 显示全部楼层

好像RTL不提供这种例子吧

要是中断停了,操作系统的时钟还怎么运行啊?<br /><br />要运行RTL的时候,就不要用IAPcall,用分散加载<br />弄成一个secondary&nbsp;bootloader.<br /><br />不过,真要做,下列可以参考:<br /><br />#define&nbsp;SYS32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x1F<br />#define&nbsp;IRQ32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x12<br />#define&nbsp;FIQ32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x11<br /><br />static&nbsp;DWORD&nbsp;sysreg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;used&nbsp;as&nbsp;LR&nbsp;register&nbsp;*/<br />#define&nbsp;IENABLE&nbsp;__asm&nbsp;{&nbsp;MRS&nbsp;sysreg,&nbsp;SPSR;&nbsp;MSR&nbsp;CPSR_c,&nbsp;#SYS32Mode&nbsp;}<br />#define&nbsp;IDISABLE&nbsp;__asm&nbsp;{&nbsp;MSR&nbsp;CPSR_c,&nbsp;#(IRQ32Mode|I_Bit);&nbsp;MSR&nbsp;SPSR_cxsf,&nbsp;sysreg&nbsp;}<br /><br />
 楼主| U200712308 发表于 2008-3-27 13:13 | 显示全部楼层

没办法也,用到IAP是用来保存数据的.

我试一下.
 楼主| U200712308 发表于 2008-3-27 13:15 | 显示全部楼层

对ARM汇编真的不了解.用完后怎么恢复RTL的工作模式?

  
 楼主| U200712308 发表于 2008-3-27 13:35 | 显示全部楼层

呵呵.中断是可以禁止了.

IAP还是用不了,看来没办法用IAP了.
 楼主| U200712308 发表于 2008-3-27 14:51 | 显示全部楼层

RTL也可以使用临界,还是不行.看来还得看看什么原因.

https://bbs.21ic.com/upfiles/img/20083/2008327145111362.jpg
 楼主| U200712308 发表于 2008-3-27 14:56 | 显示全部楼层

还是跳到未定义指令.

Undef_Handler&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Undef_Handler
 楼主| U200712308 发表于 2008-3-27 14:59 | 显示全部楼层

这个TEST在没有RTL里是可以正常写FLASH的.

/****************************************Copyright&nbsp;(c)**************************************************<br />**&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;IAP&nbsp;写内部FLASH函数&nbsp;API<br />**<br />*******************************************************************************************************<br />*/<br />#include&nbsp;&nbsp;&quot;LPC214x.h&quot;<br />#include&nbsp;&quot;BlueFengUser.h&quot;<br />#include&nbsp;&quot;iapuser.h&quot;<br /><br />OS_TID&nbsp;Iap_Task;&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;IAP任务句柄&nbsp;*/<br /><br />#define&nbsp;SYS32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x1F<br />#define&nbsp;IRQ32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x12<br />#define&nbsp;FIQ32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x11<br />#define&nbsp;I_Bit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;when&nbsp;I&nbsp;bit&nbsp;is&nbsp;set,&nbsp;IRQ&nbsp;is&nbsp;disabled<br />#define&nbsp;F_Bit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;when&nbsp;F&nbsp;bit&nbsp;is&nbsp;set,&nbsp;FIQ&nbsp;is&nbsp;disabled<br />#define&nbsp;IAPMode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;(IRQ32Mode|I_Bit)<br /><br /><br />static&nbsp;unsigned&nbsp;int&nbsp;sysreg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;used&nbsp;as&nbsp;LR&nbsp;register&nbsp;*/<br />#define&nbsp;IENABLE&nbsp;__asm&nbsp;{&nbsp;MRS&nbsp;sysreg,&nbsp;SPSR;&nbsp;MSR&nbsp;CPSR_c,&nbsp;#SYS32Mode;&nbsp;}<br />#define&nbsp;IDISABLE&nbsp;__asm&nbsp;{&nbsp;MSR&nbsp;CPSR_c,&nbsp;#0x92;&nbsp;MSR&nbsp;SPSR_cxsf,&nbsp;sysreg;&nbsp;}<br /><br />const&nbsp;unsigned&nbsp;int&nbsp;&nbsp;LED=(1&lt&lt24);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P1.24控制LED,低电平点亮<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br />void&nbsp;testiap(void){<br /><br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;IapBuffer[256];<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;for(i=0;&nbsp;i&lt256;&nbsp;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IapBuffer&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;os_dly_wait(1);<br /><br />&nbsp;&nbsp;&nbsp;IDISABLE<br />&nbsp;&nbsp;Erase1Sector(0x8000);<br />&nbsp;&nbsp;ProgramPage(0x8000,256,IapBuffer);<br />IENABLE<br />os_dly_wait(1);<br /><br />}<br /><br /><br />void&nbsp;IAP_TASK(void){<br />&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//os_evt_wait_or(0xFFFF,&nbsp;0xFFFF);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Wait&nbsp;for&nbsp;an&nbsp;Event&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO1CLR=LED;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os_dly_wait(10);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO1SET=LED;<br />&nbsp;&nbsp;&nbsp;&nbsp;testiap();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os_dly_wait(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;Iap_task_create(void){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL2=PINSEL2&(~0x08);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO1DIR=LED;<br /><br />&nbsp;&nbsp;&nbsp;Iap_Task&nbsp;=&nbsp;os_tsk_create(IAP_TASK,&nbsp;2);<br />}<br /><br /><br /><br />
 楼主| U200712308 发表于 2008-3-27 15:03 | 显示全部楼层

断点后跳到未定义指令处.

发完,去外挂IIC去了.为了快点完成任务,挂24C芯片去了,有空再来玩IAP.
 楼主| U200712308 发表于 2008-3-27 15:36 | 显示全部楼层

问题解决. 用了禁药.小孩老人孕妇不要用.

关中断不行,我把OS给停了总行吧.<br />&nbsp;tsk_lock();<br />&nbsp;&nbsp;Erase1Sector(0x8000);<br />&nbsp;&nbsp;ProgramPage(0x8000,256,IapBuffer);<br />//IENABLE<br />tsk_unlock&nbsp;();
heqiaojun 发表于 2008-7-8 13:26 | 显示全部楼层

UCOS下使用IAP的问题

我在UCOS下使用IAP遇到问题:<br />调用CHEKBLANK&nbsp;读取扇区号,读取版本号,compare&nbsp;这些功能都正常,但是调用擦出和RamTOFlash&nbsp;的时候,当运行到&nbsp;<br />(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);<br />就会死机跳到未定义中断;<br /><br />经过比较,以及考虑到书上提到的调用IAP期间禁止中断的问题,我在<br />(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);<br />这一句话前后加入了&nbsp;OS_ENTER_CRITICAL();&nbsp;和&nbsp;OS_EXIT_CRITICAL();<br />这两句来开关中断,结果就可以跑了;<br /><br />擦出和写入4K&nbsp;的数据时间都很短;<br /><br />但是周工的技术支持告诉我&nbsp;在OS的情况下不适合用IAP:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;注意1点,IAP程序正常运行的前提是:中断必须关闭。但是在uc/OS-II里,没有中断,操作系统就不能运转。这是1个矛盾,请注意1下。<br /><br />有点像二楼的说法:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;要是中断停了,操作系统的时钟还怎么运行啊?<br /><br /><br />我有点不明白的是,通过OS_ENTER_CRITICAL();&nbsp;和&nbsp;OS_EXIT_CRITICAL();来保护一些需要禁止中断的地方不是一种常用的方法么?而且我关闭中断的时间不算长啊。<br /><br />还请高手明示~<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

37

帖子

0

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