打印
[Kinetis]

MKL05Z16 IAR 例程

[复制链接]
1045|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
banyong|  楼主 | 2015-6-25 11:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在官网下的MKL05例程是基于MKL05Z32的,我改为MKL05Z16后,例程里config 文件只有32KB_Pflash.icf,没有16KB_Pflash.icf,而 IAR 自带的ICF 编译不通过,请问有修改过的16KB_Pflash.icf文件吗?

相关帖子

沙发
FSL_TICS_ZJJ| | 2015-6-25 12:52 | 只看该作者
楼主可以把32K的icf修改下,把里面的FLASH, RAM大小改为你芯片的大小就可以了。

使用特权

评论回复
板凳
banyong|  楼主 | 2015-6-25 15:47 | 只看该作者
改成后面这样,   程序会死在这里
if (__VECTOR_RAM != __VECTOR_TABLE)
    {
        for (n = 0; n < 0x104; n++)
            __VECTOR_RAM[n] = __VECTOR_TABLE[n];
    }
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0;
define symbol __ICFEDIT_region_ROM_end__   = (16*1024);//********
define symbol __ICFEDIT_region_RAM_end__   = 0x20000000;
define symbol __ICFEDIT_region_RAM_start__ =__ICFEDIT_region_RAM_end__ - (2*1024)/4 + 0x410;//********
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__     = __ICFEDIT_region_ROM_start__;

/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = (1*1024);//********
define symbol __ICFEDIT_size_heap__   = (1*1024);//********
/**** End of ICF editor section. ###ICF###*/

define symbol __region_RAM2_start__        = 0x20000000;
define symbol __region_RAM2_end__          = __region_RAM2_start__ + ((2*1024)*3)/4;//********

define exported symbol __VECTOR_TABLE      = 0x00000000;
/*define exported symbol __VECTOR_TABLE      = __ICFEDIT_region_RAM_start__ - 0x410;*/
define exported symbol __VECTOR_RAM        = __ICFEDIT_region_RAM_start__ - 0x410;

define exported symbol __BOOT_STACK_ADDRESS = __region_RAM2_end__ - 8;

define symbol __code_start__ = __ICFEDIT_region_ROM_start__ + 0x410;//********

define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];// | mem:[from __region_FlexNVM_start__ to

__region_FlexNVM_end__];//********
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __region_RAM2_end__];// | mem:[from __region_RAM2_start__ to __region_RAM2_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize manually { readwrite };
initialize manually { section .data};
initialize manually { section .textrw };
do not initialize  { section .noinit };

define block CodeRelocate { section .textrw_init };
define block CodeRelocateRam { section .textrw };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:__code_start__ { readonly section .noinit };

place in ROM_region   { readonly, block CodeRelocate};

place in RAM_region   { readwrite, block CodeRelocateRam,
                        block CSTACK, block HEAP };

使用特权

评论回复
地板
追逐浪花| | 2015-6-25 21:24 | 只看该作者
可以把32K的icf修改下,把里面的FLASH, RAM大小改一下

使用特权

评论回复
5
quray1985| | 2015-6-26 07:21 | 只看该作者
楼主现在能用了吗

使用特权

评论回复
6
jefferykkkk123| | 2015-6-26 12:38 | 只看该作者
本帖最后由 jefferykkkk123 于 2015-6-26 13:03 编辑
banyong 发表于 2015-6-25 15:47
改成后面这样,   程序会死在这里
if (__VECTOR_RAM != __VECTOR_TABLE)
    {

根据LZ链接文件来看,LZ芯片实际物理RAM大小是2KB (0x1ffffe00 - 0x20000600)。

一步步分析LZ链接文件:
1.链接文件里指定了多大的MCU系统RAM空间
define symbol __ICFEDIT_region_RAM_end__   = 0x20000000;
define symbol __ICFEDIT_region_RAM_start__ =__ICFEDIT_region_RAM_end__ - (2*1024)/4 + 0x410;
define symbol __region_RAM2_start__        = 0x20000000;
define symbol __region_RAM2_end__          = __region_RAM2_start__ + ((2*1024)*3)/4;
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __region_RAM2_end__];
以上五句明确指定了MCU系统RAM空间为0x20000210 - 0x2000600, 共1008Bytes,不足1KB
2.链接文件指定MCU系统RAM空间里放了哪些数据
define symbol __ICFEDIT_size_cstack__ = (1*1024);
define symbol __ICFEDIT_size_heap__   = (1*1024);
define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
define block CodeRelocateRam { section .textrw };
place in RAM_region   { readwrite, block CodeRelocateRam,
                        block CSTACK, block HEAP };
