|
发表于 2014-12-14 18:12:58
|
显示全部楼层
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文件。 |
|