打印
[Kinetis]

对于ke06,怎么定位代码存放区喊

[复制链接]
3238|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
FSL_TICS_Jeremy| | 2014-11-7 09:30 | 只看该作者
你好,楼主!
将代码定义到指定区域,各个IDE都有所不同的,
以IAR为例,需要在ICF文件,修改定义代码存放的起始地址,具体修改方式,建议参考此经验分享帖:
https://bbs.21ic.com/icview-798996-1-1.html

使用特权

评论回复
板凳
FSL_TICS_Jeremy| | 2014-11-7 09:31 | 只看该作者
楼主,
你使用的是哪个IDE呢?

使用特权

评论回复
地板
nongfuxu|  楼主 | 2014-11-7 09:48 | 只看该作者
嗯。
用 IAR 。

使用特权

评论回复
5
nongfuxu|  楼主 | 2014-11-7 10:09 | 只看该作者
谢谢

在看 “https://bbs.21ic.com/icview-798996-1-1.html”。
有点不知道人 哪里下手为好。

1)下面是IAR 编程模式。应该选 flash_128k,还是选RAM16K


2)K53的内存地址如下图。 KE06的内存地址,我在参考手册上没有找到。是不是我没找对地方?


3)没有经验,不知道如何修改KE06的.icf文件。 需要修改几处,怎么改,注意事项。

4) 上说,修改好 .icf文件后,需要 “修改好之后,只需要编译生成.srec文件即可。
这个是在哪里编译、怎么操作,请教教我。

2.jpg (49.93 KB )

2.jpg

1.jpg (11.92 KB )

1.jpg

使用特权

评论回复
6
FSL_TICS_Jeremy| | 2014-11-7 14:34 | 只看该作者
你好,楼主!
1. 选择Flash,这是针对这一个问题。
2. K06的Flash地址空间分布在参考手册是有的,你仔细看一下吧。
2.ICF的修改原则,在我自己分享的AN2295 Bootloader介绍中是有介绍,同时也在文档中介绍了SREC的生成办法,你可以参考一下 ,还有问题的话,
咱们再交流。
【经验分享】AN2295 bootloader文档解析(一)
https://bbs.21ic.com/icview-766474-1-1.html
【经验分享】AN2295 bootloader文档解析(二)
https://bbs.21ic.com/icview-771810-1-1.html
【经验分享】AN2295 bootloader文档解析(三)
https://bbs.21ic.com/icview-775630-1-1.html

使用特权

评论回复
7
nongfuxu|  楼主 | 2014-11-7 19:45 | 只看该作者
好!
静下心仔细学习一下。

使用特权

评论回复
8
nongfuxu|  楼主 | 2014-11-7 19:59 | 只看该作者
【经验分享】AN2295 bootloader文档解析(一)
https://bbs.21ic.com/icview-766474-1-1.html
【经验分享】AN2295 bootloader文档解析(二)
https://bbs.21ic.com/icview-771810-1-1.html
【经验分享】AN2295 bootloader文档解析(三)
https://bbs.21ic.com/icview-775630-1-1.html

在拜读这三个贴子。
这些**讲了底层。好是好,不过我只想知道 “怎样将烧好的鱼装盘”,并不想花大量时间先来学习“怎样养好鱼、烧好鱼”。
若有一个案例、或者直接说明的话,可以节省我许多时间。

废话少说,没有好的答案之前,继续学习上述三个贴子。

使用特权

评论回复
9
nongfuxu|  楼主 | 2014-11-7 20:06 | 只看该作者
本帖最后由 nongfuxu 于 2014-11-8 06:56 编辑

这些是网上淘到的关于 IAR *.ICF的** (1)

IAR中ICF文件分析与应用

sections在地址空间中的存放是由ILINK链接器来实现的,而ILINK链接器是按照用户在ICF文件中的规定来放置sections的,所以理 解ICF文件的内容尤其重要。
一个标准的ICF文件可包括下面这些内容:
1.       可编址的存储空间(memory)
2.       不同的存储器地址区域(region)
3.       不同的地址块(block)
4.       Section的初始化与否
5.       Section在存储空间中的放置

