MPC563 boot start 函数是针对嵌入式PowerPC处理器MPC563的一种特定启动流程实现,主要用于在处理器启动时初始化硬件和执行必要的设置,以引导程序执行。该函数通常位于系统的启动代码区,例如`__start.c`文件中,并且是基于EABI(Embedded Application Binary Interface)标准的链接器和初始化协议。 首先,我们看到文件包含了一些预处理器宏定义,如`USE_FAR_ADDRESSING_TO_TEXT_SECTION`,它可能用于在不同地址模式下处理文本节。`__mem.h`、`__ppc_eabi_linker.h`和`__ppc_eabi_init.h`是与PowerPC架构相关的库头文件,提供了处理器特定的内存管理和初始化功能。 `main()`函数作为应用程序的主要入口点,在这里并未直接调用,而是通过`__start`函数间接启动。`__start`函数是用汇编语言编写,接收命令行参数`argc`、`argv`和`envp`,并且在不同的操作系统环境下有不同的初始化行为。如果目标系统不是EPPC VxWorks,会执行`bl__init_data`,这可能是加载数据段的初始化。 在`__start`函数的开始,它检查当前地址模式是否支持远地址寻址,如果是,则跳转到`bootloader`,否则将堆栈指针(R1)保存到内存,然后清零R0和R1寄存器。接下来,通过比较R0的内容(可能代表某种条件),决定是否执行引导加载器(`bootloader`)或继续执行初始化过程。 值得注意的是,`mtmsrr3`和`mtlrr3`指令用于设置处理器状态寄存器(MSR),可能涉及到异常处理和系统控制。此外,`lisr`和`orir`指令用于设置寄存器值,`lwz`用于加载字节或单词,而`stw`则用于存储数据。 最后,如果在`USE_FAR_ADDRESSING_TO_TEXT_SECTION`宏下,`__init_user`标识符可能指示需要使用特定的方式处理初始化数据,比如将其映射到非默认的用户空间地址。 MPC563 boot start 函数是嵌入式开发中的关键组成部分,它确保了处理器在启动时正确配置硬件环境并加载和初始化应用程序,以便后续正常运行。了解这些细节对于理解和调试这类代码至关重要。
#include <__mem.h> #include <__ppc_eabi_linker.h> #include <__ppc_eabi_init.h>
extern void main();
#ifdef __cplusplus extern "C" { #endif
#ifdef __cplusplus } #endif
mrr14, argc mrr15, argv mrr16, envp
#if __option(little_endian) oris r3,r3,0x0001 mfmsr r3
#endif
#if __SPE__
mtmsr r3 ori r3,r3,0x0001
bl__init_registers bl__init_hardware
__start.c
__declspec(section ".init") extern void __start(int argc, char **argv, char **envp); __declspec(section ".init") extern void exit(int);
asm void __start(register int argc, register char **argv, register char **envp) { nofralloc lis r9,0x0017 ori r9,r9,0xFFF8 lwz r10,0(r9) lis r9,0x0017 ori r9,r9,0xFFFC lwz r11,0(r9) lis r8,0xFFFF ori r8,r8,0x0000 lis r9,0xFFFF ori r9,r9,0x0000 xor r3,r11,r9 xor r4,r10,r8 or r0,r4,r3 cmpwi r0,0 bne bootloader lisr3,0x0001 ori r3,r3,0x0004 lwz r3,0(r3) mtlr r3 blrl bootloader:
stwur1, -16(r1) #else stwur1, -8(r1) #endif lir0, 0x0000 stwr0,0(r1) lir0, 0xFFFF stwr0, 4(r1)
#if __dest_os != __eppc_vxworks bl__init_data #endif #if defined(USE_FAR_ADDRESSING_TO_TEXT_SECTION) lis r3,__init_user@ha addi r3,r3,__init_user@l mtlr r3 blrl #else bl__init_user #endif
#if defined(USE_FAR_ADDRESSING_TO_TEXT_SECTION) lis r6,main@ha addi r6,r6,main@l mtlr r6 mr r3, r14 mr r4, r15 mr r5, r16 blrl #else mr r3, r14 mr r4, r15 mr r5, r16 blmain #endif
#if defined(USE_FAR_ADDRESSING_TO_TEXT_SECTION) lis r6,exit@ha addi r6,r6,exit@l mtlr r6 blrl #else bexit #endif }
#pragma overload void __init_registers(void); asm extern void __init_registers(void) { nofralloc
__start.c
extern void __copy_rom_section(void* dst, const void* src, unsigned long size) { if (size && (dst != src)) { memcpy(dst, src, size); __flush_cache( dst, size ); } }
extern void __init_bss_section(void* dst, unsigned long size) { if (size) { memset(dst, 0, size); } }
lisr1, _stack_addr@ha addir1, r1, _stack_addr@l
下载后可阅读完整内容,剩余1页未读,立即下载
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