/******************************************************************************

           Copyright @2024 - 2044 Shenzhen dcenzix Technology Ltd.

 ******************************************************************************
@file cola_init.c
@brief
@author xiexiongwu
@version V1.0
@date 2024年5月25日

******************************************************************************/

/*----------------------------------------------*
 * 包含头文件                                   *
 *----------------------------------------------*/
#include "cola_init.h"


/*----------------------------------------------*
 * 函数原型说明                                     *
 *----------------------------------------------*/
/**
 *@brief 在指定的段中,调度相关的函数
 *
 *@param void
 *@return void
 *
 */
void do_init_call(void)
{
#if defined(__CC_ARM)                         /* ARM Compiler */
    extern initcall_t initcall0init$$Base[];
    extern initcall_t initcall0init$$Limit[];
    extern initcall_t initcall1init$$Base[];
    extern initcall_t initcall1init$$Limit[];
    extern initcall_t initcall2init$$Base[];
    extern initcall_t initcall2init$$Limit[];
    extern initcall_t initcall3init$$Base[];
    extern initcall_t initcall3init$$Limit[];

    initcall_t *fn;

    for (fn = initcall0init$$Base; fn < initcall0init$$Limit; fn++)
    {
        if (fn)
        {
            (*fn)();
        }
    }


     for (fn = initcall1init$$Base; fn < initcall1init$$Limit; fn++)
     {
         if (fn)
         {

            (*fn)();
         }
     }

    for (fn = initcall2init$$Base; fn < initcall2init$$Limit; fn++)
    {
        if (fn)
        {
            (*fn)();
        }
    }

    for (fn = initcall3init$$Base; fn < initcall3init$$Limit; fn++)
    {
        if (fn)
        {
            (*fn)();
        }
    }

#elif defined (__GNUC__)
    extern initcall_t __initcall0_start[];
	extern initcall_t __initcall0_end[];
	extern initcall_t __initcall1_start[];
	extern initcall_t __initcall1_end[];
	extern initcall_t __initcall2_start[];
	extern initcall_t __initcall2_end[];
	extern initcall_t __initcall3_start[];
	extern initcall_t __initcall3_end[];
	extern initcall_t __initcall4_start[];
	extern initcall_t __initcall4_end[];

	for (initcall_t *fn = __initcall0_start; fn < __initcall0_end; ++fn) {
		if (*fn) (*fn)();
	}
	for (initcall_t *fn = __initcall1_start; fn < __initcall1_end; ++fn) {
		if (*fn) (*fn)();
	}
	for (initcall_t *fn = __initcall2_start; fn < __initcall2_end; ++fn) {
		if (*fn) (*fn)();
	}
	for (initcall_t *fn = __initcall3_start; fn < __initcall3_end; ++fn) {
		if (*fn) (*fn)();
	}
	for (initcall_t *fn = __initcall4_start; fn < __initcall4_end; ++fn) {
		if (*fn) (*fn)();
	}

#endif // defined
}