下 面介绍了几条ICF文件中常见的指令,详细内容请参考ILINK相关说明文档(EWARM_DevelopmentGuide.pdf):
1.    define [ exported ] symbol name = expr;
作用:    指定某个符号的值。
参数:    exported 导出该symbol,使其对可执行镜像可用
name     --符号名
expr     --符号值
举例:
define symbol RAM_START_ADDRESS = 0x40000000;
define symbol RAM_END_ADDRESS = 0x4000FFFF;   

2.    define memory name with size = expr [, unit-size];
作用:    定义一个可编址的存储地址空间(memory)。
参数:    name     --memory的名称
expr     --地址空间的大小
unit-size --expr的单位,可以是位(unitbitsize),缺省是字节(unitbytesize)
举例:
define memory MEM with size = 4G;

3.    define region name = region-expr;
作用:    定义一个存储地址区域(region)。一个区域可由一个或多个范围组成,每个范围内地址必须连续,但几个范围之间不必是连续的。
参数:    name region的名称
region-expr memory:[from expr { to expr | size expr}],可以定义起止范围,也可以定义起始地址和region的大小
举例:
define region ROM = MEM:[from 0x0 size 0x10000];
define region ROM = MEM:[from 0x0 to 0xFFFF];

4.    define block name[ with param, param... ]
{
extended-selectors
};
作用:    定义一个地址块(block);它可以是个空块,比如栈、堆;也可以包含一系列sections。
参数:    name     block的名称
param 可以是:     size = expr (块的大小)
maximum size = expr (块大小的上限)
alignment = expr (最小对齐字节数)
fixed order (按照固定顺序放置sections)
extended-selector [ first | last ] { section-selector | block name | overlay name }
first 最先存放
last 最后存放
section-selector [ section-attribute ][ section sectionname ][object filename ]
section-attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ]
sectionname section的名称
filename 目标文件的名称
即可以按照section的属性,名称及其所在目标文件的名称这三个过滤条件中,任意选取一个条件,或选取多个条件进行组合,来圈定所要求的 sections。
name block或overlay的名称
举例:
define block HEAP with size = 0x1000, alignment = 4 { };
define block MYBLOCK1 = { section mysection1, section mysection2, readwrite };
define block MYBLOCK2 = { readonly object myfile2.o };

5.    initialize { by copy | manually } [ with param, param... ]
{
section-selectors
};
作用:    初始化sections。
参数:    by copy 在程序启动时自动执行初始化。
manually 在程序启动时不自动执行初始化。
param 可以是: packing = { none | compress1 | compress2 | auto }
copy routine = functionname
packing表示是否压缩数据,缺省是auto。
functionname表示是否使用自己的拷贝函数来取代缺省函数。
section-selector 同上
举例:
initialize by copy { rw };

6.    do not initialize
{
section-selectors
};
作用:    规定在程序启动时不需要初始化的sections。一般用于__no_init声明的变量段(.noinit)。
参数:    section-selector 同上
举例:
do not initialize { .noinit };

7.    place at { address memory[: expr] | start of region_expr | end of region_expr }
{
extended-selectors
};
作用:    把一系列sections和blocks放置在某个具体的地址,或者一个region的开始或者结束处。
参数:    memory memory的名称
expr 地址值,该地址必须在memory所定义的范围内
region_expr region的名称
extended-selector 同上
举例:
place at start of ROM { section .cstart }; place at end of ROM { section .checksum }; place at address MEM:0x0 { section .intvec };

8.    place in region-expr
{
extended-selectors
};
作用:    把一系列sections和blocks放置在某个region中。sections和blocks将按任意顺序放置。
参数:    region-expr region的名称
extended-selector 同上
举例:
place in ROM { readonly };         /* all readonly sections */
place in RAM { readwrite };         /* all readwrite sections */
place in RAM { block HEAP, block CSTACK, block IRQ_STACK };
place in ROM { section .text object myfile.o };     /* the .text section of myfile.o */
place in ROM { readonly object myfile.o };         /* all read-only sections of myfile.o */
place in ROM { readonly data object myfile.o };     /* all read-only data sections myfile.o */
FROM:http://blog.21ic.com/user1/5910/archives/2009/61982.html

