阅读源码2-分散加载icf文件

本文详细解析了STM32芯片的初始化模块代码,包括模块初始化表格定义、内存布局以及如何通过ICF文件将特定段放置在ROM区域。通过示例解释了如何使用预处理器指令和宏定义实现组件初始化,并探讨了与固件库和内存配置的关系。
摘要由CSDN通过智能技术生成
#include "modules_init.h"
#include "unit.h"
#include "iwdg.h"
#include "chipFlash.h"

modules_init_tbls  *__modules_init_start = __section_begin("__modules_init");
modules_init_tbls  *__modules_init_end   = __section_end("__modules_init");

void modules_init( void )
{
    modules_init_tbls *tp;

    for (tp = __modules_init_start; tp < __modules_init_end; tp++)
    {
        HAL_IWDG_Refresh(&hiwdg);
        if( tp != NULL)
        { 
            mdu_log(DEBUG,"%s\n", tp->name);
            tp->fun();
        }
        else
        {
        	mdu_log(ERR , "conponents init is error , start=%x , end = %x\n" ,__modules_init_start ,__modules_init_end );
        }
	}
    chip_flash_init();
}
#ifndef _MODULES_INIT_H_
#define _MODULES_INIT_H_

#include <stdio.h>
#include <stdint.h>



#pragma section ="__modules_init"  // 问题1---


#define mdu_log(level, fmt, ...)     log(level , fmt, ## __VA_ARGS__)
//#define mdu_log(level, fmt, ...)



typedef struct _component_init_tbls
{
    uint8_t     *name;
    void        (*fun)( void);
}modules_init_tbls;

  
extern modules_init_tbls  *__modules_init_start;
extern modules_init_tbls  *__modules_init_end;


#define MODULES_SELECT  @ "__modules_init"//问题2---

//问题3---
#define MODULES_INIT_EXPORT(fun , name) \
__root modules_init_tbls __modules_init_##fun MODULES_SELECT = {name ,fun}



void modules_init( void );



#endif

问题3---
MODULES_INIT_EXPORT(spi_flash_init , "spi flash");
也就是
__root modules_init_tbls __modules_init_spi_flash_init MODULES_SELECT = {"spi flash" ,spi_flash_init}
也就是
__root modules_init_tbls __modules_init_spi_flash_init  @"__modules_init" = {"spi flash" ,spi_flash_init}
简化是【问题2 不攻自破】
modules_init_tbls __modules_init_spi_flash_init = {"spi flash" ,spi_flash_init} 放置在位置 @"__modules_init" 

在icf文件 有一句话 【这就是问题1】
place in  ROM_region        { readonly section __modules_init };
参考 https://blog.csdn.net/zouli415/article/details/103728217/
也就是在ROM里面的段
原理文章 https://blog.csdn.net/dysh1985/article/details/7597105

 

此时L471的icf文件

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x0800A000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__   = 0x0800A000;
define symbol __ICFEDIT_region_ROM_end__     = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM_start__   = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__     = 0x20017FFF;
define symbol __ICFEDIT_region_SRAM2_start__ = 0x10000000;
define symbol __ICFEDIT_region_SRAM2_end__   = 0x10007FFF;

/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x1000;
define symbol __ICFEDIT_size_heap__   = 0x2000;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
define region SRAM2_region    = mem:[from __ICFEDIT_region_SRAM2_start__   to __ICFEDIT_region_SRAM2_end__];

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

initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in  ROM_region        { readonly section u_boot_cmd };

place in  ROM_region        { readonly section __conmonent_init };

place in  ROM_region        { readonly section __bluetooth_command };

place in  ROM_region        { readonly section __modules_init };

place in  ROM_region        { readonly };

place in  RAM_region        { readwrite };

place in  SRAM2_region      { block CSTACK , block HEAP};
                        

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值