06 嵌入式软件系统设计
- 格式:pdf
- 大小:816.54 KB
- 文档页数:11
27
28
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
SDRAM中的异常向量
起始地址0x0c000008 除复位异常外,其余异常入口地址由FLASH跳转得到 0x0c000008: 0x0c00000C: 0x0c000010: 0x0c000014: 0x0c000018: 0x0c00001C: 0x0c000020: 0x0c000024:
特征
1. 与处理器以及硬件配置密切相关,通常用汇编语言编写; 2. 程序复位运行入口点。
3
4
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
小型启动代码分析-流程
ramstart.s 设置异常跳转表 C_Main 关闭中断,寄 存器配置 堆栈初始化 C例程全局变 量初始化 跳转到高级语言程 序入口C_Main 软件环境初始化 硬件初始 化 调用7段数码 管测试程序 led.c
程序代码和数据的在存储器中的存储
嵌入式软件的代码和数据组织非常灵活 1. 代码段、只读数据段、可写数据段以及堆栈段分开存 放;各自的起始地址可以根据需要来设定; 2. 程序入口也可以由设计者任意设定。
17
18
3
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
程序的链接定位
链接定位是系统级软件开发过程中必不可少的一部分,嵌入式 软件开发均属于系统级开发; 链接定位过程一般由链接器根据链接定位文件完成,比较简单 的系统,可以通过设置链接器开关选项取代链接定位文件; 链接定位的关键是链接定位文件的编写。
6
*/
1
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
小型启动代码分析-处理器配置
2. 关中断
ldr ldr str ldr ldr str ldr ldr str r0,=INTCON r1,=0x07 r1,[r0] r0,=INTMSK r1,=0x07ffffff r1,[r0] r0,=WTCON r1,=0x0 r1,[r0] /*#Interrupt control register. */ /*#non-vectored mode,disable IRQ,disable FIQ. */ /*#Interrupt MASK register. */ /*#disable all(30) interrupt sources.*/ /*#watch dog disable*/
15
启动代码的搬迁
RAM的存取速度要优于FLASH,为了提高程序的运行速度, 我们通常将启动代码搬迁的RAM中运行。
copy_code_to_ram : ldr ldr ldr next : ldr str cmp bne r0,[r1],#4 r0,[r2],#4 r1,r3 next
16
r1, =0 r2, =0xc700000 r3, =0x10000 /* 64K Bytes */
进入模式 管理模式 未定义模式 管理模式 中止模式 01C
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
系统存储器映射图
FLASH中的异常向量
B LDR LDR LDR LDR LDR LDR LDR ResetHandler /* for reset vector */ PC, =0x0c00000c /* Undefined instruction */ PC, =0x0c000010 /* SWI PC, =0x0c000014 /* Prefetch abort PC, =0x0c000018 /* Data abort PC, =0x0c00001c /* Reserved PC, =0x0c000020 /* IRQ PC, =0x0c000024 /* FIQ */ */ */ */ */ */
小型启动代码分析-调用高级语言入口
5. 进入C代码入口
goto_main : B Main
9
10
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
小型启动代码分析-应用程序的启动
void Main() { Test_Seg7(); } void Test_Seg7(void) { while(1){ *((U8*) 0x02000006) = 0x00; *((U8*) 0x02000004) = seg7table[0]; …… } }
22
}
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
程序入口的指定
2. 通过工程设置来指定
嵌入式操作系统
Linux Windows CE uC/OS II uClinux Nucleus
23
24
4
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
嵌入式操作系统的选择和移植
1. 操作系统的选择 确定具体需求,选择商业操作系统或免费开源的操作系 统; 2. 操作系统的移植 根据自己的硬件平台进行移植和裁减
启动代码的操作模式
启动加载模式:这种模式也称为"自主"(Autonomous)模式。也即BootLoader 从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没 有用户的介入。这种模式是BootLoader的正常工作模式。 下载模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接 等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等。 从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被 BootLoader写到目标机上的固态存储设备中。BootLoader 的这种模式通常在系 统更新时使用。工作于这种模式下的 BootLoader 通常都会向它的终端用户提 供一个简单的命令行接口。
8
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
小型启动代码分析-C语言全局变量清0
4. 数据区初始化-bss段清零 startram : LDR MOV LDR CMP BEQ clear_loop : STR CMP BNE a1,=Image_ZI_Base /* Pickup the start of the BSS area */ a3,#0 /* Clear value in a3 */ a2,=Image_ZI_Limit /* Pickup the end of the BSS area */ a1,a2 move_data a3,[a1],#4 a1,a2 clear_loop /* Clear a word, a1 += 4 */ /* end of ZI ? */ /* If not, continue with the BSS clear */
13
14
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
控制启动的设备
串口通讯是最简单也是最廉价的一种双机通讯设备,所以往 往在BootLoader中主机和目标机之间都通过串口建立连接, BootLoader 程序在执行时通常会通过串口来进行 I/O,比 如:输出打印信息到串口,从串口读取用户控制字符等。 采用其他通讯设备,如果认为串口通讯速度不够,也可以采 用网络或者USB通讯,那么相应的在BootLoader中就需要编 写各自的驱动。
嵌入式软件开发的关键技术
典型的链接定位脚本文件
SECTIONS { . = 0x0C000000; .text : { *(.text) } .rodata : { *(.rodata) } Image_RO_Limit = .; Image_RW_Base = .; .data : { *(.data) } Image_ZI_Base = .; .bss : { *(.bss) } Image_ZI_Limit = .;
21
程序入口的指定
1. 通过链接脚本指定;
ENTRY(__entry) /* __entry 必须为全局函数/标号 */ SECTIONS { . = 0x0C000008; .text : { *(.text) } .rodata : { *(.rodata) } Image_RO_Limit = .; ……
1
3. 编译过程中产生的一些问题及解决办法。
2
嵌入式软件开发的关键技术
嵌入式软件开发的关键技术
启动代码的功能和特征
启动代码是处理器上电复位时运行的一段代码
启动代码的最小流程
设置异常跳转表 寄存器配置 存储区配置 堆栈初始化 C例程全局变 量初始化 跳转到应用程序入 口C_Main
功能
1. 配置处理器的工作模式,初始化硬件; 2. 为高级语言编写的程序准备环境,并引导高级语言编写的代码; 3. 启动代码的最终目的就是启动应用程序或引导操作系统。
小型启动代码分析-异常向量
1. 设置异常入口 __entry : b b b b b b b b
5
ResetHandler . . . . . HandlerIRQ .
/* Reset vector */ /* Undefined instruction */ /* SWI */
/* Prefetch abort */ /* Data abort /* Reserved*/ /* IRQ /* FIQ */ */
简单的链接定位脚本文件
SECTIONS { . = 0x0C000000; .text : { *(.text) } .rodata : { *(.rodata) . = 0x0C700000; .data : { *(.data) } .bss : { *(.bss) } }
19 20
}
嵌入式软件开发的关键技术
提纲
嵌入式软件开发的关键技术
第六章 嵌入式软件系统设计
1
嵌入式软件开发的关键技术
内容提要
嵌入式软件开发的关键技术 1. 嵌入式软件启动代码的组织和编写; 2. 程序的链接定位与链接脚本;