首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在codewarrior中,如何把常量放在指定flash地址上?

不同种类的机型会有不同的定义方法, 例如用于DSP56F800/E的Codewarrior V7.2可有二种定义方法: 1)const int 用于把一个常量定义在数据flash中;   2)__pmem const int (注意这里下划线是二个且中间没有空格)用于把一个常量定义在程序flash中,这个功能非常有用,它可以用来定义一个巨大的表格。
你同时也要修改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
请将你的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"
程序区内的RAM是用来存放动态程序的,例如,运行中从上位机中下载程序,仍后跳到这段区间( 0x0002800 - 0x0002FFFF)来执行。所以不需要在linker command file 中定义变量和文件名,linker command file 保留了这段区间作为动态程序应用。
是的,程序中的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"就清楚了。
更正!
程序区的RAM(P-RAM)可以用来存储变量,但是读取存在程序区的RAM中的变量比读取存在数据区的RAM中的变量要慢。定义方法如:__pmem int X,Y; 注意linker command file也要修改。
当用程序区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

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