楼主: wuyufeng-276292

关于MC9S08DZ60通过CAN总线升级程序的思路框架

[复制链接]

该用户从未签到

6

主题

38

帖子

0

新手上路

Rank: 1

积分
54
最后登录
1970-1-1
发表于 2012-10-18 16:57:24 | 显示全部楼层

回复:关于MC9S08DZ60通过CAN总线升级程序的思路框架

回复第 10 楼 于2012-10-18 08:45:06发表:
1、这段代码是保存在ROM,也就是FLASH中。只有在调用的时候才会将他COPY到RAM中执行,所以FLASH中存在该段CODE。
2、理解上面的意思,就明白了,该段代码不会丢失。 

谢谢,我通过看S19文件 验证了你的说法! 
Thank
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

38

帖子

0

新手上路

Rank: 1

积分
54
最后登录
1970-1-1
发表于 2012-10-18 17:25:40 | 显示全部楼层

回复:关于MC9S08DZ60通过CAN总线升级程序的思路框架

回复第 11 楼 于2012-10-18 16:57:24发表:
回复第 10 楼 于2012-10-18 08:45:06发表:
1、这段代码是保存在ROM,也就是FLASH中。只有在调用的时候才会将他COPY到RAM中执行,所以FLASH中存在该段CODE。
2、理解上面的意思,就明白了,该段代码不会丢失。 

谢谢,我通过看S19文件 验证了你的说法! 
Thank
 

你好,我用如下方式能完成Code 在调用的时候将他COPY到RAM中执行吗??
BOOT_CODE  = READ_ONLY     0xF000 TO   0xF9FF RELOCATE_TO 0x3400;
 
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

38

帖子

0

新手上路

Rank: 1

积分
54
最后登录
1970-1-1
发表于 2012-10-18 17:32:43 | 显示全部楼层

回复:关于MC9S08DZ60通过CAN总线升级程序的思路框架

回复第 10 楼 于2012-10-18 08:45:06发表:
1、这段代码是保存在ROM,也就是FLASH中。只有在调用的时候才会将他COPY到RAM中执行,所以FLASH中存在该段CODE。
2、理解上面的意思,就明白了,该段代码不会丢失。
你好,我还有一种想法 在进入main之前,将我BOOTLOAD在Flash中的CODE调用一个拷贝函数拷贝到RAM中 不是很清楚当调用的时候是执行flash中的  还是执行RAM中的?  请指教!!
  谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

45

帖子

0

新手上路

Rank: 1

积分
111
最后登录
1970-1-1
发表于 2012-10-19 14:33:00 | 显示全部楼层

回复:关于MC9S08DZ60通过CAN总线升级程序的思路框架

回复第 12 楼 于2012-10-18 17:25:40发表:
回复第 11 楼 于2012-10-18 16:57:24发表:
回复第 10 楼 于2012-10-18 08:45:06发表:
1、这段代码是保存在ROM,也就是FLASH中。只有在调用的时候才会将他COPY到RAM中执行,所以FLASH中存在该段CODE。
2、理解上面的意思,就明白了,该段代码不会丢失。 

谢谢,我通过看S19文件 验证了你的说法! 
Thank
 

你好,我用如下方式能完成Code 在调用的时候将他COPY到RAM中执行吗??
BOOT_CODE  = READ_ONLY     0xF000 TO   0xF9FF RELOCATE_TO 0x3400;
 
 

