请选择 进入手机版 | 继续访问电脑版
查看: 4616|回复: 2

[CodeWarrior] CodeWarrior工程移植到Kinetis Design Studio环境简明教程

[复制链接]

该用户从未签到

20

主题

331

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1207
最后登录
2017-2-27
发表于 2015-10-11 22:59:02 | 显示全部楼层 |阅读模式
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文件。
我知道答案 目前已有2人回答
回复

使用道具 举报

该用户从未签到

20

主题

331

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1207
最后登录
2017-2-27
 楼主| 发表于 2015-10-11 23:06:10 | 显示全部楼层
自己顶一个  
回复 支持 反对

使用道具 举报

  • TA的每日心情
    慵懒
    2016-11-3 11:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    15

    主题

    362

    帖子

    0

    高级会员

    Rank: 4

    积分
    851
    最后登录
    2020-7-13
    发表于 2015-10-12 16:40:55 | 显示全部楼层
    分享的要赞
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 06:06 , Processed in 0.122463 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表