Board logo

标题: 在codewarrior中,如何把常量放在指定flash地址上? [打印本页]

作者: askl    时间: 2005-5-30 22:30     标题: 在codewarrior中,如何把常量放在指定flash地址上?

有时候擦写flash更新参数,希望能够把这些参数放在一指定位置。
作者: seuafu2005    时间: 2005-5-31 10:17

在prm文件中开辟数据区,然后把数据放在该区域
可以参考以下帖子的讨论
http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=36120&ID=36120
作者: usliwu    时间: 2005-6-5 08:02

不同种类的机型会有不同的定义方法, 例如用于DSP56F800/E的Codewarrior V7.2可有二种定义方法: 1)const int 用于把一个常量定义在数据flash中;   2)__pmem const int (注意这里下划线是二个且中间没有空格)用于把一个常量定义在程序flash中,这个功能非常有用,它可以用来定义一个巨大的表格。
作者: lhp5890    时间: 2005-6-8 16:09

usliwu:
  codewarrior V7.0中第一种方法可行,第二种方法我是了一下,出现了错误如下:
Link Error   : Fcounter(.const.data.pmem) in file ad.c is referenced but has not been written.
Check your linker command file.

Link failed.
我定义的数组名为counter[500];
作者: lhp5890    时间: 2005-6-8 16:13

还有,我的连接命令文件中定义了
        .p_flash_ROM_data  (RX) : ORIGIN = 0x00000001, LENGTH = 0x00000FFF
有问提吗?
作者: usliwu    时间: 2005-6-9 13:02

你同时也要修改linker command file. 我写了一个例子。如果你打开linker command 文件,第98行是后加的,目的是把这个定义有关的变量指向程序Flash·

.ApplicationCode :
        {

              F_Pcode_start_addr = .;

              # .text sections
              OBJECT (F_EntryPoint, Cpu.c) # The function _EntryPoint have to be placed at the beginning of the code
                                       # section for proper functionality of the serial bootloader.
              * (.text)
              * (rtlib.text)
              * (startup.text)
              * (fp_engine.text)
              * (user.text)
              * (.const.data.pmem) #后加的

              F_Pcode_end_addr = .;

              # save address where for the data start in pROM
              . = ALIGN(2);
              __pROM_data_start = .;

        } > .p_Code
作者: usliwu    时间: 2005-6-9 13:20

请将你的email给,我将这个例子传给你。你也可以存CodeWarrior手册中找到答案。打开CoseWarrior; 点 Help ->CodeWarrior PDF Manual Folders 打开PDF 文件 "Targeting_56800E.pdf" 从135页-139页给出了如何使用Pflash存常数. 存138-139页给出了如何修改linker command file.
如果你使用PE,你要到CPU bean 中disable "Generate linker file": Open CPU bean -> Build options -> Generate linker file 将这个选项从Yes改为"no"
作者: lhp5890    时间: 2005-6-10 09:28

usliwu:
    真是太感谢你了!我的邮箱是LHP5890@TOM.COM,对CODEWARRIOR,我有太多不清楚的地方。谢谢你的帮助
作者: lhp5890    时间: 2005-6-10 16:54

usliwu:
以前没有用过FREESCALE的芯片,TARGETING_5800E中的英文看不懂,数据ROM好象不需定义连接命令文件就可以使用了,可程序区内的RAM是怎么定义和使用的也不清楚,我现在学习的是56F8346芯片,要是连数据定义和使用都不会,真不知道该怎么办?能帮帮我吗?
作者: usliwu    时间: 2005-6-14 00:38

程序区内的RAM是用来存放动态程序的,例如,运行中从上位机中下载程序,仍后跳到这段区间( 0x0002800 - 0x0002FFFF)来执行。所以不需要在linker command file 中定义变量和文件名,linker command file 保留了这段区间作为动态程序应用。
作者: lhp5890    时间: 2005-6-14 11:19

那就是说程序中的RAM不能用来存储变量了,是吗?那不是片内RAM就比较小了,8346就只有8KBYTE的RAM 数据存储器了,是这样的吗,谢谢usliwu.
我心目中的专家!!
作者: lhp5890    时间: 2005-6-14 11:20

那就是说程序中的RAM不能用来存储变量了,是吗?那不是片内RAM就比较小了,8346就只有8KBYTE的RAM 数据存储器了,是这样的吗,谢谢usliwu.
我心目中的专家!!
作者: lhp5890    时间: 2005-6-14 11:36

