1.自动初始化参考了RT-Thread的自动初始化,做了一些修改,这个适用在keil中,用在IAR中,需要把将rt_used做如下替换
//#define rt_used __attribute__((used))
#define rt_used __root
2.自动初始化.h文件(下面的代码都是keil适用)
#include "stdint.h"
#define rt_section(x) __attribute__((section(x)))
#define rt_used __attribute__((used))
typedef void (*init_fn_t)(void);
#define INIT_EXPORT(fn, level) \
rt_used const init_fn_t __Init_##fn rt_section(".rti_fn." level) = fn
#define __Function_AUTOInit_W25Qxx(fn) INIT_EXPORT(fn, "1.0")
#define __Function_AUTOInit_Flash(fn) INIT_EXPORT(fn, "1.1")
#define __Function_AUTOInit_Driver(fn) INIT_EXPORT(fn, "1.2")
#define __Function_AUTOInit_Command(fn) INIT_EXPORT(fn, "1.3")
#define __Function_AUTOInit_Queue(fn) INIT_EXPORT(fn, "1.4")
void Function_AUTOInit(void);
3.自动初始化.c文件
/*********************************************************************
* @fn Function_AutoInit_Start
*
* @brief 自动初始化起始地址.
*
* @param none
*
* @return none
*/
static void Function_AutoInit_Start(void)
{
}
INIT_EXPORT(Function_AutoInit_Start, "0.end");
/*********************************************************************
* @fn Function_AutoInit_End
*
* @brief 自动初始化结束地址.
*
* @param none
*
* @return none
*/
static void Function_AutoInit_End(void)
{
}
INIT_EXPORT(Function_AutoInit_End, "1.end");
/*********************************************************************
* @fn Function_AUTOInit
*
* @brief 自动初始化.
*
* @param none
*
* @return none
*/
void Function_AUTOInit(void)
{
volatile const init_fn_t *fn_ptr;
for (fn_ptr = &__Init_Function_AutoInit_Start; fn_ptr < &__Init_Function_AutoInit_End; fn_ptr++)
{
(*fn_ptr)();
}
}
4.例程
在初始化的时候调用Function_AUTOInit;
在每个需要初始化函数调用以下函数
static void Driver_Init(void)
{
Driver_UART_Init_Config();
Driver_LCD_Init();
Driver_ui_setup(&mono_ui);
Driver_ui_init(&mono_ui);
mono_app_massage_init();
Driver_Button_List_Init();
Driver_Encoder_Init();
}
__Function_AUTOInit_Driver(Driver_Init);