打印

DSP启动详解(以2812为例)

[复制链接]
11348|54
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zhangmangui 于 2013-10-21 23:28 编辑

从0X3F FFC0处复位→执行0X3F FC00地址处的初始化引导函数(Initboot) →根据GPIO选择引导模式→确定用户程序入口地址→从入口处开始执行用户程序。  
      输入外部引脚为/XRS, 当/XRS为低电平时,DSP终止执行,PC指向地址:0x3FFFC0,当/xRS变成高电平时,DSP开始执行0x3FFFC0中存放的指令。这条指令是条跳转指令或者说是复位中断向量,这个中断向量指向地址0X3F FC00处的初始化引导函数(Initboot),即将地址0x3FFC00(函数initboot的首地址)发给PC,值得注意的是:地址0X3F FFC0也有片内、片外两种,具体的选择情况是:当系统上电运行时,根据XMP/MC引脚的状态决定是从片外的3fffc0处读取复位向量或者时从片内的rom的3fffc0处读取复位向量。低电平方式下从片内读取,高电平方式下从片外读取。InitBoot 函数所做工作有:1.初始化状态寄存器;2.将堆栈指针设为0x400(0x400 - 0x44F作为启动过程中的堆栈);3.读CSM密码保护部分;如果是从片内读取的,则以上程序都是被固化在rom中的,无法更改,4.调用
SelectBootMode;模式的选择是由四个引脚GPIOF4(SCITXDA), GPIOF12(MDXA), GPIOF3
(SPISTEA), GPIOF2(SPICLK5).的状态决定的,若为1xxx则跳转到FLASH地址0x3F7FF6, 0010为H0 SARAM地址为0x3F8000. 调用ExitBoot
以上是BootROM完成的工作。从entrypoint开始,就进入用户程序区了。对于汇编程序,可以在程序起点处写一条跳转到Start(如果 程序起点是Start)的指令。汇编情况比较简单,跳转到Start后,各项初始化代码工作都由自己完成。对于C语言程序,通常的做法是在程序起点处放置 一条跳转指令,转到_c_init0。 这个程序可在
DSP281x_CodeStartBranch.asm中找到,然后程序的执行分为使用或不使用BIOS两种情况。  
  
从rts.src中提取boot28.inc文件,其中包括对于不使用BIOS的情况下,启动后从_c_init0到main函数中间所做的工 作。因为这段代码是由C编译器自动运行的,因而常被初学者忽视,以致对其后自己编写的C代码的运行环境不清楚。这一段程序主要完成以下工作: ◇ 分配C堆栈;
◇ 建立C运行环境(CPU寄存器和模式寄存器的配置); ◇ 复制cinit、pinit表、.const、.econst常量到工作区; ◇ 跳转到main函数。
  这段代码声明了2个全局变量:__stack,系统堆栈栈底;_c_int00,启动函数。下面列出了C运行环境的初始化程序部分代码:   C28OBJ;选择C28x对象模式 C28ADDR;清除地址模式位 C28MAP;设置M0M1模式
CLRCPAGE0;使用堆栈寻址模式
MOVWDP,#0;初始化DP指向低64K地址 CLRCOVM;关闭溢出模式 ASP;确保SP对齐
  这些代码设置了C语言的运行环境。在用户程序中编写的汇编代码不应该破坏这个环境,否则C语言将无**常运行。
boot rom中存放的bootloader源文件可在文件TMS320x281x DSP Boot ROM Reference Guide的附件中找到,可从TI网站上搜索该文件
PC的作用:为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又 称为指令计数器。在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第 一条指令的地址。当执行指令时,CPU将自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行 的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。




来自网络收集  供大家学习使用

相关帖子

沙发
zhangmangui|  楼主 | 2013-10-16 16:57 | 只看该作者
本帖最后由 zhangmangui 于 2013-10-16 17:04 编辑

DSP/BIOS的启动顺序

当DSP/BIOS的应用程序启动时,一般遵循下面的步骤:

