|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目录5 D$ ?* o3 [2 R$ I" i
; H' n6 n" C# p
1
( o( m+ G$ i6 J6 K初识Bootloader
. T( m8 W( f( z2 E: s2 F$ U U, n* B4 C" W6 [) ]8 n0 l% G
1.1 一次Bootloader
9 v9 o O! a0 W) A# w. B% ]' Y" N0 f8 M: S& g, ^' w
1.2 二次Bootloader
7 X0 p" H/ T. ~8 b- A8 A7 x% C' b' t; z
+ K4 P5 F# D+ ^( ]0 _7 H1.3 DSP上电引导过程
) t9 {3 C& [) ?0 w$ ~
+ a s" n' F' O9 N9 |2% b5 e0 a ^& w! W4 c
关于c_int00
9 p* }7 \2 p' o
0 } `' h& M% m, N. [: r: }( r2 V6 I2.1 c_int00完成的工作
8 C7 H: E7 m1 \' t1 X
0 _3 @9 w. p% G# e/ h2.2 系统初始化
9 i9 I9 P+ C, N0 b# v
: e1 @6 R+ ?7 P' C. E/ L W2.3 全局变量初始化
" [; i9 J& D0 V6 J0 ~( p: W, P
4 s2 H: i( e5 b8 p2.4 全局对象构造
5 D$ c8 H. [" C- e& M% L9 i' f: ?0 ^0 @& l. z
2.5 mAIn函数与exit函数的调用
7 _7 c5 U$ n* Y7 n# y; r" |) O8 W1 @2 \1 X/ f3 W* R$ k S4 I8 D
35 ] L0 I* x0 z8 x% e" W- o
CMD文件与DSP存储空间9 M" K( g6 ^- L' q1 s4 p% h$ L
1 y3 m7 }, X3 }. w9 ~
3.1 MEMORY和SECTIONS指令1 b+ W4 |( d8 u4 V9 I3 Y
! N3 W. W% V! L. V9 u
3.2 程序与数据“段”
. \ f& ^# x4 p7 \1 ~! ~# W$ H) k+ b1 U+ ]; D
44 G1 k! h Z; j0 V8 d' U8 \% o
Bootloader数据流
. t: o) y: s" g5 D( f$ m, U
4 ]$ r8 u! z7 |: k! p4.1 数据流结构
) d% X' y8 } W% e6 {
% h* ]: x/ b% g+ i9 G7 C4.2 16-bit数据流
; O& V; Z1 U+ L5 X; X* ^/ K! e
2 X; J" ]- i* Q( B+ K4.3 8-bit数据流) E4 @" Z0 o/ ^/ F4 @! w+ [
# p g) S- @: H, ~& a5
/ q2 x* L+ v4 Q& q9 KFLASH擦写操作 —— FLASH API的使用
- N, x8 R2 g( u3 T+ U; {3 C4 q4 C1 \* r. O7 }. K9 _
5.1 FLASH操作的重要特点
5 M/ ~( Q6 {9 @8 y- v! h% E- x$ t0 K- o1 r
5.2 FLASH API使用步骤
& u$ u; H: }* L) t- H R0 ]. U+ J' I7 p; F! R) R% c7 E( k
5.3 FLASH API常用函数使用举例
, S' {! `0 p- e3 U- j4 _
3 Y% n7 _: f" }( L1 ]6
- _7 m2 y7 t- F% }, hBootloader设计过程中的9大关键点
/ S/ E C& \" J& C& O- P0 D/ Z# x' S# Q* s: f4 B! G
6.1 Bootloader程序在升级过程中不被擦除的实现方法9 a. |- T0 k% q( l6 u
, o% e# F; @0 {9 U: |6.2 上电后先进入Bootloader再跳转至main()函数的实现方法6 a/ g/ a0 K$ i) p/ I+ R* j7 f2 v4 D
3 p3 P9 f9 b# N% o# r9 z$ E" p
6.3 Bootloader程序作为CCS应用程序工程一部分的实现方法% f4 t& ?5 P; m# T1 y4 i0 C
$ W/ o. ?+ o, u9 A: W
6.4 Bootloader与上位机形成交互式通信
: A$ f6 E3 r t! ]9 @
3 J% a) I/ Z' g6.5 Bootloader程序能够对接收数据校验的实现方法
4 S, \. z% \, \- }! w* O' @
% x9 k; {! u+ e* k* C/ `( S- b6.6 在数据出错等情况下能够自动重启的实现方法
% I. [+ ?+ T9 E7 n+ ~
) `- K6 G5 _# f/ g; n- P7
7 R- @0 Q. {9 V% Z3 Z- ICCS输出文件格式 —— ASCII-Hex、Intel-Hex与Binary-Hex文件
+ ?- ~9 u" F0 @+ z4 e
: R% o0 C: z& s% T3 T! \7.1 CCS配置生成Hex文件的方法! e3 h7 n. }# d' e3 @) `% d
7 f% G% M( V }! }
7.2 ASCII-Hex
$ `4 y7 m+ O* t
, T; T2 Y- O8 s$ h3 }7.3 Intel-Hex
- r% Z2 e( B3 ?& y2 i- H) a% R! k' |* d' U: t7 u5 J" q$ Y
7.4 Binary-Hex0 I T8 y: ?2 {' o
0 l0 J1 m3 F& r8 S0 ^2 D
" ?! G+ i/ X/ D. Q' P
4 ^4 `: g( d) f+ D1 }6 G0 u0 t) H5 ?# D4 z3 Z
2 关于c_int00
3 k2 G& i, S5 @, V( E% q$ F) ~8 V( u
“c_int00在跳转至main()之前都做了些什么”
4 A: T! P0 X( a; D% ]# ]/ |* w/ J5 G4 ^ n8 S) Z6 Z& i
在设计Bootloader时,非常有必要对c_int00函数进行全面了解,因为通常会对它进行改写。* K- d* i$ _! G! Y$ U9 K
- \5 T- U, t0 R' a' m/ V9 |7 W
c_int00(也作_c_int00)是C/C++程序初始化代码的入口地址,完成建立C程序的运行环境。它是运行支持库(如rts2800_ml.lib)中的一个重要函数。- {* w1 p( O3 L
7 A- a; Y) h) W" s6 [
DSP上电时,由Bootloader负责引导至c_ini00,具体引导过程见1。1 P5 q: r2 z; J# s
" a A) x5 M% k" Q; Y8 A2.1 c_int00完成的工作6 t. C2 v* b0 b1 U* t% `! d/ ^
5 C$ i' g, P. v1) 定义系统栈.stack,并初始化栈指针,配置相关寄存器7 i& p- ~2 U" O
, o/ V( n& Z& Q2) 初始化全局变量(.cinit)7 n' j; O) }/ Z' U
1 D3 m0 K, w2 a5 z* b) ?
3) 若使用C++,还会完成全局对象构造(.pinit); T# V7 {: y. ~, W1 `
6 ?+ c! b# U& A P8 U% z/ I7 K
4) 调用main函数运行C程序
7 u( G3 ]2 b$ t! k! w0 f1 |
, i1 G/ |1 Q" I" s5) 当main函数return时,调用exit函数" _- U( f) J- M$ W% {0 g- m0 Z: E
( _' g6 z) t/ U u3 T' [
用户可以对c_int00函数进行修改,但修改后的函数必须完成以上任务。
5 [6 W1 W. [) k j
1 U; s6 L- {2 T: w2.2 系统初始化
( M/ U E" n6 k1 |: m; Q8 W" f: d5 S3 F
在TI官网找到了rts2800_ml.lib对应的boot.asm源文件,其中核心内容为c_int00函数,其中关于“定义系统栈.stack,并初始化栈指针,配置相关寄存器”等系统初始化的部分如下1 l6 `, X: r; C9 O
1 i5 J: B8 i' ~# ~
- p' R5 a8 u9 E7 x% o* B7 X* P
g8 E0 a) o K5 `0 n! ]% C8 O. D/ ]
$ ^( t5 u) _: i |
|