IAR的ICF文件中宏给程序使用
如果想定在rom空间,
1) 在 icf中:
place at address mem:0x08090000 { readonly section .test };
2)在C:中:
#pragma location = ".test"
const u32 uiData[512];// const 切不可省略

如果想定在ram空间
1)在icf中:
place at address mem:0x08090000 { readwrite section .test };
2)在C:中:
#pragma location = ".test"
u32 uiData[512];

可发现uiData的值为0x08090000
该法可方便通过ICF指定某变量的地址。

程序也可以。写法类似.vector

如果用block的方。类似
1)在icf中
define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
2)在C中:
#pragma language="extended"
#pragma segment="CSTACK"

ptr = __sfe( "CSTACK" );可得到CSTACK的高端地址+1
__sfe: Returns last address of segment.

使用特权

评论回复
10
nongfuxu|  楼主 | 2014-11-7 20:08 | 只看该作者
这些是网上淘到的关于 IAR *.ICF的** (2)

IAR 开发环境下使用 .icf文件
定义 MCU及其外扩资源的应用范围,这些在项目设计之前必须被确定下来。所以认识它非常重要。那么该文件是如何定义的呢?
下面通过一个.icf来认识其具体结构。这是一个基于STM32芯片的.icf文件定义结构:

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/********************************-Specials-************************************/
/*由于STM32内部flash的起始地址为 0x08000000, 所以如下语句定义程序的起始地址,但对于一个应用程序,其起始运行地址不一定是 芯片定义的初地址,其可根据实际需要修改,当修改后,必须特殊设计一段引导代码使其能跳到应用程序中来。 由于作者的系统的APP 起始地址为 0x08008000 ,所以我的应用程序app start addrress 定义如下:*/
define symbol __ICFEDIT_intvec_start__ = 0x08008000;     
/********************************-Memory Regions-******************************/
/* 定义内部FLASH地址 */
define symbol __ICFEDIT_region_ROM_start__ = 0x08008000;
define symbol __ICFEDIT_region_ROM_end__   = 0x0807FFFF;
/*  定义内部RAM地址 */
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x2000FFFF;

/* 定义扩展RAM地址 */
define symbol __ICFEDIT_region_EXRAM_start__    = 0x68000000;
define symbol __ICFEDIT_region_EXRAM_end__      = 0x68040000;

/*********************************-Sizes-***************************************/
/* 栈和堆大小,一般不需要修改 */
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x200;
/******************************* End of ICF editor section. ###ICF###***********/
define memory mem with size = 4G;
define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

/*定义内部 RAM ROM, 以及外部RAM 地址范围 */
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
define region EXRAM_region = mem:[from __ICFEDIT_region_EXRAM_start__   to __ICFEDIT_region_EXRAM_end__];

/*
********************************************************************************
                    Define Bootloader address
********************************************************************************
*/
/* 这段语句相当于一个标志位,使的以 ILOADER  声明的代码放在如下空间内,具体声明方式如下:
#pragma location = "ILOADER"
__root const unsigned char RBL_Code[] = {
  0x00, 0x04, 0x00, 0x20, 0x85, 0x2C, 0x00, 0x08, 0x9D, 0x2C, 0x00, 0x08, 0x9F, 0x2C, 0x00, 0x08,
  0xA1, 0x2C, 0x00, 0x08, 0xA3, 0x2C, 0x00, 0x08, 0xA5, 0x2C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x2C, 0x00, 0x08,
};
*/
define region ILOADER_region         = mem:[from 0x08000000 to 0x08003FFF];      
place in ILOADER_region         { readonly section ILOADER };
/*******************************************************************************/
/* 下列语句定义所定义地址空间内可完成的操作类型*/
initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };      
/* 对外部RAM操作类型的声明 */                 
place in EXRAM_region {readwrite data section SDRAM };          /* EXTSRAM_region */
/* 定义一个标志位,代表扩展RAM的起始地址,可以再应用函数中直接调用SDRAM_BASE_ADDR 这个变量 */
define exported symbol SDRAM_BASE_ADDR = __ICFEDIT_region_EXRAM_start__;

