zl程序教程

您现在的位置是:首页 >  工具

当前栏目

学习ARM开发(9)

2023-09-14 09:10:39 时间
学习ARM开发(9)

上一次把引导的汇编看完,已经准备C的运行环境,下面就开始学习C的源程序,从start.S文件里到跳文件
lib_arm/board.c里运行.
/*
引导程序从汇编start.S里跳到这里执行。
蔡军生 2005/07/19
*/
void start_armboot (void)
{
        /* 声明一个全局指针,它是指向一个数据结构,用于保存参数。
        并且它占用r8寄存器,用它来保存内存地址,达到全局使用目的。
        */
        DECLARE_GLOBAL_DATA_PTR;

        ulong size;
        init_fnc_t **init_fnc_ptr;
        char *s;

#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
        unsigned long addr;
#endif

        /* gd指针可写,因为已经分配一个寄存器给它作为变量。
        这里就相当于把后面算出来的地址保存到r8寄存器.
        */
        gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));

        /* 下面一句是阻止3.4以上版本的GCC进行代码优化,把后面的代码删除掉。 */
        __asm__ __volatile__("": : :"memory");

        /* 清空gd指向的结构 */
        memset ((void*)gd, 0, sizeof (gd_t));

        /*  */
        gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
        memset (gd->bd, 0, sizeof (bd_t));

        monitor_flash_len = _bss_start - _armboot_start;
这一段准备好保存参数的全局变量区.
后面就是一系列的初始化和获取正确的参数.