1)  初始化DSP:DSP/BIOS程序从C/C++环境入口c_int00开始运行。对于C6000平台,在c_int00开始处,系统栈指针(B15)和全局页指针(B14)被分别设置在堆栈断的末尾和.bss断的开始。控制寄存器AMR、IER、CSR等被初始化;

2)  初始化.bss段:当堆栈被设置完成后,初始化任务被调用,利用.cinit的记录对.bss断的变量进行初始化;

3)  调用BIOS_init初始化用到的各个模块:BIOS_init调用MOD_init对配置用到的各个模块进行初始化,包括HWI_init、HST_init、IDL_init等;

4)  处理.pinit表:.pinit表包含一些指向初始化函数的指针,对C++程序,全局对象类的创建也在此时完成;

5)  调用用户程序的main函数:用户main函数可以是C/C++函数或者汇编语言函数,对于汇编函数,使用_main的函数名。由于此时的硬件、软件中断还没有被使能,所以在用户主函数的初始化中需要注意,可以使能单独的中断屏蔽位,但是不能调用类似HWI_enable的接口来使能全局中断;

6)  调用BIOS_start启动DSP/BIOS:BIOS_start在用户main函数退出后被调用,它负责使能使用的各个模块并调用MOD_startup启动每个模块。包括CLK_startup、PIP_startup、SWI_startup、HWI_startup等。当TSK管理模块在配置中被使用时,TSK_startup被执行,并且BIOS_start将不会结束返回;

7)  执行idle循环:有两种方式进入idle循环。当TSK管理模块使能时,任务调度器运行的TSK_idle任务调用IDL_loop在其它任务空闲时进入idle循环;当TSK模块未被使用时,BIOS_start调用将返回,并执行IDL_loop进入永久的idle循环,此时硬件和软件中断可以抢占idle循环得到执行。由于idle循环中管理和主机的通信,因此主机和目标机之间的数据交互可以进行了。

编译选项设置

CCS环境下,可以为工程文件(.pjt)指定编译选项,也可以为具体的每一个文件指定编译选项。

编译选项可以通过工程文件或者某个具体的.c文件单击鼠标右键,然后在弹出窗口中选这“Build Options”,或者点击菜单栏ProjectàBuild Options,弹出如下图窗口:

                                

编译选项分为:Basic,Advanced,Feedback,Files,Assembly,Parser,Preprocessor,,Diagnositcs共八类。每一类又细分为若干选项设置。

单击右下角的Help,可以获得每个具体选项的含义。下表中列出与编译调试密切相关的编译选项。表中未说明的选项使用默认选项即可。




在链接选项页中,可设置输出文件和内存映射文件的路径以及需要包含的库文件,如下图所示:


在Serach Path和Libraries中,可将芯片支持库(CSL)的路径和使用的库文件设置好,这样就不需要在工程中添加库文件了。由于CCS v3.2默认没有带支持TCI6482的CSL v3.x的库,可将最新的CSL拷贝到CCS目录下,建议统一路径名称,以免不同机器建立的工程不能兼容。通常库文件中末尾带e的为Big Endian库,不带e的为Little Endian库,需要根据Complier选项中的选择分别选用

222.jpg (80.77 KB )

222.jpg

使用特权

评论回复
板凳
duduniao1002| | 2013-10-17 17:50 | 只看该作者
肿么没人呢,路过了,留下脚印

使用特权

评论回复
地板
zhangmangui|  楼主 | 2013-10-17 18:05 | 只看该作者
duduniao1002 发表于 2013-10-17 17:50
肿么没人呢,路过了,留下脚印

非常感谢  第一个支持的

使用特权

评论回复
5
wenjun_wang86| | 2013-10-18 08:14 | 只看该作者
很有用,赞!!!

使用特权

评论回复
6
zhangmangui|  楼主 | 2013-10-18 09:05 | 只看该作者
wenjun_wang86 发表于 2013-10-18 08:14
很有用,赞!!!

谢谢支持

