查看: 6736|回复: 9

[其他] 关于飞思卡尔串口升级问题 急~!

[复制链接]

该用户从未签到

7

主题

25

帖子

0

注册会员

Rank: 2

积分
126
最后登录
2021-4-8
发表于 2010-4-29 20:24:09 | 显示全部楼层 |阅读模式
现在用飞思52258单片机,制作的串口升级程序。其中bootloader程序与正常的程序在一个工程下做的,现在制作的串口升级程序,可以重新对非bootloader段进行编程,但如果程序有大改动(实验时,随意屏蔽一段程序后,进行编译,)之后用串口升级,升级后,程序自动启动时,有一些东西显示有错误,触摸屏也不好用了;如果手动关机重新启动,则机器无法启动(注:如果直接烧写程序,则机器一点问题都没有)。暂时发现的原因,对比前后的S19文件,bootloader程序在改动后也被重新编译了。1、如何能让bootloader只编译一次?2、如果没有方法实现让bootloader只编译一次的话,还有没有什么方法解决串口升级的办法?急~~~!
我知道答案 目前已有8人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2010-4-30 09:06:27 | 显示全部楼层

    RE:关于飞思卡尔串口升级问题 急~!

    我认为比较好的解决方法:
    外扩一片FLASH,主MCU主要负责BOOTLOADER程序,更新只会更新外扩的FLASH程序。
    该会员没有填写今日想说内容.

    该用户从未签到

    7

    主题

    25

    帖子

    0

    注册会员

    Rank: 2

    积分
    126
    最后登录
    2021-4-8
     楼主| 发表于 2010-4-30 09:45:02 | 显示全部楼层

    回复:关于飞思卡尔串口升级问题 急~!

    回复第 2 楼 安 于2010-04-30 01:06:27发表:
    我认为比较好的解决方法:
    外扩一片FLASH,主MCU主要负责BOOTLOADER程序,更新只会更新外扩的FLASH程序。 

    我们的硬件已经固定为只有一个522585的模式,
    但理论上应该是可以做到的。。。不知何解啊!

    该用户从未签到

    7

    主题

    25

    帖子

    0

    注册会员

    Rank: 2

    积分
    126
    最后登录
    2021-4-8
     楼主| 发表于 2010-4-30 15:21:55 | 显示全部楼层

    RE:关于飞思卡尔串口升级问题 急~!

    我们的硬件已经固定为只有一个52258,
    我个人认为,芯片的自我升级自己是没有问题的(理论上)
    现在将主程序与bootloader独立出来,做出两个工程,现在冲突的地方是在升级过程中,bootloader将非bootloder段全都擦除掉,因此Bootloder的中断相量类的东西就会换成主程序的中断相量,结果倒致bootloader显示不正常,庆幸的是串口及相应运算处理的程序没有问题。
    主程序出现的毛病是屏幕没显示,触摸屏不好使等,涉及重要参数的都不太正常(如果将程序单独烧制到芯片中,程序一切正常)
    我暂时没看过飞思卡尔的关于INTERNAL_FLASH.lcf文件的说明类文章,对于它的修改,完全是经验和感觉。不知道哪位高人有关于这个文件的文章。
    描述的可能有些乱,如果哪位高人弄过这个东西,请给我发邮件liangziang@126.com。急~!
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2010-4-30 17:14:56 | 显示全部楼层

    RE:关于飞思卡尔串口升级问题 急~!

    你好,我没有搞过飞思卡尔的FLASH程序代码。
    1、如果把bootloader和程序放在一起肯定是会将bootloader的地址改变。
    2、建议使用外扩flash,作为程序存放。
    3、就是你说的分2个工程,将bootloader放入模块flash,但是你的程序不能占用该块,每次升级将起始地址该为该bootloader的地址。等程序烧写完毕以后,将开始地址修改为当前系统的地址。
    该会员没有填写今日想说内容.

    该用户从未签到

    7

    主题

    25

    帖子

    0

    注册会员

    Rank: 2

    积分
    126
    最后登录
    2021-4-8
     楼主| 发表于 2010-5-4 08:12:27 | 显示全部楼层

    回复:关于飞思卡尔串口升级问题 急~!

    回复第 5 楼 安 于2010-04-30 09:14:56发表:
    你好,我没有搞过飞思卡尔的FLASH程序代码。
    1、如果把bootloader和程序放在一起肯定是会将bootloader的地址改变。
    2、建议使用外扩flash,作为程序存放。
    3、就是你说的分2个工程,将bootloader放入模块flash,但是你的程序不能占用该块,每次升级将起始地址该为该bootloader的地址。等程序烧写完毕以后,将开始地址修改为当前系统的地址。
     
    ------------------------------------------------------------------------------------------
       bootcode    (RX) : ORIGIN = 0x00002200, LENGTH = 0x0000AE00
      code        (RWX) : ORIGIN = 0x00010010, LENGTH = 0x0005FFF0
    两个工程出现的问题:由于烧写bootloader的地址从2200到FFFF,因此,其它段的数据都是主程序的地址,这样就是开始先执行的是主程序,我将它跳至bootloader的main函数地址,执行完bootloader后,再跳回主程序的main函数地址。
    虽然两个程序完全独立,但还是有影响,bootloader显示功能不正常,code段程序(主程序)显示也有问题,并且有一些数组的查找有错误(例:根据某个计算结果,去提取相应数组的某个元素,就提取出错。注:主程序直接烧录至芯片功能完全正常),应该是某个地方的地址映射搞混了。但不知道如何修改!
    附1:bootloader的INTERNAL_FLASH.lcf
    KEEP_SECTION { .vectortable }
    KEEP_SECTION { .cfmconfig }
    MEMORY {
      interrupts  (RWX): ORIGIN = 0x00000000, LENGTH = 0x00000300
      bootcode    (RX) : ORIGIN = 0x00002200, LENGTH = 0x0000AE00
      code        (RWX): ORIGIN = 0x00010010, LENGTH = 0x0005FFF0
      romdata     (RWX): ORIGIN = 0x0000D000, LENGTH = 0x00003000
      vectorram   (RWX): ORIGIN = 0x20000000, LENGTH = 0x00000400
      data        (RW) : ORIGIN = 0x20000400, LENGTH = 0x0000f800
      cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000020
      ipsbar      (RW) : ORIGIN = 0x40000000, LENGTH = 0x0
     
    }
    SECTIONS {
      # Heap and Stack sizes definition
      ___heap_size = 0x0400;
      ___stack_size = 0x0400;
      .ipsbar   : {} > ipsbar
      .interrupts :
      {
        ___VECTOR_RAM = .;
        * (.vectortable)
        . = ALIGN (0x4);
      } > interrupts
      .cfmprotect :
      {
        *(.cfmconfig)
        . = ALIGN (0x4);
      } > cfmprotrom
     
      .bootcode:
     {
      H500.c (.text)
      H500.c (.rodata)
      Bootloader.c (.text)
      Bootloader.c (.rodata)
      ParseS19.c   (.text)
      ParseS19.c   (.rodata)
      
      Cpu.c   (.text)
         startcf.c   (.text)
      C_4i_CF_Runtime.a(.text)
      C_4i_CF_SZ_MSL.a(.text)
      . = ALIGN (0x4);
      } > bootcode
      .romdata:
      {
        ___ROM_AT = .; 
      } > romdata
     
      .text :
      {
     
        * (.text)
        . = ALIGN(0x4);
        * (.rodata)
        . = ALIGN(0x4);
      } > code
      .data : AT(___ROM_AT)
      {
        ___DATA_RAM = .;
        * (.exception)
        . = ALIGN(0x4);
        __exception_table_start__ = .;
        EXCEPTION
        __exception_table_end__   = .;
        ___sinit__ = .;
          STATICINIT
        ___DATA_START =.;
        * (.data)
        . = ALIGN (0x4);
        ___DATA_END   =.;
        __SDATA_START =.;
        * (.sdata)
        . = ALIGN (0x4);
        __SDATA_END = .;
        __SDA_BASE = .;
        . = ALIGN(0x4);
      } > data
      .bss :
      {
        __START_SBSS = .;
        * (.sbss)
        *(SCOMMON)
        __END_SBSS = .;
        __START_BSS = .;
        * (.bss)
        * (COMMON)
        __END_BSS = .;
        . = ALIGN(0x4);
      } >> data
      # 64 Kbytes Internal SRAM
      ___RAMBAR = 0x20000000;
      ___RAMBAR_SIZE = 0x00010000;
      # 512 KByte Internal Flash Memory
      ___FLASH_ADDRESS = 0x00000000;
      ___FLASH_SIZE = 0x00080000;
      ___IPSBAR = ADDR(.ipsbar);
      ___SP_AFTER_RESET = ___RAMBAR + ___RAMBAR_SIZE - 4;
      ___HEAP_START = .;
      ___HEAP_END = ___HEAP_START + ___heap_size;
      ___SP_END = ___HEAP_END;
      ___SP_INIT = ___SP_END + ___stack_size;
      ___heap_addr = ___HEAP_START;
      ___heap_size = ___HEAP_END -  ___HEAP_START;
      __SP_INIT = ___SP_INIT;
      _romp_at = ___ROM_AT+SIZEOF(.data);
      .romp : AT(_romp_at)
      {
        __S_romp = _romp_at;
        WRITEW(___ROM_AT);
        WRITEW(ADDR(.data));
        WRITEW(SIZEOF(.data));
        WRITEW(0);
        WRITEW(0);
        WRITEW(0);
      }
    }
     ------------------------------------------------------------------------------------------
    附2:主程序的INTERNAL_FLASH.lcf
    KEEP_SECTION { .vectortable }
    KEEP_SECTION { .cfmconfig }
    MEMORY {
      interrupts  (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
      code        (RX) : ORIGIN = 0x00010010, LENGTH = 0x0006FFF0
      data        (RW) : ORIGIN = 0x20000000, LENGTH = 0x00010000
      cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000020
      ipsbar      (RW) : ORIGIN = 0x40000000, LENGTH = 0x0
    }
    SECTIONS {
      # Heap and Stack sizes definition
      ___heap_size = 0x0400;
      ___stack_size = 0x0400;
      .ipsbar   : {} > ipsbar
      .interrupts :
      {
        ___VECTOR_RAM = .;
        * (.vectortable)
        . = ALIGN (0x4);
      } > interrupts
      .cfmprotect :
      {
        *(.cfmconfig)
        . = ALIGN (0x4);
      } > cfmprotrom
      .text :
      {
        * (.text)
        . = ALIGN(0x4);
        * (.rodata)
        . = ALIGN(0x4);
        ___ROM_AT = .;
        ___DATA_ROM = .;
      } > code
      .data : AT(___ROM_AT)
      {
        ___DATA_RAM = .;
        * (.exception)
        . = ALIGN(0x4);
        __exception_table_start__ = .;
        EXCEPTION
        __exception_table_end__   = .;
        ___sinit__ = .;
          STATICINIT
        ___DATA_START =.;
        * (.data)
        . = ALIGN (0x4);
        ___DATA_END   =.;
        __SDATA_START =.;
        * (.sdata)
        . = ALIGN (0x4);
        __SDATA_END = .;
        __SDA_BASE = .;
        . = ALIGN(0x4);
      } > data
      .bss :
      {
        __START_SBSS = .;
        * (.sbss)
        *(SCOMMON)
        __END_SBSS = .;
        __START_BSS = .;
        * (.bss)
        * (COMMON)
        __END_BSS = .;
        . = ALIGN(0x4);
      } >> data
      # 64 Kbytes Internal SRAM
      ___RAMBAR = 0x20000000;
      ___RAMBAR_SIZE = 0x00010000;
      # 512 KByte Internal Flash Memory
      ___FLASH_ADDRESS = 0x00000000;
      ___FLASH_SIZE = 0x00080000;
      ___IPSBAR = ADDR(.ipsbar);
      ___SP_AFTER_RESET = ___RAMBAR + ___RAMBAR_SIZE - 4;
      ___HEAP_START = .;
      ___HEAP_END = ___HEAP_START + ___heap_size;
      ___SP_END = ___HEAP_END;
      ___SP_INIT = ___SP_END + ___stack_size;
      ___heap_addr = ___HEAP_START;
      ___heap_size = ___HEAP_END -  ___HEAP_START;
      __SP_INIT = ___SP_INIT;
      _romp_at = ___ROM_AT + SIZEOF(.data);
      .romp : AT(_romp_at)
      {
        __S_romp = _romp_at;
        WRITEW(___ROM_AT);
        WRITEW(ADDR(.data));
        WRITEW(SIZEOF(.data));
        WRITEW(0);
        WRITEW(0);
        WRITEW(0);
      }
    }
     
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2010-5-4 10:00:06 | 显示全部楼层

    RE:关于飞思卡尔串口升级问题 急~!

    问题可能原因:
    1、boot和code的CONST 或者其他的数组可能重复使用,建议查看一下数组是否有该问题;
    2、两者程序之间是否有公用的数据。
    该会员没有填写今日想说内容.

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    0
    最后登录
    1970-1-1
    发表于 2010-5-4 14:59:28 | 显示全部楼层

    RE:关于飞思卡尔串口升级问题 急~!

    帮顶~嘿嘿~飞思卡尔芯片的资料太少了……

    该用户从未签到

    2

    主题

    14

    帖子

    0

    新手上路

    Rank: 1

    积分
    35
    最后登录
    1970-1-1
    发表于 2010-7-12 14:12:33 | 显示全部楼层

    回复:关于飞思卡尔串口升级问题 急~!

    回复第 6 楼 liangziang于2010-05-04 00:12:27发表:
    回复第 5 楼 安 于2010-04-30 09:14:56发表:
    你好,我没有搞过飞思卡尔的FLASH程序代码。
    1、如果把bootloader和程序放在一起肯定是会将bootloader的地址改变。
    2、建议使用外扩flash,作为程序存放。
    3、就是你说的分2个工程,将bootloader放入模块flash,但是你的程序不能占用该块,每次升级将起始地址该为该bootloader的地址。等程序烧写完毕以后,将开始地址修改为当前系统的地址。
     
    ------------------------------------------------------------------------------------------
       bootcode    (RX) : ORIGIN = 0x00002200, LENGTH = 0x0000AE00
      code        (RWX) : ORIGIN = 0x00010010, LENGTH = 0x0005FFF0
    两个工程出现的问题:由于烧写bootloader的地址从2200到FFFF,因此,其它段的数据都是主程序的地址,这样就是开始先执行的是主程序,我将它跳至bootloader的main函数地址,执行完bootloader后,再跳回主程序的main函数地址。
    虽然两个程序完全独立,但还是有影响,bootloader显示功能不正常,code段程序(主程序)显示也有问题,并且有一些数组的查找有错误(例:根据某个计算结果,去提取相应数组的某个元素,就提取出错。注:主程序直接烧录至芯片功能完全正常),应该是某个地方的地址映射搞混了。但不知道如何修改!
    附1:bootloader的INTERNAL_FLASH.lcf
    KEEP_SECTION { .vectortable }
    KEEP_SECTION { .cfmconfig }
    MEMORY {
      interrupts  (RWX): ORIGIN = 0x00000000, LENGTH = 0x00000300
      bootcode    (RX) : ORIGIN = 0x00002200, LENGTH = 0x0000AE00
      code        (RWX): ORIGIN = 0x00010010, LENGTH = 0x0005FFF0
      romdata     (RWX): ORIGIN = 0x0000D000, LENGTH = 0x00003000
      vectorram   (RWX): ORIGIN = 0x20000000, LENGTH = 0x00000400
      data        (RW) : ORIGIN = 0x20000400, LENGTH = 0x0000f800
      cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000020
      ipsbar      (RW) : ORIGIN = 0x40000000, LENGTH = 0x0
     
    }
    SECTIONS {
      # Heap and Stack sizes definition
      ___heap_size = 0x0400;
      ___stack_size = 0x0400;
      .ipsbar   : {} > ipsbar
      .interrupts :
      {
        ___VECTOR_RAM = .;
        * (.vectortable)
        . = ALIGN (0x4);
      } > interrupts
      .cfmprotect :
      {
        *(.cfmconfig)
        . = ALIGN (0x4);
      } > cfmprotrom
     
      .bootcode:
     {
      H500.c (.text)
      H500.c (.rodata)
      Bootloader.c (.text)
      Bootloader.c (.rodata)
      ParseS19.c   (.text)
      ParseS19.c   (.rodata)
      
      Cpu.c   (.text)
         startcf.c   (.text)
      C_4i_CF_Runtime.a(.text)
      C_4i_CF_SZ_MSL.a(.text)
      . = ALIGN (0x4);
      } > bootcode
      .romdata:
      {
        ___ROM_AT = .; 
      } > romdata
     
      .text :
      {
     
        * (.text)
        . = ALIGN(0x4);
        * (.rodata)
        . = ALIGN(0x4);
      } > code
      .data : AT(___ROM_AT)
      {
        ___DATA_RAM = .;
        * (.exception)
        . = ALIGN(0x4);
        __exception_table_start__ = .;
        EXCEPTION
        __exception_table_end__   = .;
        ___sinit__ = .;
          STATICINIT
        ___DATA_START =.;
        * (.data)
        . = ALIGN (0x4);
        ___DATA_END   =.;
        __SDATA_START =.;
        * (.sdata)
        . = ALIGN (0x4);
        __SDATA_END = .;
        __SDA_BASE = .;
        . = ALIGN(0x4);
      } > data
      .bss :
      {
        __START_SBSS = .;
        * (.sbss)
        *(SCOMMON)
        __END_SBSS = .;
        __START_BSS = .;
        * (.bss)
        * (COMMON)
        __END_BSS = .;
        . = ALIGN(0x4);
      } >> data
      # 64 Kbytes Internal SRAM
      ___RAMBAR = 0x20000000;
      ___RAMBAR_SIZE = 0x00010000;
      # 512 KByte Internal Flash Memory
      ___FLASH_ADDRESS = 0x00000000;
      ___FLASH_SIZE = 0x00080000;
      ___IPSBAR = ADDR(.ipsbar);
      ___SP_AFTER_RESET = ___RAMBAR + ___RAMBAR_SIZE - 4;
      ___HEAP_START = .;
      ___HEAP_END = ___HEAP_START + ___heap_size;
      ___SP_END = ___HEAP_END;
      ___SP_INIT = ___SP_END + ___stack_size;
      ___heap_addr = ___HEAP_START;
      ___heap_size = ___HEAP_END -  ___HEAP_START;
      __SP_INIT = ___SP_INIT;
      _romp_at = ___ROM_AT+SIZEOF(.data);
      .romp : AT(_romp_at)
      {
        __S_romp = _romp_at;
        WRITEW(___ROM_AT);
        WRITEW(ADDR(.data));
        WRITEW(SIZEOF(.data));
        WRITEW(0);
        WRITEW(0);
        WRITEW(0);
      }
    }
     ------------------------------------------------------------------------------------------
    附2:主程序的INTERNAL_FLASH.lcf
    KEEP_SECTION { .vectortable }
    KEEP_SECTION { .cfmconfig }
    MEMORY {
      interrupts  (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
      code        (RX) : ORIGIN = 0x00010010, LENGTH = 0x0006FFF0
      data        (RW) : ORIGIN = 0x20000000, LENGTH = 0x00010000
      cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000020
      ipsbar      (RW) : ORIGIN = 0x40000000, LENGTH = 0x0
    }
    SECTIONS {
      # Heap and Stack sizes definition
      ___heap_size = 0x0400;
      ___stack_size = 0x0400;
      .ipsbar   : {} > ipsbar
      .interrupts :
      {
        ___VECTOR_RAM = .;
        * (.vectortable)
        . = ALIGN (0x4);
      } > interrupts
      .cfmprotect :
      {
        *(.cfmconfig)
        . = ALIGN (0x4);
      } > cfmprotrom
      .text :
      {
        * (.text)
        . = ALIGN(0x4);
        * (.rodata)
        . = ALIGN(0x4);
        ___ROM_AT = .;
        ___DATA_ROM = .;
      } > code
      .data : AT(___ROM_AT)
      {
        ___DATA_RAM = .;
        * (.exception)
        . = ALIGN(0x4);
        __exception_table_start__ = .;
        EXCEPTION
        __exception_table_end__   = .;
        ___sinit__ = .;
          STATICINIT
        ___DATA_START =.;
        * (.data)
        . = ALIGN (0x4);
        ___DATA_END   =.;
        __SDATA_START =.;
        * (.sdata)
        . = ALIGN (0x4);
        __SDATA_END = .;
        __SDA_BASE = .;
        . = ALIGN(0x4);
      } > data
      .bss :
      {
        __START_SBSS = .;
        * (.sbss)
        *(SCOMMON)
        __END_SBSS = .;
        __START_BSS = .;
        * (.bss)
        * (COMMON)
        __END_BSS = .;
        . = ALIGN(0x4);
      } >> data
      # 64 Kbytes Internal SRAM
      ___RAMBAR = 0x20000000;
      ___RAMBAR_SIZE = 0x00010000;
      # 512 KByte Internal Flash Memory
      ___FLASH_ADDRESS = 0x00000000;
      ___FLASH_SIZE = 0x00080000;
      ___IPSBAR = ADDR(.ipsbar);
      ___SP_AFTER_RESET = ___RAMBAR + ___RAMBAR_SIZE - 4;
      ___HEAP_START = .;
      ___HEAP_END = ___HEAP_START + ___heap_size;
      ___SP_END = ___HEAP_END;
      ___SP_INIT = ___SP_END + ___stack_size;
      ___heap_addr = ___HEAP_START;
      ___heap_size = ___HEAP_END -  ___HEAP_START;
      __SP_INIT = ___SP_INIT;
      _romp_at = ___ROM_AT + SIZEOF(.data);
      .romp : AT(_romp_at)
      {
        __S_romp = _romp_at;
        WRITEW(___ROM_AT);
        WRITEW(ADDR(.data));
        WRITEW(SIZEOF(.data));
        WRITEW(0);
        WRITEW(0);
        WRITEW(0);
      }
    }
     
     

    在一个工程里面实现完全没问题的,关键是要把存储空间都区分好,最保险的就是让boot和app都有自己的vetcor、code、bss、data等,另外boot和app绝对不能有耦合,即相互的调用,我感觉你是相互调用了。
    这种方法我已经实现了,而且应用在一款产品上,运行良好,所以理论上是绝对可行的。

    该用户从未签到

    2

    主题

    14

    帖子

    0

    新手上路

    Rank: 1

    积分
    35
    最后登录
    1970-1-1
    发表于 2010-7-12 14:13:47 | 显示全部楼层

    回复:关于飞思卡尔串口升级问题 急~!

    回复第 9 楼 fishandbear于2010-07-12 06:12:33发表:
    回复第 6 楼 liangziang于2010-05-04 00:12:27发表:
    回复第 5 楼 安 于2010-04-30 09:14:56发表:
    你好,我没有搞过飞思卡尔的FLASH程序代码。
    1、如果把bootloader和程序放在一起肯定是会将bootloader的地址改变。
    2、建议使用外扩flash,作为程序存放。
    3、就是你说的分2个工程,将bootloader放入模块flash,但是你的程序不能占用该块,每次升级将起始地址该为该bootloader的地址。等程序烧写完毕以后,将开始地址修改为当前系统的地址。
     
    ------------------------------------------------------------------------------------------
       bootcode    (RX) : ORIGIN = 0x00002200, LENGTH = 0x0000AE00
      code        (RWX) : ORIGIN = 0x00010010, LENGTH = 0x0005FFF0
    两个工程出现的问题:由于烧写bootloader的地址从2200到FFFF,因此,其它段的数据都是主程序的地址,这样就是开始先执行的是主程序,我将它跳至bootloader的main函数地址,执行完bootloader后,再跳回主程序的main函数地址。
    虽然两个程序完全独立,但还是有影响,bootloader显示功能不正常,code段程序(主程序)显示也有问题,并且有一些数组的查找有错误(例:根据某个计算结果,去提取相应数组的某个元素,就提取出错。注:主程序直接烧录至芯片功能完全正常),应该是某个地方的地址映射搞混了。但不知道如何修改!
    附1:bootloader的INTERNAL_FLASH.lcf
    KEEP_SECTION { .vectortable }
    KEEP_SECTION { .cfmconfig }
    MEMORY {
      interrupts  (RWX): ORIGIN = 0x00000000, LENGTH = 0x00000300
      bootcode    (RX) : ORIGIN = 0x00002200, LENGTH = 0x0000AE00
      code        (RWX): ORIGIN = 0x00010010, LENGTH = 0x0005FFF0
      romdata     (RWX): ORIGIN = 0x0000D000, LENGTH = 0x00003000
      vectorram   (RWX): ORIGIN = 0x20000000, LENGTH = 0x00000400
      data        (RW) : ORIGIN = 0x20000400, LENGTH = 0x0000f800
      cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000020
      ipsbar      (RW) : ORIGIN = 0x40000000, LENGTH = 0x0
     
    }
    SECTIONS {
      # Heap and Stack sizes definition
      ___heap_size = 0x0400;
      ___stack_size = 0x0400;
      .ipsbar   : {} > ipsbar
      .interrupts :
      {
        ___VECTOR_RAM = .;
        * (.vectortable)
        . = ALIGN (0x4);
      } > interrupts
      .cfmprotect :
      {
        *(.cfmconfig)
        . = ALIGN (0x4);
      } > cfmprotrom
     
      .bootcode:
     {
      H500.c (.text)
      H500.c (.rodata)
      Bootloader.c (.text)
      Bootloader.c (.rodata)
      ParseS19.c   (.text)
      ParseS19.c   (.rodata)
      
      Cpu.c   (.text)
         startcf.c   (.text)
      C_4i_CF_Runtime.a(.text)
      C_4i_CF_SZ_MSL.a(.text)
      . = ALIGN (0x4);
      } > bootcode
      .romdata:
      {
        ___ROM_AT = .; 
      } > romdata
     
      .text :
      {
     
        * (.text)
        . = ALIGN(0x4);
        * (.rodata)
        . = ALIGN(0x4);
      } > code
      .data : AT(___ROM_AT)
      {
        ___DATA_RAM = .;
        * (.exception)
        . = ALIGN(0x4);
        __exception_table_start__ = .;
        EXCEPTION
        __exception_table_end__   = .;
        ___sinit__ = .;
          STATICINIT
        ___DATA_START =.;
        * (.data)
        . = ALIGN (0x4);
        ___DATA_END   =.;
        __SDATA_START =.;
        * (.sdata)
        . = ALIGN (0x4);
        __SDATA_END = .;
        __SDA_BASE = .;
        . = ALIGN(0x4);
      } > data
      .bss :
      {
        __START_SBSS = .;
        * (.sbss)
        *(SCOMMON)
        __END_SBSS = .;
        __START_BSS = .;
        * (.bss)
        * (COMMON)
        __END_BSS = .;
        . = ALIGN(0x4);
      } >> data
      # 64 Kbytes Internal SRAM
      ___RAMBAR = 0x20000000;
      ___RAMBAR_SIZE = 0x00010000;
      # 512 KByte Internal Flash Memory
      ___FLASH_ADDRESS = 0x00000000;
      ___FLASH_SIZE = 0x00080000;
      ___IPSBAR = ADDR(.ipsbar);
      ___SP_AFTER_RESET = ___RAMBAR + ___RAMBAR_SIZE - 4;
      ___HEAP_START = .;
      ___HEAP_END = ___HEAP_START + ___heap_size;
      ___SP_END = ___HEAP_END;
      ___SP_INIT = ___SP_END + ___stack_size;
      ___heap_addr = ___HEAP_START;
      ___heap_size = ___HEAP_END -  ___HEAP_START;
      __SP_INIT = ___SP_INIT;
      _romp_at = ___ROM_AT+SIZEOF(.data);
      .romp : AT(_romp_at)
      {
        __S_romp = _romp_at;
        WRITEW(___ROM_AT);
        WRITEW(ADDR(.data));
        WRITEW(SIZEOF(.data));
        WRITEW(0);
        WRITEW(0);
        WRITEW(0);
      }
    }
     ------------------------------------------------------------------------------------------
    附2:主程序的INTERNAL_FLASH.lcf
    KEEP_SECTION { .vectortable }
    KEEP_SECTION { .cfmconfig }
    MEMORY {
      interrupts  (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
      code        (RX) : ORIGIN = 0x00010010, LENGTH = 0x0006FFF0
      data        (RW) : ORIGIN = 0x20000000, LENGTH = 0x00010000
      cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000020
      ipsbar      (RW) : ORIGIN = 0x40000000, LENGTH = 0x0
    }
    SECTIONS {
      # Heap and Stack sizes definition
      ___heap_size = 0x0400;
      ___stack_size = 0x0400;
      .ipsbar   : {} > ipsbar
      .interrupts :
      {
        ___VECTOR_RAM = .;
        * (.vectortable)
        . = ALIGN (0x4);
      } > interrupts
      .cfmprotect :
      {
        *(.cfmconfig)
        . = ALIGN (0x4);
      } > cfmprotrom
      .text :
      {
        * (.text)
        . = ALIGN(0x4);
        * (.rodata)
        . = ALIGN(0x4);
        ___ROM_AT = .;
        ___DATA_ROM = .;
      } > code
      .data : AT(___ROM_AT)
      {
        ___DATA_RAM = .;
        * (.exception)
        . = ALIGN(0x4);
        __exception_table_start__ = .;
        EXCEPTION
        __exception_table_end__   = .;
        ___sinit__ = .;
          STATICINIT
        ___DATA_START =.;
        * (.data)
        . = ALIGN (0x4);
        ___DATA_END   =.;
        __SDATA_START =.;
        * (.sdata)
        . = ALIGN (0x4);
        __SDATA_END = .;
        __SDA_BASE = .;
        . = ALIGN(0x4);
      } > data
      .bss :
      {
        __START_SBSS = .;
        * (.sbss)
        *(SCOMMON)
        __END_SBSS = .;
        __START_BSS = .;
        * (.bss)
        * (COMMON)
        __END_BSS = .;
        . = ALIGN(0x4);
      } >> data
      # 64 Kbytes Internal SRAM
      ___RAMBAR = 0x20000000;
      ___RAMBAR_SIZE = 0x00010000;
      # 512 KByte Internal Flash Memory
      ___FLASH_ADDRESS = 0x00000000;
      ___FLASH_SIZE = 0x00080000;
      ___IPSBAR = ADDR(.ipsbar);
      ___SP_AFTER_RESET = ___RAMBAR + ___RAMBAR_SIZE - 4;
      ___HEAP_START = .;
      ___HEAP_END = ___HEAP_START + ___heap_size;
      ___SP_END = ___HEAP_END;
      ___SP_INIT = ___SP_END + ___stack_size;
      ___heap_addr = ___HEAP_START;
      ___heap_size = ___HEAP_END -  ___HEAP_START;
      __SP_INIT = ___SP_INIT;
      _romp_at = ___ROM_AT + SIZEOF(.data);
      .romp : AT(_romp_at)
      {
        __S_romp = _romp_at;
        WRITEW(___ROM_AT);
        WRITEW(ADDR(.data));
        WRITEW(SIZEOF(.data));
        WRITEW(0);
        WRITEW(0);
        WRITEW(0);
      }
    }
     
     

    在一个工程里面实现完全没问题的,关键是要把存储空间都区分好,最保险的就是让boot和app都有自己的vetcor、code、bss、data等,另外boot和app绝对不能有耦合,即相互的调用,我感觉你是相互调用了。
    这种方法我已经实现了,而且应用在一款产品上,运行良好,所以理论上是绝对可行的。
     

    我是用在MCF52259上,应该跟你用的52258没什么区别。
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 20:29 , Processed in 0.109108 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表