链接文件给系统RAM安排了4项任务,1)存放全局变量,2)存放重定向的函数代码,3)栈空间,4)堆空间
1)2)需要确定的空间,3)4)并不需要确定的空间(只是用作编译时一个基本判断),1)2)与3)4)会有点空间交越,如果编译能过,说明LZ代码里stack/heap的静态使用空间是够的,但并不能保证实际运行时一点问题没有
3.VECTOR TABLE
define symbol __ICFEDIT_region_ROM_start__ = 0;
define symbol __ICFEDIT_intvec_start__     = __ICFEDIT_region_ROM_start__;
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
define exported symbol __VECTOR_TABLE      = 0x00000000;
define exported symbol __VECTOR_RAM        = __ICFEDIT_region_RAM_start__ - 0x410;
非易失性的vector是放在起始flash地址的0x0-0x3fff,__VECTOR_RAM指向的是真正的物理RAM起始地址0x1ffffe00
以上分析初步证明LZ链接文件没有明显的问题

使用特权

评论回复
7
jefferykkkk123| | 2015-6-26 13:01 | 只看该作者
本帖最后由 jefferykkkk123 于 2015-6-26 13:03 编辑
banyong 发表于 2015-6-25 15:47
改成后面这样,   程序会死在这里
if (__VECTOR_RAM != __VECTOR_TABLE)
    {

回到LZ问题上来
改成后面这样,   程序会死在这里
if (__VECTOR_RAM != __VECTOR_TABLE)
    {
        for (n = 0; n < 0x104; n++)
            __VECTOR_RAM[n] = __VECTOR_TABLE[n];
    }
LZ应该是想执行了从__VECTOR_TABLE(0x0)到__VECTOR_RAM(0x1ffffe00)的长度为1040Bytes的数据拷贝(中断向量有256个(有必要)+16bytes长度的flash config区域搬移(这个其实没必要))
从字面上看应该是没问题,但如果执行不过则需要再提供进一步调试信息,debug跟进去看,是不是引起了hardfault,从哪里开始触发hardfault的

可以尝试一下的实验:
由于你的RAM空间很小,所以没必要完全复制256个vector,仅复制已定义的有效vector即可,多留出RAM空间给MCU系统用,KE02估计也就48个中断(16个ARM中断+32个OEM中断)
所以在链接文件里涉及到RAM地址定义的语句里的0x410全部改成0xc0,这样MCU系统RAM大小可以达到1856Bytes(0x1ffffec0 - 0x20000600),达到同样的功能,但系统RAM更大,降低了stack越界的风险,何乐不为

使用特权

评论回复
8
芙蓉洞| | 2015-6-27 21:32 | 只看该作者
看了这些回复,对我也是一个很大的提高

使用特权

评论回复
9
IversonCar| | 2015-6-27 21:57 | 只看该作者
jefferykkkk123 发表于 2015-6-26 13:01
回到LZ问题上来
改成后面这样,   程序会死在这里
if (__VECTOR_RAM != __VECTOR_TABLE)

这个回复是解决之道

使用特权

评论回复
10
舒斯特尔| | 2015-6-27 22:04 | 只看该作者
我也不太清楚需要改哪些地方,挺麻烦的

使用特权

评论回复
11
小狗爱吃骨头| | 2015-6-29 08:41 | 只看该作者
这样貌似也能下载下去

使用特权

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

本版积分规则

6

主题

18

帖子

0

粉丝