#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};