/******************************* End of this file ******************************/

使用特权

评论回复
11
nongfuxu|  楼主 | 2014-11-7 20:10 | 只看该作者
本帖最后由 nongfuxu 于 2014-11-7 21:15 编辑

这些是网上淘到的关于 IAR *.ICF的** (3)

IAR ICF格式浅析
sections在地址空间中的存放是由ILINK链接器来实现的,而ILINK链接器是按照用户在ICF文件中的规定来放置sections的,所以理解ICF文件的内容尤其重要。
一个标准的ICF文件可包括下面这些内容:
1.       可编址的存储空间(memory)
2.       不同的存储器地址区域(region)
3.       不同的地址块(block)
4.       Section的初始化与否
5.       Section在存储空间中的放置

下面介绍了几条ICF文件中常见的指令,详细内容请参考ILINK相关说明文档(EWARM_DevelopmentGuide.pdf):
define [ exported ] symbol name = expr;
作用:
指定某个符号的值。
参数:
exported 导出该symbol,使其对可执行镜像可用
name 符号名
expr 符号值

举例:
define symbol RAM_START_ADDRESS = 0x40000000;
define symbol RAM_END_ADDRESS = 0x4000FFFF;
-------------------------------------------------------------------

define memory name with size = expr [, unit-size];
作用:

定义一个可编址的存储地址空间(memory)。
参数:
name memory的名称
expr 地址空间的大小
unit-size expr的单位,可以是位(unitbitsize),缺省是字节(unitbytesize)
举例:
define memory MEM with size = 4G;
-----------------------------------------------------------------
define region name = region-expr;
作用:
定义一个存储地址区域(region)。一个区域可由一个或多个范围组成,每个范围内地址必须连续,但几个范围之间不必是连续的。
参数:
name region的名称
region-expr memory:[from expr { to expr | size expr}],可以定义起止范围,也可以定义起始地址和region的大小
举例:
define region ROM = MEM:[from 0x0 size 0x10000];
define region ROM = MEM:[from 0x0 to 0xFFFF];
---------------------------------------------------------------------------------------------
define block name[ with param, param... ]
{
extended-selectors
};
作用:
定义一个地址块(block);它可以是个空块,比如栈、堆;也可以包含一系列sections。
参数:
name block的名称
param 可以是: size = expr (块的大小)
maximum size = expr (块大小的上限)
alignment = expr (最小对齐字节数)
fixed order (按照固定顺序放置sections)
extended-selector [ first | last ] { section-selector | block name | overlay name }
first 最先存放
last 最后存放
section-selector [ section-attribute ][ section sectionname ][object filename ]
section-attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ]
sectionname section的名称
filename 目标文件的名称
即可以按照section的属性,名称及其所在目标文件的名称这三个过滤条件中,任意选取一个条件,或选取多个条件进行组合,来圈定所要求的sections。
name block或overlay的名称

举例:
define block HEAP with size = 0x1000, alignment = 4 { };
define block MYBLOCK1 = { section mysection1, section mysection2, readwrite };
define block MYBLOCK2 = { readonly object myfile2.o };
---------------------------------------------------------------------------------------------
initialize { by copy | manually } [ with param, param... ]
{
section-selectors
};

作用:
初始化sections。
参数:
by copy 在程序启动时自动执行初始化。
manually 在程序启动时不自动执行初始化。
param 可以是: packing = { none | compress1 | compress2 | auto }
copy routine = functionname
packing表示是否压缩数据,缺省是auto。
functionname表示是否使用自己的拷贝函数来取代缺省函数。
section-selector 同上
举例:
initialize by copy { rw };
--------------------------------------------------------------
do not initialize
{
section-selectors
};
作用:
规定在程序启动时不需要初始化的sections。一般用于__no_init声明的变量段(.noinit)。
参数:
section-selector 同上
举例:
do not initialize { .noinit };
-------------------------------------------------------------------------------------------
place at { address memory[: expr] | start of region_expr | end of region_expr }
{
extended-selectors
};

