在线时间112 小时
UID78979
注册时间2014-8-27
NXP金币0 
 
 
 
该用户从未签到 
金牌会员 
   
	- 积分
 - 1207
 
 
- 最后登录
 - 2017-2-27
  
 
 | 
 
CodeWarrior工程移植到Kinetis Design Studio环境简明教程 
1.移植步骤 
1.1 KW01(NOS&MQXLite) 
1.在CW中打开需要移植的工程,然后打开KDS,新建一个KL26工程,步骤与CW中的类似: 
File-->New-->Kinetis Dsign Studio Project,输入工程名(Project Name),选择芯片类型MKL26Z128xxx4,完成(Finish) 
 
2.删除KDS工程目录中自动生成的“Project Settings”及“Source”文件夹(包括里面的文件),将需移植的CW工程目录中所有文件(除FLASH文件夹外)拷贝到KDS工程目录中 
 
3.将CW工程中所包含的文件路径及相关的工程设置添加到KDS工程中 
1)在工程目录窗口中选中相应工程(CW与KDS中同时进行),在鼠标右键弹出菜单中选择Properties(或选择Project菜单中的Properties)进入工程属性设置,进入C/C++Build-->Settings-->Tool Settings选项卡,在Warnings中勾选Enable all common warnings(-Wall) 
2)将CW工程设置中的相应内容拷贝到KDS的工程设置中 
            CW                              KDS 
ARM Ltd Windows GCC Assembler---->Cross ARM GNU Assembler 
ARM Ltd Windows GCC C Compiler---->Cross ARM C Complier 
ARM Ltd Windows GCC C Linker---->Cross ARM C++ Linker 
每项中需复制的具体内容如下: 
Assembler: 
Directories(KDS中为Includes)中的Include paths 
Miscellaneous中的Other flags(KDS中为Other assembler flags) 
 
Compiler: 
Directories(KDS中为Includes)中的Include paths 
(将KDS中的默认添加路径删除,且不复制CW工程中以${MCUToolsBaseDir}开头的路径) 
Miscellaneous中的Other flags(KDS中为Other compiler flags) 
KDS中Optimization里的Language standard改为Toolchain defaullt(GNU ISO C90) 
Linker: 
General中的Script files(需注意,此处的文件路径必须用英文的""加以修饰) 
Libraries中的Libraries(删除KDS中Libraries->Library search path里的原有内容) 
Miscellaneous中的Other flags(KDS中为Other linker flags) 
3) 进入C/C++Build-->Settings-->Toolchains选项卡,勾选Create flash image及Create extended listing,使得编译后生成hex及lst文件 
1.2 KL25(NOS&MQXLite) 
在KDS中新建工程时,选择的芯片类型为MKL25Z128xxx4。此外,在将CW工程设置拷贝到KDS的工程中时,需在Linker->Libraries的Libraries中添加“gcc”(无双引号),表示链接时加入gcc库。其他的移植步骤都与KW01中的一样。 
1.3 K60(MQX) 
1.在CW中打开需要移植的工程,然后打开KDS,新建一个K60工程,步骤与CW中的类似: 
File-->New-->Kinetis Dsign Studio Project,输入工程名(Project Name),选择芯片类型MK60DN512Zxxx10,完成(Finish) 
 
2.删除KDS工程目录中自动生成的“Project Settings”及“Source”文件夹(包括里面的文件),将需移植的CW工程目录中所有文件(除FLASH文件夹外)拷贝到KDS工程目录中 
 
3.将CW工程中所包含的文件路径及相关的工程设置添加到KDS工程中: 
 
1)在工程目录窗口中选中相应工程(CW与KDS中同时进行),在鼠标右键弹出菜单中选择Properties(或选择Project菜单中的Properties)进入工程属性设置, 
进入C/C++Build-->Settings-->Tool Settings选项卡 
 
2)将CW工程设置中的相应内容拷贝到KDS的工程设置中 
 
            CW                              KDS 
ARM Ltd Windows GCC Assembler---->Cross ARM GNU Assembler 
ARM Ltd Windows GCC C Compiler---->Cross ARM C Complier 
ARM Ltd Windows GCC C Linker---->Cross ARM C++ Linker 
 
每项中需复制的具体内容如下: 
 
