|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目录
% ?8 u1 c% b% n% {. m! [
; ?" x- U- s' l; x% ?15 W$ K/ V2 R) X- k
初识Bootloader* I' j) n; t& i$ r% {7 ^, S
, K: `. r/ ?% r u x8 Y. \1.1 一次Bootloader& g: u7 r8 [. g( C" V
8 l4 s& n; T, v6 |9 g0 C1.2 二次Bootloader
8 t& z1 J, g) E; H( m( M6 P. \3 {" W2 k: C {/ e2 X
1.3 DSP上电引导过程% l9 g ?8 p1 e, Q i* F4 w
+ L' \) L: L1 `: h% f* m
2
1 m1 u! p: X8 l关于c_int00% d! s, n% l0 R: ^) `2 F
, f, k8 [/ {- i$ M* D: H' H* B, ~2.1 c_int00完成的工作8 N5 {5 x! u3 U o8 v1 M1 l) Q
7 p8 O/ |( @- q& s0 {2.2 系统初始化3 r7 p* [4 b9 S$ a' j& M
/ L- o2 o- e8 a+ D- ]4 k3 _
2.3 全局变量初始化
; f' H( N9 n# E# f
& {7 a* q) m* J2.4 全局对象构造/ _% i& w5 T$ z' E
8 f8 R6 ^; D- w+ Q P) y
2.5 mAIn函数与exit函数的调用
( Z8 j4 F: g6 G7 a8 N! t+ G# ?$ n/ N- S
3
3 q8 L6 l7 B4 ?7 o9 g5 `CMD文件与DSP存储空间' w" B0 {0 Z1 }8 Q
) b4 K8 Z/ u1 U0 F8 t8 B
3.1 MEMORY和SECTIONS指令! p1 |6 |0 Q8 O6 P5 L" I' V" E
! t. T9 S. v" M* ^2 _% n9 T3.2 程序与数据“段”$ U. r* k5 b Z: z
4 w! h$ U+ @5 T. w) `) M- Y1 @! q& t4
4 \+ y5 X+ Z7 j, IBootloader数据流( M0 M- P8 B3 E- d/ v1 |
# z7 R H9 b4 G {, Y, R4.1 数据流结构" @/ ^4 N' q# N* x$ p5 k, j; z( `
9 a% u- G- A) I: C
4.2 16-bit数据流
4 |: f- N! P. F9 L X; c; |
; @% i* c. |/ Q. y9 s L4.3 8-bit数据流
* m0 @+ x5 Q, f9 A& s+ _0 E% w; J$ q) a9 {8 h
58 G& l2 I2 C+ w; i
FLASH擦写操作 —— FLASH API的使用; r- ?) E4 K9 ~. _6 [% j
6 p4 `0 z0 T# g1 F1 N5.1 FLASH操作的重要特点
8 d0 E! f5 d& |$ i! I1 s/ m1 l, x8 y& s; x0 B1 f% ]
5.2 FLASH API使用步骤2 ~) k a W& {8 z, q( ?, K+ I. r7 l$ E
, ]6 Z! Q; d/ f2 k0 T+ j
5.3 FLASH API常用函数使用举例( M' q* x* f# Z2 _& ?
5 x! S5 Z, j: A) W* z. |' R( B0 a
6
! e) ^/ m" O) w$ w) M7 j6 pBootloader设计过程中的9大关键点! ]: ^& j- L" O. {1 x$ |+ @
$ k3 [. e& m3 H8 j
6.1 Bootloader程序在升级过程中不被擦除的实现方法
6 [/ [- B9 X0 P b' Z: S. n, A X" ?0 T' J. T0 C
6.2 上电后先进入Bootloader再跳转至main()函数的实现方法! |( ^8 Q q: j+ M0 i
, d9 X u; d* F- h( c) R& W9 Y6.3 Bootloader程序作为CCS应用程序工程一部分的实现方法
# f; ]' a6 v$ u* u
b1 G# K7 M9 I3 ?9 z: i! }6.4 Bootloader与上位机形成交互式通信
: d p$ _6 E1 j$ ?+ f- U6 { o8 V
* Q' G+ B, [8 X2 e6.5 Bootloader程序能够对接收数据校验的实现方法3 M8 [2 L2 W8 i6 C8 M4 Y
9 J" i4 P& P3 [+ i' a
6.6 在数据出错等情况下能够自动重启的实现方法 ]0 x8 p( h+ ~* q$ ]
- w$ d U) [6 W: U) v' ^
71 a/ }" |7 J2 J/ N
CCS输出文件格式 —— ASCII-Hex、Intel-Hex与Binary-Hex文件
( ^& A- z3 X, \2 T( `" J1 K7 I4 M# Z( H! a
7.1 CCS配置生成Hex文件的方法
# t, G5 q3 g" x! Q# e
# X8 w5 @( r4 ^ F7.2 ASCII-Hex
0 O" j7 I& d& R: k5 H' u1 Y
# b2 h" z0 n" [ M7.3 Intel-Hex
( S, T- D' D G& Q/ p* w: t
6 X' E8 f- o8 Z$ c6 D6 n7.4 Binary-Hex
2 C# _ e y; v; O( `& S, ~( y% y% P9 i/ Z4 Y
$ r( T6 R$ P. s: r# b1 [1 h
5 V) ?8 a, J4 m. } \4 [% b# w1 `' R: Z8 {: M0 b' Y7 z
2 关于c_int00# {5 D& {1 v" J- O- X9 O
/ A# l! w4 B' _) k
“c_int00在跳转至main()之前都做了些什么”
# _' D+ j0 K( b1 Y# h* v+ O( z) ?" |. O! Y; O1 I1 Q; k) Z/ c: W
在设计Bootloader时,非常有必要对c_int00函数进行全面了解,因为通常会对它进行改写。/ Y9 P+ N* ?9 u; P- x
4 o% L- m( q# G' ]: p9 w+ f
c_int00(也作_c_int00)是C/C++程序初始化代码的入口地址,完成建立C程序的运行环境。它是运行支持库(如rts2800_ml.lib)中的一个重要函数。
$ O6 @5 ~- v' y# z
, t6 i7 \4 F1 A8 l' kDSP上电时,由Bootloader负责引导至c_ini00,具体引导过程见1。" {6 K2 b; d- S5 t
# `. u* U0 P# O/ ^& {* k) l2.1 c_int00完成的工作
$ P" B2 v" v5 J6 Y5 [
( y! c' Y! _0 w+ z1) 定义系统栈.stack,并初始化栈指针,配置相关寄存器
. S# M% c1 s3 _, }# k$ l, o% p2 S6 I* U
2) 初始化全局变量(.cinit)
. _: Q: Q5 J/ i9 |/ |. r0 M3 m1 u" J
/ d+ i7 ^* V/ X& j! V3) 若使用C++,还会完成全局对象构造(.pinit)
8 `! D" L" M. \+ F/ T4 x
F3 ]$ r" w) I5 g' `7 g; B% f4) 调用main函数运行C程序+ Y( r! J5 s6 c" g
7 E) H8 u2 E* @5) 当main函数return时,调用exit函数* x* |3 W9 S, m) s/ r0 Q& E2 h
- d) M6 R7 K5 o- v3 {7 b用户可以对c_int00函数进行修改,但修改后的函数必须完成以上任务。
$ @2 l' q! v o8 {. w( Z6 V' u! F
" F; b) @. x1 o6 C7 c/ n* ^8 u2.2 系统初始化4 E Y: k4 v- U( A, d) Z
+ ^5 k/ n+ a, A2 N, y# s S在TI官网找到了rts2800_ml.lib对应的boot.asm源文件,其中核心内容为c_int00函数,其中关于“定义系统栈.stack,并初始化栈指针,配置相关寄存器”等系统初始化的部分如下
9 ]8 ^) r2 H9 c7 E* f. ^6 o5 u; m. }) t% G" g
6 Z* d, Z4 i& t c
# a. U1 g7 s! k: v* o' j. Z4 C8 u, O7 Z+ n' D5 P
|
|