作用:
把一系列sections和blocks放置在某个具体的地址,或者一个region的开始或者结束处。
参数:
memory memory的名称
expr 地址值,该地址必须在memory所定义的范围内
region_expr region的名称
extended-selector 同上
举例:
place at start of ROM { section .cstart }; place at end of ROM { section .checksum }; place at address MEM:0x0 { section .intvec };
-------------------------------------------------------------------------
place in region-expr
{
extended-selectors
};
作用:
把一系列sections和blocks放置在某个region中。sections和blocks将按任意顺序放置。
参数:
region-expr region的名称
extended-selector 同上
举例:
place in ROM { readonly }; /* all readonly sections */ place in RAM { readwrite }; /* all readwrite sections */
place in RAM { block HEAP, block CSTACK, block IRQ_STACK }; place in ROM { section .text object myfile.o }; /* the .text section of myfile.o */ place in ROM { readonly object myfile.o }; /* all read-only sections of myfile.o */ place in ROM { readonly data object myfile.o }; /* all read-only data sections myfile.o */

使用特权

评论回复
12
nongfuxu|  楼主 | 2014-11-7 20:18 | 只看该作者
本帖最后由 nongfuxu 于 2014-11-8 07:19 编辑

从飞思卡尔社区找到一篇在KE02上能用贴子。
作为学习ICF笔记,转贴在此处。
IAR调试KE02,如何将函数放到flash中的指定地址?(已解决)
虽然是为STM32写的,但是经过实践证明,kinetis同样适用。下面贴出来,供大家使用。

1) 把函数定位在FLASH高端的指定位置,以后更新,只更新那小块地方就可以了。

  方法一:
    IAR里面进行函数定位, 必须要在.icf里面,进行定义。
   void sendstr(unsigned *buf,unsigned short  len) @".sendstr"
   {
    ....
   }
   .icf文件,加入这样一句:
  place at address mem:0x08017000 { readonly section .sendstr};

  方法二)  把要更新的函数,单独放在一个.c文件中,然后再.icf文件里面,对该文件进行定位:
  test.c
  int f1(int a,int b){
  if(a>0){
   return (a+b)*1;
  }
  else return 0;
}
  int f2(int a,int b){
  if(a>0){
   return (a+b)*1;
  }
  else return 0;
}
那么在 .icf文件中,这样写:
place at address mem:0x08018000 { section .text object test.o };
编译完成后, f1就定位在0x08018000 处了,当然f2也紧跟在f1后面。整个test.c文件的所有函数,都在0x08018000 之后。

如果有多个函数需要单独更新,建议采用第二种方式, 只需要对c文件编译后的地址定位,那么该c文件的所有函数都定位了。
绝对定位的函数,只要指定了地址,那么在flash里面的位置就是固定的。
即使是两个不同的工程,比如第一个工程为实际工程,里面有所有的工程文件,  第二个工程为更新专用工程,里面仅仅只有test.c文件,里面的函数是同名的,定位地址与第一个工程也一样。
那么这样编译后,第二个工程里面的固件片断,是可以用来更新一个工程的固件的。

这样还可以派生出一个很怪的用法:
我可以把更新专用工程,公布给别人,他只需要在test.c里面,编写函数的具体内容。 然后一样可以更新产品的固件。
真正的实际工程,是不需要公布的。
以上是对函数的绝对定位处理。
---------------------------------------------------------------------------------------------------------------------------------------------------

2)变量定位
变量绝对定位:
__no_init char array1[100]@0x2000B000;
变量绝对定位,无须修改.icf,直接指定
这个array1就定位在RAM中的0x2000B000处
常量绝对定位:
const char str1[8]@".MYSEG"="test11!!";
常量绝对定位,需要改.icf文件:
place at address mem:0x08018500 { readonly section .MYSEG};

