微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 解析单片机上应用的一款Boot Loader

解析单片机上应用的一款Boot Loader

时间:09-03 来源:互联网 点击:
形成可执行文件

在嵌入式系统应用程序中,可执行文件通常包括RO(Read_Only)段、RW(Read_Write)段和BSS段。当需要烧写内存中的映像文件到FLASH中时,通常都会把Boot Loader代码先移到FLASH的高地址空间中,因为通常RO的地址都是0x0,防止在烧写时覆盖本来在FLASH中已有的Boot Loader代码。程序编译、链接时要求编译器设置的Read_Only地址要和最终代码下载的地址相同,如图2所示。

Boot Loader映像文件最终运行的地址空间是0Bank,因此将RO Base设置为0x0,RW Base设置为0x0c60000,经编译后生成bin格式的可执行文件烧写到FLASH0地址处。在程序运行之前,RO段和RW段全部放在FLASH中,RO段可以直接在FLASH中运行,而RW必须调入SDRAM中才可以运行,因此,程序运行过程中RO段保持已设置完毕的0x0地址不变,而必须将RW段拷贝到RW Base即0x0c60000地址处,并将ZI段进行零初始化。



·Stage2部分

初始化硬件

Boot Loader主程序对串口进行调试并对本阶段所涉及的硬件进行检测后,通过串口下载镜像到目标机中。主代码中定义了LCD_Test()、LED_Test()、ADTest()、KeyTest()、BootSystem()等函数测试部分硬件的功能。以AD的检测函数为例简要介绍检测函数功能具体的实现。ADTest_Loop()是针对AD硬件的操作函数,而Set_UartLoopFunc()函数是把ADTest_Loop()设置到串口轮询函数数组中(串口轮询函数数组中还包括其他的检测函数),AD检测函数在对目标进行操作的同时查询是否有停止命令,如果Uart_Getch()函数没有查询到串口有输入的停止命令,调用串口轮询数组中的其他函数,否则立刻返回。



检测内存及引导系统

在Boot Loader的主程序中需要检测重要的硬件——内存,检测完毕后会分别通过串口和LCD输出提示信息。接下来会等待查询是否有键按下,当没有键按下时,正常引导操作系统,否则显示Shell Menu。

Boot Loader程序在获得系统的控制权之后,对关键硬件检测并且没有发现故障,控制台也没有发出启用Shell Menu检测菜单的情况下,根据文件系统的管理和支持,从NAND FLASH中读取操作系统或应用程序的代码到SDRAM的指定位置,然后把程序指针转移到该位置,从而使操作系统获得控制权,完成引导过程。

static void(*run)(void)=(void(*)(void))DOWNLOAD _ADDRESS,在程序中定义得此函数指针能够把指定位置的地址强制转换为函数指针类型,然后使用run()函数即可运行该地址处的指令。在实现引导功能的代码中,打开并读取指定的系统文件到指定的位置DOWNLOAD_ADDRESS(0xc080000)处即完成了装载,将程序指针指向已指定的这个位置,使用run()函数运行该地址处的指令,即可实现控制的转移。当看到屏幕上显示操作系统的启动信息后,Boot Loader完成任务,成功的引导了操作系统。



结语


本文介绍了在基于S3C44B0X的UP-NETARM3000的实验板上移植uCOS系统的Boot Loader。不同的开发板具有不同的CPU体系结构和外围硬件设备,但Boot Loader的工作机理都是类似的,明确开发板的硬件资源和具体即将移植的操作系统后,对Boot Loader进行具体裁减和修改。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top