破解未解之谜--STM32-KEIL分散加载范例

破解未解之谜--STM32-KEIL分散加载范例_第1张图片

上面是RTT我GIT的那个基础模拟范例 这既是动态加载吧  下面的是MX我做的默认的样子

破解未解之谜--STM32-KEIL分散加载范例_第2张图片

第一行:

RTT    --keep *.o(.rti_fn.*)   --keep *.o(FSymTab)

MX     --空的

第二行:

RTT  

--cpu Cortex-M3 *.o 
--library_type=microlib --strict --scatter ".\build\rtthread-stm32.sct" 

--keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --summary_stderr --info summarysizes --map --xref --callgraph --symbols 
--info sizes --info totals --info unused --info veneers 
 --list ".\build\rtthread-stm32.map" 
-o .\build\rtthread-stm32.axf 

MX 

--cpu Cortex-M4.fp --branchpatch=sdcomp-29491-629360 *.o 
--library_type=microlib --strict --scatter "Seed_STM32L471RE\Seed_STM32L471RE.sct" 
--keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --summary_stderr --info summarysizes --map --xref --callgraph --symbols 
--info sizes --info totals --info unused --info veneers 
 --list "Seed_STM32L471RE.map" 
-o Seed_STM32L471RE\Seed_STM32L471RE.axf 

 

对比,我修改如下:

1:第一行 抄袭

2:第二行

2.1 不变

2.2不变 Seed_STM32L471RE.sct文件看下

2.3前面增加--keep *.o(.rti_fn.*)   --keep *.o(FSymTab)

2.4不变

2.5不变 Seed_STM32L471RE.map文件看下

2.6不变

因为我没有build文件夹,文件是有,如下:

破解未解之谜--STM32-KEIL分散加载范例_第3张图片

 

哦 原来第二行不能修改!!只需要修改第一行即可,后面自动修改的!

直接编译:

破解未解之谜--STM32-KEIL分散加载范例_第4张图片

 

可以看到就是链接问题!

现在增加一个.C文件(没有.H)

破解未解之谜--STM32-KEIL分散加载范例_第5张图片

已经消去一个了!!这个.C我在后面给出

测试效果很好!

/*
 * Components Initialization will initialize some driver and components as following
 * order:
 * rti_start         --> 0
 * BOARD_EXPORT      --> 1
 * rti_board_end     --> 1.end
 *
 * DEVICE_EXPORT     --> 2
 * COMPONENT_EXPORT  --> 3
 * FS_EXPORT         --> 4
 * ENV_EXPORT        --> 5
 * APP_EXPORT        --> 6
 *
 * rti_end           --> 6.end
 *
 * These automatically initializaiton, the driver or component initial function must
 * be defined with:
 * INIT_BOARD_EXPORT(fn);
 * INIT_DEVICE_EXPORT(fn);
 * ...
 * INIT_APP_EXPORT(fn);
 * etc.
 */
#include "publish.h" 
 
#ifdef __CC_ARM                         /* ARM Compiler */
    #include 
    #define SECTION(x)                  __attribute__((section(x)))
    #define RT_UNUSED                   __attribute__((unused))
    #define RT_USED                     __attribute__((used))
#elif defined (__IAR_SYSTEMS_ICC__)     /* for IAR Compiler */
#elif defined (__GNUC__)                /* GNU GCC Compiler */ 
#endif

typedef int (*init_fn_t)(void); 
 
#define INIT_EXPORT(fn, level)                                                       \
            RT_USED const init_fn_t __rt_init_##fn SECTION(".rti_fn."level) = fn 
 
						
/* board init routines will be called in board_init() function */						
#define INIT_BOARD_EXPORT(fn)           INIT_EXPORT(fn, "1")
/* pre/device/component/env/app init routines will be called in init_thread */
/* components pre-initialization (pure software initilization) */
#define INIT_PREV_EXPORT(fn)            INIT_EXPORT(fn, "2")
/* device initialization */
#define INIT_DEVICE_EXPORT(fn)          INIT_EXPORT(fn, "3")
/* components initialization (dfs, lwip, ...) */
#define INIT_COMPONENT_EXPORT(fn)       INIT_EXPORT(fn, "4")
/* environment initialization (mount disk, ...) */
#define INIT_ENV_EXPORT(fn)             INIT_EXPORT(fn, "5")
/* appliation initialization (rtgui application etc ...) */
#define INIT_APP_EXPORT(fn)             INIT_EXPORT(fn, "6")

						
static int rti_start(void)
{	printf("\r\n\r\n\r\n%s\r\n\r\n\r\n",__FUNCTION__);
    return 0;
}
INIT_EXPORT(rti_start, "0");

static int rti_board_start(void)
{	printf("\r\n\r\n\r\n%s\r\n\r\n\r\n",__FUNCTION__);
    return 0;
}
INIT_EXPORT(rti_board_start, "0.end");

//2
static int rti_board_end(void)
{	printf("\r\n\r\n\r\n%s\r\n\r\n\r\n",__FUNCTION__);
    return 0;
}
INIT_EXPORT(rti_board_end, "1.end");

static int rti_end(void)
{	printf("\r\n\r\n\r\n%s\r\n\r\n\r\n",__FUNCTION__);
    return 0;
}
INIT_EXPORT(rti_end, "6.end");




static int test(void)
{	printf("\r\n\r\n\r\n%s\r\n\r\n\r\n",__FUNCTION__);
    return 0;
}
INIT_BOARD_EXPORT(test);


static int test2(void)
{	printf("\r\n\r\n\r\n%s\r\n\r\n\r\n",__FUNCTION__);
    return 0;
}
INIT_COMPONENT_EXPORT(test2);



//void rt_components_board_init(void)
//{

//    const init_fn_t *fn_ptr;

//    for (fn_ptr = &__rt_init_rti_board_start; fn_ptr < &__rt_init_rti_board_end; fn_ptr++)
//    {
//        (*fn_ptr)();
//    }

//}

//1
void rt_components_init(void)
{	printf("\r\n\r\n\r\n%s\r\n\r\n\r\n",__FUNCTION__);
    const init_fn_t *fn_ptr;

    for (fn_ptr = &__rt_init_rti_board_end; fn_ptr < &__rt_init_rti_end; fn_ptr ++)
    {
        (*fn_ptr)();
    }

}

调用    rt_components_init();即可

INIT_COMPONENT_EXPORT(test2);会打印

附件是工程:

STM32-KEIL分散加载范例

你可能感兴趣的:(破解未解之谜--STM32-KEIL分散加载范例)