原始**出处
            http://blog.csdn.net/slj_win/article/details/21516497

使用特权

评论回复
13
nongfuxu|  楼主 | 2014-11-7 20:22 | 只看该作者
另外对*.ICF文件的具体含义,从网上搜索转载如下:

EWARM 5.xx中的链接器称为ILINK。ILINK可以从ELF/DWARF格式的目标文件中提取代码和数据,并生成可执行映像。在EWARM 4.xx中,基本的代码和数据链接单元是segment,而对于ELF/DWARF格式而言,基本链接单元是section。ILINK根据ILINK Configuration File(*.icf)来分配这些sections。由于XLINK与ILINK是两个完全不同的链接器,所以XCL和ICF也是两种完全不同的配置文件。

一个标准的ICF文件可包 括下面这些内容:
1.       可编址的存储空间(memory)
2.       不同的存储器地址区域(region)
3.       不同的地址块(block)
4.       Section的初始化与否
5.       Section在存储空间中的放置

使用特权

评论回复
14
nongfuxu|  楼主 | 2014-11-7 20:37 | 只看该作者
其它转贴

官方提供的驱动程序包里的icf 文件在RAM的定义上好像有点问题, 求以下两款单片机的icf文件

https://bbs.21ic.com/icview-760198-1-1.html

使用特权

评论回复
15
nongfuxu|  楼主 | 2014-11-7 20:38 | 只看该作者
其它转贴

KE02在IAR和KEIL中以常量形式初始化EEPROM值

http://www.freescaleic.org/module/forum/thread-592558-1-1.html

使用特权

评论回复
16
nongfuxu|  楼主 | 2014-11-7 20:51 | 只看该作者
其它

Kinetis E 系列上的 IIC Boot Loader设计.pdf //网上有,搜一下。

KL25在IAR中将函数指定到flash地址
http://www.amobbs.com/thread-5590730-1-1.html

使用特权

评论回复
17
nongfuxu|  楼主 | 2014-11-7 21:27 | 只看该作者
查到 KE06的闪存地址

   器件          Flash (KB)   数据块0 (Flash)地址范围
MKE06Z64VLD4(R)   64          0x0000_0000 – 0x0000_FFFF
MKE06Z128VLD4(R)  128         0x0000_0000 – 0x0001_FFFF
MKE06Z64VQH4(R)   64          0x0000_0000 – 0x0000_FFFF
MKE06Z128VQH4(R)  128         0x0000_0000 – 0x0001_FFFF
MKE06Z64VLH4(R)   64          0x0000_0000 – 0x0000_FFFF
MKE06Z128VLH4(R)  128         0x0000_0000 – 0x0001_FFFF

使用特权

评论回复
18
FSL_TICS_Jeremy| | 2014-11-10 09:17 | 只看该作者
nongfuxu 发表于 2014-11-7 21:27
查到 KE06的闪存地址

   器件          Flash (KB)   数据块0 (Flash)地址范围

对的,这就是各个KE06类型的Flash区间。

使用特权

评论回复
19
nongfuxu|  楼主 | 2014-11-10 11:24 | 只看该作者
请教各位大侠,按照上述从网上摘抄的帖子上说的,

是不是定位函数在flash中的位置时,不用按下面帖子上说的必须烧写新的bootLooder才行。
https://bbs.21ic.com/icview-766474-1-1.html
【经验分享】AN2295 bootloader文档解析(二)
https://bbs.21ic.com/icview-771810-1-1.html
【经验分享】AN2295 bootloader文档解析(三)
https://bbs.21ic.com/icview-775630-1-1.html

即 直接通过编写*.icf文件,就能定位函数、用户字节在flash中的位置了?

:)

使用特权

评论回复
20
nongfuxu|  楼主 | 2014-11-10 11:24 | 只看该作者

/*--  有哪位大侠,在KE06上测试过嘛?   --*/

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:是不是经济不KUA,房价下不来? 高房价只能带来“实体经济挤出效应”。

417

主题

4293

帖子

2

粉丝