还有就是BOOTFLASH也只能用作引导程序区,即使不使用引导程序也不能用于数据存储吧?反正我不用,也只是在该系列的用户手册上看到有一点点介绍,没看懂!
在命令连接程序中,有下面的定义:
.p_flash_ROM_data (RX) : ORIGIN = 0x00000001, LENGTH = 0x00000FFF
我的理解是在程序FLASH中开辟了一段存储器映射,可是究竟对应的是PROM中的那一段,也不清楚,为什么地址是从ORIGIN = 0x00000001开始的区域呢。
作者: lhp5890    时间: 2005-6-14 11:39

还有就是BOOTFLASH也只能用作引导程序区,即使不使用引导程序也不能用于数据存储吧?反正我不会用,也只是在该系列的用户手册上看到有一点点介绍,没看懂!
输入错误,不会用输成了不用。。。
作者: usliwu    时间: 2005-6-14 14:18

是的,程序中的RAM不能用来存储变量。BOOTFLASH与其它程序Flash一样,它可以作为一般的程序Flash来用,之所以叫它BOOTFLASH是因为它是一块独立flash,因为flash制造工艺决定了"Flash自己不能写它自己"。所以如果在在线运行中写程序Flash,写Flash的程序必须放在BOOTFLASH中或程序RAM中。所以如果在在线运行中写Boot Flash 写Flash的程序必须放在程序FLASH中或程序RAM中。
对于.p_flash_ROM_data (RX) 为什么从从ORIGIN = 0x00000001开始,这里的.p_flash_ROM_data (RX)其实是数据RAM在Flash中的一个映射,所以它的定义和大小与数据RAM一样。另外因为当定义一个变量并赋于一个值,如int x=10;那么这个"10"在下载程序时是先被存放程序Flash中,在CodeWarrior引导程序中将这些已赋值的变量传到数据RAM中去,因为传递数据的指针是用SP寄存器来做的而且用的是32位的传数指令,当用SP来传32位数,SP必须指向奇地址。如果打开文件"56F83x_inir.asm"就清楚了。
作者: lhp5890    时间: 2005-6-15 10:52

好象有些明白了,谢谢usliwu!真的非常感谢!!
作者: usliwu    时间: 2005-6-15 13:59

更正!
程序区的RAM(P-RAM)可以用来存储变量,但是读取存在程序区的RAM中的变量比读取存在数据区的RAM中的变量要慢。定义方法如:__pmem int X,Y; 注意linker command file也要修改。
作者: lhp5890    时间: 2005-6-16 12:29

根据TARGETING——56800E中的说明好象是说__pmem int x,y ;是在程序区中的FLASH 而不是PRAM中定义变量,不知我理解是否正确?还有如果在FLASH 中定义变量而不是常数,而FLASH 中的写次数是有限制的,怎麽解决这样的问题呢?
谢谢usliwu的帮助!!
作者: usliwu    时间: 2005-6-17 01:18

当用程序区RAM来存放变量时应注意几点
1) 因为程序区RAM从0x0002,f800开始的,所以对这个区的操作超过了16位地址范围,所以CodeWarrior Target应选用idm pROM-xRAM。意思是用Large Memory 模式
2) 将下例语句加到linker Command file "ldm_pROM_xRAM.cmd" 的最后就可以了

       .
          .
          .
      .ApplicationData : # section is added by user
        {
                * (.bss.char.pmem)
                * (.bss.pmem)
        
         } > .p_internal_RAM

         .
         .
         .
}
作者: lhp5890    时间: 2005-6-17 09:55

谢谢你 usliwu!
作者: lhp5890    时间: 2005-6-17 10:45

我试了一下,可以使用了,可是如果想同时使用PRAM和PROM时,定义上好象又有问题了,我说的是*(.bss.pmem)放到.p_internal_RAM 段就不能放到.p_code段了,因为有些故障信息还是存在PROM中比较好,*(.bss.pmem)这个名称可以自己修改和定义吗?
作者: usliwu    时间: 2005-6-18 08:09

*(.bss.pmem)表示随机变量,所以不能存在.p_code段。如果想把故障信息保存,最好是存在data Flash段,所以你要在RAM区开一个故障信息区,仍后定时的把这个区的数据拷贝到Flash区。不过你自己需要写一个Flash编程程序。Freescale 网站上有这样的资料介绍如何用Flash来模拟EEPROM. 你可搜索" Flash Emulation"的资料·
作者: lhp5890    时间: 2005-6-20 10:59

现在总算明白了,谢谢usliwu!!




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0