使用特权

评论回复
7
elec921| | 2013-10-18 12:19 | 只看该作者
码字不容易,顶一个

使用特权

评论回复
8
someonewho| | 2013-10-21 22:59 | 只看该作者
楼主很认真呢 赞一个

使用特权

评论回复
9
zhangmangui|  楼主 | 2013-10-21 23:28 | 只看该作者
someonewho 发表于 2013-10-21 22:59
楼主很认真呢 赞一个

资料大多来自收集   供大家学习而已  
谢谢支持

使用特权

评论回复
10
justbybing| | 2013-10-22 13:27 | 只看该作者
很有用 楼主很辛苦啊 顶一个

使用特权

评论回复
11
simale| | 2013-10-22 15:24 | 只看该作者
很好

使用特权

评论回复
12
日月盟约| | 2013-11-8 10:05 | 只看该作者
龙哥您好,我想问在“通过读取IO引脚的状态决定所需要的引导模式”,模式的选择是由四个引脚GPIOF4(SCITXDA), GPIOF12(MDXA), GPIOF3 (SPISTEA), GPIOF2(SPICLK5).的状态决定的,那么引脚状态到底怎样来引导模式?难道需要外部硬件来拉低或拉高相应的GPIO引脚吗?这样的话其引导过后GPIO引脚还可以当做普通IO口来用吗?跪求给予解答,谢谢您,不胜感激哈

使用特权

评论回复
13
xuan309170083| | 2013-11-8 10:42 | 只看该作者
这真真是极好的

使用特权

评论回复
14
zhangmangui|  楼主 | 2013-11-8 11:56 | 只看该作者
日月盟约 发表于 2013-11-8 10:05
龙哥您好,我想问在“通过读取IO引脚的状态决定所需要的引导模式”,模式的选择是由四个引脚GPIOF4(SCITXD ...

你的开发板没有引出这些引脚吗   一般的都会将这些引脚拉出  通过跳线帽等可以选择上拉还是地
这样就决定了启动模式
一般的处理方式是上拉后你还是可以做普通IO口  可以控制外设的高低
如果你的外面下拉状态没有串小阻值电阻  直接接地选择启动模式的话  你如果当做IO口使用  输出高电平时会出现和选择模式连接的地短路  所以最好串个500欧左右的电阻  防止这种情况  也不影响模式选择和IO口的使用

使用特权

评论回复
15
tengchao998| | 2013-11-9 11:18 | 只看该作者
留个脚印,有空细看

使用特权

评论回复
16
日月盟约| | 2013-11-9 12:48 | 只看该作者
zhangmangui 发表于 2013-11-8 11:56
你的开发板没有引出这些引脚吗   一般的都会将这些引脚拉出  通过跳线帽等可以选择上拉还是地
这样就决定 ...

顿时明白了,谢谢您,永远支持龙哥!

使用特权

评论回复
17
zhangmangui|  楼主 | 2013-11-9 14:17 | 只看该作者
日月盟约 发表于 2013-11-9 12:48
顿时明白了,谢谢您,永远支持龙哥!

那就好  呵呵   相互帮助

使用特权

评论回复
18
wangdezhi| | 2013-11-10 14:49 | 只看该作者
学习CMD文件的。

使用特权

评论回复
19
wangdezhi| | 2013-11-10 14:50 | 只看该作者
讲的很详细的。

使用特权

评论回复
20
wlwxzs| | 2013-11-23 23:56 | 只看该作者
版主,我有个相关问题请你指教,我用的是28069开发板,我把程序下到Flash,在调试界面里点击reset CPU按键会出现No source available for "0x3ff75c" ,我对应了一下该地址,是在引导rom区域里Bootloader Functions函数段中的地址。我想这是不是我在3FFFC0地址里直接放了codestart段有关啊?从而导致复位时没调用Initboot函数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入【TI DSP 论坛】 & 【DSP 技术】           TI忠诚粉丝!

934

主题

26373

帖子

585

粉丝