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

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

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

有时候擦写flash更新参数,希望能够把这些参数放在一指定位置。
在prm文件中开辟数据区,然后把数据放在该区域
可以参考以下帖子的讨论
http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=36120&ID=36120
不同种类的机型会有不同的定义方法, 例如用于DSP56F800/E的Codewarrior V7.2可有二种定义方法: 1)const int 用于把一个常量定义在数据flash中;   2)__pmem const int (注意这里下划线是二个且中间没有空格)用于把一个常量定义在程序flash中,这个功能非常有用,它可以用来定义一个巨大的表格。
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];
还有,我的连接命令文件中定义了
        .p_flash_ROM_data  (RX) : ORIGIN = 0x00000001, LENGTH = 0x00000FFF
有问提吗?
你同时也要修改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"
usliwu:
    真是太感谢你了!我的邮箱是LHP5890@TOM.COM,对CODEWARRIOR,我有太多不清楚的地方。谢谢你的帮助
usliwu:
以前没有用过FREESCALE的芯片,TARGETING_5800E中的英文看不懂,数据ROM好象不需定义连接命令文件就可以使用了,可程序区内的RAM是怎么定义和使用的也不清楚,我现在学习的是56F8346芯片,要是连数据定义和使用都不会,真不知道该怎么办?能帮帮我吗?
程序区内的RAM是用来存放动态程序的,例如,运行中从上位机中下载程序,仍后跳到这段区间( 0x0002800 - 0x0002FFFF)来执行。所以不需要在linker command file 中定义变量和文件名,linker command file 保留了这段区间作为动态程序应用。
那就是说程序中的RAM不能用来存储变量了,是吗?那不是片内RAM就比较小了,8346就只有8KBYTE的RAM 数据存储器了,是这样的吗,谢谢usliwu.
我心目中的专家!!
那就是说程序中的RAM不能用来存储变量了,是吗?那不是片内RAM就比较小了,8346就只有8KBYTE的RAM 数据存储器了,是这样的吗,谢谢usliwu.
我心目中的专家!!
还有就是BOOTFLASH也只能用作引导程序区,即使不使用引导程序也不能用于数据存储吧?反正我不用,也只是在该系列的用户手册上看到有一点点介绍,没看懂!
在命令连接程序中,有下面的定义:
.p_flash_ROM_data (RX) : ORIGIN = 0x00000001, LENGTH = 0x00000FFF
我的理解是在程序FLASH中开辟了一段存储器映射,可是究竟对应的是PROM中的那一段,也不清楚,为什么地址是从ORIGIN = 0x00000001开始的区域呢。
还有就是BOOTFLASH也只能用作引导程序区,即使不使用引导程序也不能用于数据存储吧?反正我不会用,也只是在该系列的用户手册上看到有一点点介绍,没看懂!
输入错误,不会用输成了不用。。。
是的,程序中的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"就清楚了。
返回列表