我之前做过一个类似的,RELOCATE_TO 是地址重定位,prm文件里应该这样设置, 但还应在主函数里的擦除前加上拷贝代码函数,函数及涉及到的宏如下
#define __SEG_START_REF(a)  __SEG_START_ ## a
#define __SEG_END_REF(a)    __SEG_END_ ## a
#define __SEG_SIZE_REF(a)   __SEG_SIZE_ ## a
#define __SEG_START_DEF(a)  extern signed char __SEG_START_REF (a) []
#define __SEG_END_DEF(a)    extern signed char __SEG_END_REF   (a) []
#define __SEG_SIZE_DEF(a)   extern signed char __SEG_SIZE_REF  (a) []
__SEG_START_DEF (RAM_CODE);
__SEG_END_DEF   (RAM_CODE);
__SEG_SIZE_DEF  (RAM_CODE);
static void CopyCodeToRAM(void)
{
  Uint8 *Src;
  Uint8 *Dst;
  Uint16  SegSize;
  Uint16  x;
 
  //RAM code resides in Flash from 0xfb00 - 0xfeff
  Src = (Uint8 *)__SEG_START_REF(RAM_CODE);
  //code will be copied to RAM at address 0x3D00
  Dst = (Uint8 *)0x3D00;
 
  SegSize = (Uint16)__SEG_SIZE_REF(RAM_CODE);
  for (x = 0; x < SegSize; x++)   //just copy a byte at a time
    *Dst++ = *Src++;
}
我这里RAM_CODE是要需要代码重定位的段名,我的prm这样定义:
SEGMENTS             
               
      RAM           = READ_WRITE    0x3900 TO   0x3CFF;     
      RAM_CODE_SEG  = READ_ONLY     0xFD00 TO   0xFEFF RELOCATE_TO 0x3D00;     
      ROM_F000      = READ_ONLY     0xF000 TO   0xFCFF;
 
END
PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
      ROM_VAR, 
      STRINGS, 
      DEFAULT_ROM,
      NON_BANKED      INTO  ROM_F000;
      DEFAULT_RAM     INTO  RAM;
      RAM_CODE        INTO  RAM_CODE_SEG;
END
回复 支持 反对

