|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目录
% h% S4 S. N1 k; U9 A+ H6 J& p/ p, g" N
+ e/ H0 [. i9 D8 s3 d1 S# P) m& f5 B! X
初识Bootloader- b8 J; e" u) ^& s$ |/ y! r4 f6 D
* u3 \2 \9 j g8 H7 u
1.1 一次Bootloader. N% X3 a `* z1 z. u/ ^' N
. ]. a" C# e+ D- f1.2 二次Bootloader' }- L) X! x* i$ f& }
$ ?1 m- y. v& A& ?1.3 DSP上电引导过程
, o6 V! U+ K4 j+ t0 H) [' o
. a; t7 n8 j, k* U& \& ` u! v I2
% f5 k N, d7 }: Y4 v关于c_int00! F8 G7 L6 @4 Y9 L* |2 w
9 b5 ~$ h' U- E! `2.1 c_int00完成的工作
4 _# N# c! O* f- q+ m9 A2 D+ h% ^9 x) r1 D i" Q
2.2 系统初始化
/ E0 l, U' s G8 ?% W2 N+ {- ?
+ v' p+ [3 j ?8 Q2 Q. A1 Z' N2.3 全局变量初始化
4 m [/ A/ _* j% i
; p+ M) F" Y! U6 f8 {2.4 全局对象构造
( x: d D( D2 ~+ m5 c' ?- T3 K- [- U& s: l
2.5 mAIn函数与exit函数的调用
6 r. }. y Z5 F# `9 j6 S/ P+ i
% n; c5 u/ J# u& [3
! X! l0 K% _7 \; ` _. s+ rCMD文件与DSP存储空间. U# y: o# X, O& _/ p
- u9 N" F* p- Z
3.1 MEMORY和SECTIONS指令
5 ]6 S4 F m/ D4 i2 `$ j4 J& A4 _- ]+ }6 J8 g) {% S, f& f
3.2 程序与数据“段”
. G A2 \6 \4 M2 x4 @: j2 j$ y$ A# {1 E; X+ F$ r
4. b D8 X0 y- s6 ^" _ {% D- x
Bootloader数据流
, a+ @4 O. ^' q( m: r5 ^1 }" } B1 y) @5 B) L& T$ p
4.1 数据流结构
$ I. b( m L# A+ _+ V, F
( y! x" }5 n5 I4.2 16-bit数据流
" i" { U8 T+ d4 U x1 K7 |. E+ i7 r' B* o9 [
4.3 8-bit数据流. z4 l% t! P; V5 e' v1 B9 M/ _
~2 q+ P4 X7 O5 ~, {
53 |. n. D# ^' x) U+ f
FLASH擦写操作 —— FLASH API的使用
6 F+ |$ X& K' o m! r4 f6 V" e) u1 B% x: I, w. n2 S& b
5.1 FLASH操作的重要特点$ B0 v# `- d) F5 p* e4 |
6 O4 J3 k- X5 i( o
5.2 FLASH API使用步骤
6 i% ^" Q: H" b7 `* c" l+ A
! K0 a& ~3 }+ }; H4 [( W5.3 FLASH API常用函数使用举例3 q+ t: I/ F: J) o
. R4 l' [4 G8 Q
6
/ i) K+ ]3 ~& c" t' k) rBootloader设计过程中的9大关键点
- a1 J, r% I; e+ U3 N4 q r9 g& H* W, S! F3 y
6.1 Bootloader程序在升级过程中不被擦除的实现方法! f! n- ~) N3 Q, c, u5 @
8 F/ O6 E# Q% k0 P2 e: W. u* j' i
6.2 上电后先进入Bootloader再跳转至main()函数的实现方法& W" X9 J( b1 U' E5 q
' K; M6 u- ^% d% j6.3 Bootloader程序作为CCS应用程序工程一部分的实现方法( M/ P1 O: Z8 g2 D) {4 N% J
* l! O2 y u5 x8 h, e6.4 Bootloader与上位机形成交互式通信4 R' @) p: T4 I0 h# |& N" p$ w
8 e0 I9 R8 n7 \1 d
6.5 Bootloader程序能够对接收数据校验的实现方法
3 X5 B. `9 @& v# M$ f; w
9 w+ |4 @3 q9 n( e/ q3 ~ z. j' u% ~6.6 在数据出错等情况下能够自动重启的实现方法
; d0 S7 h- F+ l$ t, J& Q) ^
7 C6 v/ l6 B: _* p71 ^& z3 U; ^ C0 y+ C
CCS输出文件格式 —— ASCII-Hex、Intel-Hex与Binary-Hex文件% S, a$ c) b& w& A# C5 L4 d
" o# ?8 U& F7 ]) q6 v
7.1 CCS配置生成Hex文件的方法8 _' L# v7 ]* Q
% E0 N# M/ B( v/ S# Z# n( x
7.2 ASCII-Hex* {7 k% A! W0 Z5 {& \; d
( X; ~; @% v) Z+ k1 d; j/ d0 G
7.3 Intel-Hex
2 V K0 c- `0 d) H* _( e N. @
+ W( y& d* ~: W% Y8 ~& [7.4 Binary-Hex
! X2 l& ?" l+ P4 W' V6 }2 L' W: s! f L, P3 d# i% T# ~( [
$ p0 k- N- a# @: R8 V' K6 {. \
( o. a, R8 [# p) @% W3 \1 U( B8 x+ O9 E
2 关于c_int00
" X: V# N6 B3 h/ M3 R! _
6 A+ C; m" p7 A' w, E“c_int00在跳转至main()之前都做了些什么”
* z1 g% F6 x1 d* l- @+ M& R" l* R+ g. ?# W7 A
在设计Bootloader时,非常有必要对c_int00函数进行全面了解,因为通常会对它进行改写。
% x1 M0 k: s& x, N9 b+ ?' E
9 N3 o5 i) J( |$ J& |! Ec_int00(也作_c_int00)是C/C++程序初始化代码的入口地址,完成建立C程序的运行环境。它是运行支持库(如rts2800_ml.lib)中的一个重要函数。9 ~5 X0 Y9 h q+ r% d: d, y
6 X; j* V2 B' ]. hDSP上电时,由Bootloader负责引导至c_ini00,具体引导过程见1。
3 V. N# y Q9 B! ?' H. H0 z, y& s ]$ A$ d% W4 A: a
2.1 c_int00完成的工作) V+ S; Y, i) v" L4 p' P. W2 f
& i$ F& v4 c- Q! ~& Q1) 定义系统栈.stack,并初始化栈指针,配置相关寄存器
% P2 [! i$ H/ h3 b; r7 @) U" _! p' F+ @- U" ]! {$ o0 t0 A
2) 初始化全局变量(.cinit)6 i1 |: A# d; e! q2 m6 L
" m) W) x1 b$ j5 f3) 若使用C++,还会完成全局对象构造(.pinit)# Q9 T9 C/ K/ D% L
( z0 l& P! G, i/ X* b2 V
4) 调用main函数运行C程序( x) j+ n5 Q; m4 E! s; R' j) A
/ F7 [$ g: N2 _4 \+ g
5) 当main函数return时,调用exit函数
% V* c) X/ u7 C( ]. ?8 v' h
. K& \9 `3 ]+ }% f- a7 c& g用户可以对c_int00函数进行修改,但修改后的函数必须完成以上任务。
: Y! Q9 \2 O! G5 b) v& |* u( N* K; C! O! v! s$ l5 f8 C& D
2.2 系统初始化1 z3 W6 q$ Q5 m! K% E/ ?5 k3 T6 a
6 w' ^. X% n& e" p7 n2 m4 V4 G
在TI官网找到了rts2800_ml.lib对应的boot.asm源文件,其中核心内容为c_int00函数,其中关于“定义系统栈.stack,并初始化栈指针,配置相关寄存器”等系统初始化的部分如下/ L8 ?. S j; |- C
3 [- C* N5 t" L/ @9 g6 ~$ u! L8 r
5 L; q9 w& O: E. z2 Z! }( y: i, l1 k2 a& m
: k" l6 ~. B% o8 s/ U6 D: t8 `
|
|