123
返回列表 发新帖
楼主: wuyufeng-276292

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

[复制链接]

该用户从未签到

8

主题

45

帖子

0

新手上路

Rank: 1

积分
111
最后登录
1970-1-1
发表于 2012-10-24 08:05:34 | 显示全部楼层

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

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

请教安:我bootloader程序下载S19是用的CAN0的中断接收,应用程序中断接收一帧数据,再把该帧数据发给上位机使用的也是CAN0的中断接收,我在想,是不是这里原因,但我应用程序的向量基地址改了的啊,这两个中断接收的中断地址应该不会重叠的,我是这么理解的,但是调不通啊,肯定我在某个关键的地方不明白,求安和各位大神赐教啊!
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

38

帖子

0

新手上路

Rank: 1

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

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

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

请教安:我bootloader程序下载S19是用的CAN0的中断接收,应用程序中断接收一帧数据,再把该帧数据发给上位机使用的也是CAN0的中断接收,我在想,是不是这里原因,但我应用程序的向量基地址改了的啊,这两个中断接收的中断地址应该不会重叠的,我是这么理解的,但是调不通啊,肯定我在某个关键的地方不明白,求安和各位大神赐教啊![face]010[/
 

你好   
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

38

帖子

0

新手上路

Rank: 1

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

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

回复第 18 楼 于2012-10-22 23:15:50发表:
回复第 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)函数
 

你好 ,
   我使用的编译器Code Warrier .   按你所说的还是不能运行, 请问 还有一些其他的注意事项吗?
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

45

帖子

0

新手上路

Rank: 1

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

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

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

请教安:我bootloader程序下载S19是用的CAN0的中断接收,应用程序中断接收一帧数据,再把该帧数据发给上位机使用的也是CAN0的中断接收,我在想,是不是这里原因,但我应用程序的向量基地址改了的啊,这两个中断接收的中断地址应该不会重叠的,我是这么理解的,但是调不通啊,肯定我在某个关键的地方不明白,求安和各位大神赐教啊![face]010[/
 

你好  请问你的P-flash是怎么擦除的?
             我写的擦除函数只能擦除没有代码的flash  遇到有代码的地方就抛飞了。  看门狗复位之后程序也回不来了!  请指教。
 
首先,我的bootloader程序放在0xF000 TO 0xFCFF,关于擦除的代码放在0xFD00 TO   0xFEFF ,这段代码会重定位到0x3D00;这以外的区域都可以擦除(我是这样理解的,不知道对不对),但没必要,我们只擦除应用程序所要使用的区域, 这个在应用程序的prm里定义
 
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

45

帖子

0

新手上路

Rank: 1

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

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

回复第 23 楼 于2012-10-24 10:11:45发表:
回复第 18 楼 于2012-10-22 23:15:50发表:
回复第 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)函数
 

你好 ,
   我使用的编译器Code Warrier .   按你所说的还是不能运行, 请问 还有一些其他的注意事项吗?
 

我也是用Code Warrier ,不知道你的怎么不能运行,报什么错?
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

38

帖子

0

新手上路

Rank: 1

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

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

回复第 25 楼 于2012-10-24 12:23:23发表:
 
 
 
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

38

帖子

0

新手上路

Rank: 1

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

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

 

你好,
         
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

38

帖子

0

新手上路

Rank: 1

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

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

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

      你好, 使用RELOCATE_TO重新映射以后,当调用代码的时候,PC指针会指向重新映射的地址,而不会指向原来的flash。通过仿真软件验证过。使用RELOCATE_TO重新映射后 , 不使用RomcopytoRam()函数。PC指针也会指向重新映射的地址,而不使用RELOCATE_TO重新映射,仅仅调用函数RomcopytoRam(),运行后PC指针不会指向重新映射的地址。是不是说明使用RELOCATE_TO重新映射重新映射即可,不需要调用函数RomcopytoRam()。 还是两者必须一块使用呢??
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

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

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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