使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-10-19 15:31:02 | 显示全部楼层

    回复:关于MC9S08DZ60通过CAN总线升级程序的思路框架

    在执行FLASH操作的时候,会把FLASH代码拷贝到RAM中执行,是在RAM中执行。因为FLASH不支持自己对自己的操作。对于RAM的配置,根据你的需求,参考楼上那位朋友的代码即可。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    54
    最后登录
    1970-1-1
    发表于 2012-10-20 16:29:09 | 显示全部楼层

    回复:关于MC9S08DZ60通过CAN总线升级程序的思路框架

    回复第 15 楼 于2012-10-19 15:31:02发表:
    在执行FLASH操作的时候,会把FLASH代码拷贝到RAM中执行,是在RAM中执行。因为FLASH不支持自己对自己的操作。对于RAM的配置,根据你的需求,参考楼上那位朋友的代码即可。 

    你好, 
     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    54
    最后登录
    1970-1-1
    发表于 2012-10-20 17:11:22 | 显示全部楼层

    回复:关于MC9S08DZ60通过CAN总线升级程序的思路框架

    回复第 14 楼 于2012-10-19 14:33:00发表:
    回复第 12 楼 于2012-10-18 17:25:40发表:
    回复第 11 楼 于2012-10-18 16:57:24发表:
    回复第 10 楼 于2012-10-18 08:45:06发表:
    1、这段代码是保存在ROM,也就是FLASH中。只有在调用的时候才会将他COPY到RAM中执行,所以FLASH中存在该段CODE。
    2、理解上面的意思,就明白了,该段代码不会丢失。 

    谢谢,我通过看S19文件 验证了你的说法! 
    Thank
     

    你好,我用如下方式能完成Code 在调用的时候将他COPY到RAM中执行吗??
    BOOT_CODE  = READ_ONLY     0xF000 TO   0xF9FF RELOCATE_TO 0x3400;
     
     

    我之前做过一个类似的,RELOCATE_TO 是地址重定位,prm文件里应该这样设置, 但还应在主函数里的擦除前加上拷贝代码函数,函数及涉及到的宏如下
    #define __SEG_START_REF(a)  __SEG_START_ ## a
    #define __SEG_END_REF(a)    __SEG_END_ ## a
    #define __SEG_SIZE_REF(a)   __SEG_SIZE_ ## a
    #define __SEG_START_DEF(a)  extern signed char __SEG_START_REF (a) []
    #define __SEG_END_DEF(a)    extern signed char __SEG_END_REF   (a) []
    #define __SEG_SIZE_DEF(a)   extern signed char __SEG_SIZE_REF  (a) []
    __SEG_START_DEF (RAM_CODE);
    __SEG_END_DEF   (RAM_CODE);
    __SEG_SIZE_DEF  (RAM_CODE);
    static void CopyCodeToRAM(void)
    {
      Uint8 *Src;
      Uint8 *Dst;
      Uint16  SegSize;
      Uint16  x;
     
      //RAM code resides in Flash from 0xfb00 - 0xfeff
      Src = (Uint8 *)__SEG_START_REF(RAM_CODE);
      //code will be copied to RAM at address 0x3D00
      Dst = (Uint8 *)0x3D00;
     
      SegSize = (Uint16)__SEG_SIZE_REF(RAM_CODE);
      for (x = 0; x < SegSize; x++)   //just copy a byte at a time
        *Dst++ = *Src++;
    }
    我这里RAM_CODE是要需要代码重定位的段名,我的prm这样定义:
    SEGMENTS             
                   
          RAM           = READ_WRITE    0x3900 TO   0x3CFF;     
          RAM_CODE_SEG  = READ_ONLY     0xFD00 TO   0xFEFF RELOCATE_TO 0x3D00;     
          ROM_F000      = READ_ONLY     0xF000 TO   0xFCFF;
     
    END
    PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
          ROM_VAR, 
          STRINGS, 
          DEFAULT_ROM,
          NON_BANKED      INTO  ROM_F000;
          DEFAULT_RAM     INTO  RAM;
          RAM_CODE        INTO  RAM_CODE_SEG;
    END
     

    你好,
            我编写一简单代码,在没有加入  RELOCATE_TO 以前,代码能运行; 当加入RELOCATE_TO 后,代码不能运行;在启动函数中,main函数运行之前加入void CopyCodeToRAM(void)函数, 代码还是不能运行; 是CopycodeToRAM()函数添加的位置不对吗?
             还请指教。
             谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    45

    帖子

    0

    新手上路

    Rank: 1

    积分
    111
    最后登录
    1970-1-1
    发表于 2012-10-22 23:15:50 | 显示全部楼层

    回复:关于MC9S08DZ60通过CAN总线升级程序的思路框架

    回复第 17 楼 于2012-10-20 17:11:22发表:
    回复第 14 楼 于2012-10-19 14:33:00发表:
    回复第 12 楼 于2012-10-18 17:25:40发表:
    回复第 11 楼 于2012-10-18 16:57:24发表:
    回复第 10 楼 于2012-10-18 08:45:06发表:
    1、这段代码是保存在ROM,也就是FLASH中。只有在调用的时候才会将他COPY到RAM中执行,所以FLASH中存在该段CODE。
    2、理解上面的意思,就明白了,该段代码不会丢失。 

    谢谢,我通过看S19文件 验证了你的说法! 
    Thank
     

    你好,我用如下方式能完成Code 在调用的时候将他COPY到RAM中执行吗??
    BOOT_CODE  = READ_ONLY     0xF000 TO   0xF9FF RELOCATE_TO 0x3400;
     
     

    我之前做过一个类似的,RELOCATE_TO 是地址重定位,prm文件里应该这样设置, 但还应在主函数里的擦除前加上拷贝代码函数,函数及涉及到的宏如下
    #define __SEG_START_REF(a)  __SEG_START_ ## a
    #define __SEG_END_REF(a)    __SEG_END_ ## a
    #define __SEG_SIZE_REF(a)   __SEG_SIZE_ ## a
    #define __SEG_START_DEF(a)  extern signed char __SEG_START_REF (a) []
    #define __SEG_END_DEF(a)    extern signed char __SEG_END_REF   (a) []
    #define __SEG_SIZE_DEF(a)   extern signed char __SEG_SIZE_REF  (a) []
    __SEG_START_DEF (RAM_CODE);
    __SEG_END_DEF   (RAM_CODE);
    __SEG_SIZE_DEF  (RAM_CODE);
    static void CopyCodeToRAM(void)
    {
      Uint8 *Src;
      Uint8 *Dst;
      Uint16  SegSize;
      Uint16  x;
     
      //RAM code resides in Flash from 0xfb00 - 0xfeff
      Src = (Uint8 *)__SEG_START_REF(RAM_CODE);
      //code will be copied to RAM at address 0x3D00
      Dst = (Uint8 *)0x3D00;
     
      SegSize = (Uint16)__SEG_SIZE_REF(RAM_CODE);
      for (x = 0; x < SegSize; x++)   //just copy a byte at a time
        *Dst++ = *Src++;
    }
    我这里RAM_CODE是要需要代码重定位的段名,我的prm这样定义:
    SEGMENTS             
                   
          RAM           = READ_WRITE    0x3900 TO   0x3CFF;     
          RAM_CODE_SEG  = READ_ONLY     0xFD00 TO   0xFEFF RELOCATE_TO 0x3D00;     
          ROM_F000      = READ_ONLY     0xF000 TO   0xFCFF;
     
    END
    PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
          ROM_VAR, 
          STRINGS, 
          DEFAULT_ROM,
          NON_BANKED      INTO  ROM_F000;
          DEFAULT_RAM     INTO  RAM;
          RAM_CODE        INTO  RAM_CODE_SEG;
    END
     

    你好,
            我编写一简单代码,在没有加入  RELOCATE_TO 以前,代码能运行; 当加入RELOCATE_TO 后,代码不能运行;在启动函数中,main函数运行之前加入void CopyCodeToRAM(void)函数, 代码还是不能运行; 是CopycodeToRAM()函数添加的位置不对吗?
             还请指教。
             谢谢
     

    在main函数中初始化之后,传数据之前,调用CopyCodeToRAM(void)函数
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-10-23 10:24:39 | 显示全部楼层

    RE:关于MC9S08DZ60通过CAN总线升级程序的思路框架

    FLASH擦除命令只能是全部擦除或者擦除一片,而不能对P-FLASH和D-FLASH进行擦除,他们的擦除要用过自身的命令擦除。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    45

    帖子

    0

    新手上路

    Rank: 1

    积分
    111
    最后登录
    1970-1-1
    发表于 2012-10-23 10:57:50 | 显示全部楼层

    回复:关于MC9S08DZ60通过CAN总线升级程序的思路框架

    回复第 19 楼 于2012-10-23 10:24:39发表:
    FLASH擦除命令只能是全部擦除或者擦除一片,而不能对P-FLASH和D-FLASH进行擦除,他们的擦除要用过自身的命令擦除。 

    安:我现在做的bootloader程序,能下载程序,下载后能跳到应用程序执行,我的应用程序是简单的封装一个帧,8个字节发送,这个能正确执行。但我的这次我把应用程序改成中断接收,再把收到的该帧数据发送出去,bootloader下载的就是这个程序的S19文件,我在中断接收再发送前加了段测试代码, 就是发送一帧数据出去, 意思是就是说能正确跳入到应用程序,但是上面再往下面发送数据就收不到回复,即中断不能正确执行,我应用程序的向量基地址改了,跟bootloader不一样,应用程序的中断基地址是这样的const tIsrFunc _InterruptVectorTable[] @0xEF10,另外, 在mian()里加了一行代码 IVBR=0xEF;这样bootloader的入口地址是0xFFFE,而应用程序的入口地址是0xEFFE,我想请教安, 为什么应用程序的中断执行不了?求指教!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-6 09:35 , Processed in 0.097156 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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