zoukankan      html  css  js  c++  java
  • 【AT91SAM3S】英蓓特EM-SAM3S开发板例子工程中的启动文件分析

    手上一块英倍特的EM-SAM3S开发板,拿到已经有一个月了。本来是做uLoong活动使用的板子,可当初由于不熟悉这个芯片,使用了STM32F4当作了替代。最近准备抽点时间折腾下这个板子。

    这个板子的资源如下:

    MCU:ATMEL Cortex M3 AT91SAM3S4C (主频 64MHz )

    FLASH:片内256KB,片外2Gb NandFlash

    SDRAM :片内48KB

    接口:MicroSD I/F、LCD I/F、RS232 I/F 、USB I/F、JTAG I/F、 Audio I/F 、RS485 I/F

    其他功能:RTC、LED×2、USE Button、Zigbee、QTOUCH接口、Free IO、AD

    电源:USB供电或者外接5V电源

    今天从启动开始看看。以下内容是我分析英倍特提供的例程时的产物。

    【预备知识】

    Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。

    【启动分析】

    在例子程序中,MCU启动时,会将vector中定义的第二个地址作为程序的入口地址。即Reset_Handler。

    至于为什么会从vector加载,可以查看分散加载文件(.sct)。这里有这么一段:

    Vector_region 0x400000

    {

        board_cstartup_keil.o (vectors, +FIRST)

    }

    这个声明就是让链接器将board_cstartup_keil.o加载到0x400000。

    而0x400000就是内部flash的起始地址:

    clip_image002

    board_cstartup_keil.o由board_cstartup_keil..c生成。这个文件中,定义了两个东西:__vector_table[]和static void _Reset_Handler( void )

    __vector_table就是中断向量表,__vector_table的第二个地址就是_Reset_Handler。因此,MCU启动时将向量表加载完成后,就开始执行_Reset_Handler这个函数。

    在这个函数中跳转到main函数。好了,花花丽丽的C开始了。

    (至于为什么加载到了0x400000是__vector_table而不是_Reset_Handler,那是因为那个+FIRST这个属性)

    【总结一下】

    1、在分散加载文件中,设置程序加载到的位置。加载到0x400000这个地址的,就会在启动时候执行。

    2、这里的启动文件有很简单的两个东西,中断向量表和函数_Reset_Handler。中断向量表的第二个地址就是复位中断程序入口地址。

    3、汇编文件workaround.s没用了。删掉里边的内容都没关系。于是一行汇编代码都没有了,这也算是自己写sct文件的好处吧。

  • 相关阅读:
    时序图
    用例图
    欢迎界面(闪屏)
    WBS
    闲来听书
    软件团队的模式
    结对编程
    在个人项目中,找bug,审核代码.
    时序图
    部分功能的实现
  • 原文地址:https://www.cnblogs.com/zyqgold/p/3201527.html
Copyright © 2011-2022 走看看