打印
[ZLG-ARM]

在KEIL RTL中使用IAP的试验.

[复制链接]
4052|10
手机看帖
扫描二维码
随时随地手机跟帖
沙发
lpc2000| | 2008-3-27 09:31 | 只看该作者

好像RTL不提供这种例子吧

要是中断停了,操作系统的时钟还怎么运行啊?

要运行RTL的时候,就不要用IAPcall,用分散加载
弄成一个secondary bootloader.

不过,真要做,下列可以参考:

#define SYS32Mode        0x1F
#define IRQ32Mode        0x12
#define FIQ32Mode        0x11

static DWORD sysreg;        /* used as LR register */
#define IENABLE __asm { MRS sysreg, SPSR; MSR CPSR_c, #SYS32Mode }
#define IDISABLE __asm { MSR CPSR_c, #(IRQ32Mode|I_Bit); MSR SPSR_cxsf, sysreg }

使用特权

评论回复
板凳
U200712308|  楼主 | 2008-3-27 13:13 | 只看该作者

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

我试一下.

使用特权

评论回复
地板
U200712308|  楼主 | 2008-3-27 13:15 | 只看该作者

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

使用特权

评论回复
5
U200712308|  楼主 | 2008-3-27 13:35 | 只看该作者

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

IAP还是用不了,看来没办法用IAP了.

使用特权

评论回复
6
U200712308|  楼主 | 2008-3-27 14:51 | 只看该作者

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

https://bbs.21ic.com/upfiles/img/20083/2008327145111362.jpg

使用特权

评论回复
7
U200712308|  楼主 | 2008-3-27 14:56 | 只看该作者

还是跳到未定义指令.

Undef_Handler   B       Undef_Handler

使用特权

评论回复
8
U200712308|  楼主 | 2008-3-27 14:59 | 只看该作者

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

/****************************************Copyright (c)**************************************************
**                               IAP 写内部FLASH函数 API
**
*******************************************************************************************************
*/
#include  "LPC214x.h"
#include "BlueFengUser.h"
#include "iapuser.h"

OS_TID Iap_Task;                        /* IAP任务句柄 */

#define SYS32Mode        0x1F
#define IRQ32Mode        0x12
#define FIQ32Mode        0x11
#define I_Bit     0x80            ; when I bit is set, IRQ is disabled
#define F_Bit     0x40            ; when F bit is set, FIQ is disabled
#define IAPMode          0x92      ;(IRQ32Mode|I_Bit)


static unsigned int sysreg;        /* used as LR register */
#define IENABLE __asm { MRS sysreg, SPSR; MSR CPSR_c, #SYS32Mode; }
#define IDISABLE __asm { MSR CPSR_c, #0x92; MSR SPSR_cxsf, sysreg; }

const unsigned int  LED=(1<<24);          //P1.24控制LED,低电平点亮
                



void testiap(void){

  unsigned char IapBuffer[256];
  unsigned int i;
  for(i=0; i<256; i++){
        IapBuffer = i;
    }
 os_dly_wait(1);

   IDISABLE
  Erase1Sector(0x8000);
  ProgramPage(0x8000,256,IapBuffer);
IENABLE
os_dly_wait(1);

}


void IAP_TASK(void){
  for (;;) {

    //os_evt_wait_or(0xFFFF, 0xFFFF);         /* Wait for an Event */

            IO1CLR=LED;
     os_dly_wait(10);

            IO1SET=LED;
    testiap();
     os_dly_wait(10);
    }
}

void Iap_task_create(void){
        
    PINSEL2=PINSEL2&(~0x08);
    IO1DIR=LED;

   Iap_Task = os_tsk_create(IAP_TASK, 2);
}



使用特权

评论回复
9
U200712308|  楼主 | 2008-3-27 15:03 | 只看该作者

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

发完,去外挂IIC去了.为了快点完成任务,挂24C芯片去了,有空再来玩IAP.

使用特权

评论回复
10
U200712308|  楼主 | 2008-3-27 15:36 | 只看该作者

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

关中断不行,我把OS给停了总行吧.
 tsk_lock();
  Erase1Sector(0x8000);
  ProgramPage(0x8000,256,IapBuffer);
//IENABLE
tsk_unlock ();

使用特权

评论回复
11
heqiaojun| | 2008-7-8 13:26 | 只看该作者

UCOS下使用IAP的问题

我在UCOS下使用IAP遇到问题:
调用CHEKBLANK 读取扇区号,读取版本号,compare 这些功能都正常,但是调用擦出和RamTOFlash 的时候,当运行到 
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);
就会死机跳到未定义中断;

经过比较,以及考虑到书上提到的调用IAP期间禁止中断的问题,我在
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout);
这一句话前后加入了 OS_ENTER_CRITICAL(); 和 OS_EXIT_CRITICAL();
这两句来开关中断,结果就可以跑了;

擦出和写入4K 的数据时间都很短;

但是周工的技术支持告诉我 在OS的情况下不适合用IAP:

    注意1点,IAP程序正常运行的前提是:中断必须关闭。但是在uc/OS-II里,没有中断,操作系统就不能运转。这是1个矛盾,请注意1下。

有点像二楼的说法:

    要是中断停了,操作系统的时钟还怎么运行啊?


我有点不明白的是,通过OS_ENTER_CRITICAL(); 和 OS_EXIT_CRITICAL();来保护一些需要禁止中断的地方不是一种常用的方法么?而且我关闭中断的时间不算长啊。

还请高手明示~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

37

帖子

0

粉丝