打印

IAP程序更新,这样可能么?

[复制链接]
2560|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
云痕|  楼主 | 2008-10-12 00:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
iap, IO, ST, AD, TI
程序远程IAP更新想法
片子是LPC2365, 目标是产品出厂后,可能因设计缺陷,或者用户需求中途变更,在能不动硬件的情况下,GSM网络远程升级片内程序.
我的想法是,
步骤1:
先做一个小的完整的程序,包含startup.c,targert.c和main.c. main()里的全部代码:
int main (void)
{                     
void (*function)(void) = (void (*)())0x8000;         
char Flag_code;

    Flag_code = *(char *)(0x7000);//程序切换标识

    if (Flag_code == 0)
       function = (void (*)())0x8000;      //扇区8首地址 
    else
       function = (void (*)()0x20000;      //扇区11首地址

    (*function)();    

    return 0;
}
加载文件:
LR_IROM1 0x00000000 0x00001000           ; load region size_region
{   
    ER_IROM1 0x00000000 0x00001000      ; load address = execution address
    {  
       *.o (RESET, +First)
       *(InRoot$$Sections)
       .ANY (+RO)
    }
}

LR_IRAM1 0x40000000 0x00006400 
{
    RW_IRAM1 0x40000000 0x00000400      ; RW data       1K系统变量
    {  
       .ANY (+RW +ZI)    ; map文件内看到就只有libspace.o
    }

    RW_IRAM2 0x40000400 0x00006C00         ;堆区和栈区,27K
    { 
       Startup.o (HEAP)                    ;堆区6k
       Startup.o (STACK)                ;用户栈16k,IRQ栈4k
    }
}这样是因为我不知道libspace.o都干了些什么,猜测main环境的一些参数,比如当前堆区占空情况等都记录在这块内.将这个项目文件先烧进片内
步骤2:
假设出厂时程序在低区,项目中startup.c,targert.c和main.c和上面的程序完全相同,存储配置
LR_IROM1 0x00000000 0x00010000        ; load region size_region
{   
    ER_IROM1 0x00000000 0x00001000      ; load address = execution address
    {  
       Startup.o (RESET, +First)
       Startup.o (+RO)
       target.o (+RO)
       main.o (+RO)
       *(InRoot$$Sections)
    }
}

LR_IROM_L 0x00008000 0x00018000        ; load region size_region
{   
    ER_IROM2 0x00008000 0x00018000      ; load address = execution address
    {  
       User.o (+RO)
      .ANY (+RO)
    }
}

LR_IRAM1 0x40000000 0x00006400 
{
    RW_IRAM1 0x40000000 0x00000400      ; RW data       1K系统变量
    {  
       .ANY (+RW +ZI)
    }

    RW_IRAM2 0x40000400 0x00006C00         ;堆区和栈区,27K
    { 
       Startup.o (HEAP)                    ;堆区6k
       Startup.o (STACK)                ;用户栈16k,IRQ栈4k
    }
}
然后在程序中,将所有用到的全局或者静态变量,都以绝对地址的方式映射到未分配的空间去.并保证user里的代码,不和statuo.o,target.o.,main.o里的任何代码发生引用.然后将bin文件从0x8000,切割到0x20000,将这几个扇区的数据烧写进已经烧了最上面程序的片子上.
更新时,将新的项目烧写文件从0x20000切割出来,擦写进对应位置,别的扇区不动.后续再更新的话,则高低区不断切换擦写,扇区0一直维持不变
有人做过和我类似需求的东西么?是怎么解决的?我这么做,原理上行得通么?

相关帖子

沙发
云痕|  楼主 | 2008-10-21 10:19 | 只看该作者

没人理会

没人理会,继续慢慢找资料了

使用特权

评论回复
板凳
农民讲习所| | 2008-10-21 10:35 | 只看该作者

最好不要这样

因为可能使用了公共函数。

使用特权

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

本版积分规则

28

主题

75

帖子

0

粉丝