Assembler: 
Preprocessor中的Defined symbols 
Directories(KDS中为Includes)中的Include paths 
Miscellaneous中的Other flags(KDS中为Other assembler flags) 
 
Compiler: 
Preprocessor中的Defined symbols 
Directories(KDS中为Includes)中的Include paths 
Miscellaneous中的Other flags(KDS中为Other compiler flags) 
KDS中Optimization里的Language standard改为Toolchain defaullt(GNU ISO C90) 
 
Linker: 
General中的Script files(需注意,此处的文件路径必须用英文的""加以修饰) 
Libraries中的Libraries(在KDS中,不添加CW工程中的两个库“rt”及“c++”)  
3)打开工程中03_MCU文件夹下的startup.c文件 
(1)将文件头尾两处的_EWL_BEGIN_EXTERN_C及_EWL_END_EXTERN_C注释掉 
(2)将以下语句注释掉: 
文件开头部分: 
extern void __copy_rom_sections_to_ram(void); 
extern char __S_romp[]; 
void __thumb_startup(void)函数里: 
__call_static_initializers(); 
__init_user(); 
(3)将以下语句添加到void __thumb_startup(void)函数之前: 
/* format of the ROM table info entry ... */ 
typedef struct RomInfo  
{ 
unsigned long Source; 
unsigned long Target; 
unsigned long Size; 
} RomInfo; 
 
extern RomInfo __S_romp[] __attribute__((weak)); /* linker defined symbol */ 
 
/* 
* Routine to flush cache follow the ROM to RAM copy 
*/ 
void __flush_cache(unsigned long dst, unsigned long size) 
{ 
//TBD 
} 
/* 
*Routine to copy a single section from ROM to RAM ... 
*/ 
void __copy_rom_section(unsigned long dst, unsigned long src, unsigned long size) 
{ 
unsigned long len = size; 
 
const int size_int = s 
const int mask_int = sizeof(int)-1; 
 
const int size_short = sizeof(short); 
const int mask_short = sizeof(short)-1; 
 
const int size_char = sizeof(char); 
 
if( dst == src || size == 0) 
{ 
return; 
} 
 
while( len > 0) 
{ 
if( !(src & mask_int) && !(dst & mask_int) && len >= size_int) 
{ 
*((int *)dst)  = *((int*)src); 
dst += size_int; 
src += size_int; 
len -= size_int; 
} 
else if( !(src & mask_short) && !(dst & mask_short) && len >= size_short) 
{ 
*((short *)dst)  = *((short*)src); 
dst += size_short; 
src += size_short; 
len -= size_short; 
} 
else 
{ 
*((char *)dst)  = *((char*)src); 
dst += size_char; 
src += size_char; 
len -= size_char; 
} 
} 
} 
 
/* 
*Routine that copies all sections the user marked as ROM into 
*their target RAM addresses ... 
* 
*__S_romp is defined in the linker command file 
* It is a table of RomInfo 
*structures.  The final entry in the table has all-zero 
*fields. 
*/ 
void __copy_rom_sections_to_ram(void) 
{ 
int index; 
if (__S_romp == 0L) return; 
/* 
*Go through the entire table, copying sections from ROM to RAM. 
*/ 
for (index = 0; 
__S_romp[index].Source != 0 ||__S_romp[index].Target != 0 ||__S_romp[index].Size != 0; ++index) 
{ 
__copy_rom_section( __S_romp[index].Target, __S_romp[index].Source, __S_romp[index].Size ); 
__flush_cache( __S_romp[index].Target, __S_romp[index].Size); 
} 
} 
 
4)打开工程中07_Soft_Component文件夹下的common.h文件,将#include <null.h>替换成如下代码: 
#ifndef NULL 
        #define NULL 0L 
#endif 
 
 
2.已知问题 
1)在编译MQXLite工程时会提示报错,但不影响机器码生成 
在编译MQXLite工程时会出现以下错误: 
writing to APSR without specifying a bitmask is deprecated              dispatch.S        /KW01_MQXLite/09_MQXLite/psp/cortex_m/core/M0        line 276        C/C++ Problem 
这是KDS测试版的bug,可以忽略,不影响最终生成elf及hex文件。 
        
        
        
         |   
 
 
 
 |