C2000的启动过程

2024-01-26 09:12
文章标签 启动 过程 c2000

本文主要是介绍C2000的启动过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Other Parts Discussed in Thread: CONTROLSUITE

1.DSP reset后运行的起始地址是多少?

  0x3FFFC0

2.仿真器烧写程序的步骤是?

  根据cmd文件把程序烧到指定位置,然后执行。

3.DSP的Flash启动过程是什么?

首先硬件配置GPIO84~87上拉为1,即处于Flash启动过程。当DSP复位后,会从复位向量0x3FFFC0处取得复位向量,并跳转到InitBoot处开始执行,InitBoot会读GPIO84~87的值发现全为1判断为Flash启动方式。然后会跳到0x33FFF6处执行。在CCS5.2工程的cmd文件中有如下代码:

MEMORY
{
PAGE 0 :
BEGIN : origin = 0x33FFF6, length = 0x000002 /* Boot to M0 will go here */

...
}

SECTIONS
{...

codestart : > BEGIN PAGE = 0

...}

即表示把codestart段放到0x33FFF6位置处,文件“DSP2833x_CodeStartBranch.asm”中有codestart段的定义,实际上codestart段只是包含了一个跳转指令,是程序跳转到_c_int00处,_c_int00在boot.asm in RTS library中有定义,_c_int00的代码最终会调用c的main函数,之后就是main函数的执行。

总的就是:Reset(0x3fffc0)—>initBoot()—>判断启动方式—>codestart(0x33fff6)—>_c_int00—>main函数

 

4.F28335如何烧写代码到flash中并运行?

首先使用添加C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_common\cmd\F28335.cmd。此文件即为配置代码到flash中的TI官方配置文件。

然后参考C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_examples_ccsv4\flash_f28335。添加以下代码:

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);将一些在内存中运行的代码从flash复制到内存中,然后程序才能正常运行。

5.写好的代码再ram中能正常运行但是烧写到flash中后,函数DSP28x_usDelay()不能正常运行为什么?

因为在DSP2833x_usDelay.asm中有.sect "ramfuncs",即把该函数定义在段"ramfuncs"中, 而此段需要在内存中运行,故需要使用函数

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);将ramfuncs段复制到内存中然后运行。只算以这样设计是因为函数DSP28x_usDelay()精准运行对运行速度有要求故必须放在段"ramfuncs"中。

6.cmd中以下代码如何解释?

ramfuncs : LOAD = FLASHD, 
RUN = RAML0, 
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0

第1行表示该段的装载在PAGA0的FLASHD中
第2行表示该段的运行地址在PAGE0的RAML0中
LOAD_ START(_RamfuncsLoadStart)令编译器创建了一个变量RamfuncsLoadStart,该变量指向段ramfuncs的装载地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档);
LOAD_ START(_RamfuncsLoadEnd)令编译器创建了一个变量RamfuncsLoadEnd,该变量指向段ramfuncs的装载地址的末地址(LOAD_ END为编译伪指令,请见CCS的帮助文档);
LOAD_ START(_RamfuncsRunStart)令编译器创建了一个变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档);
从第1和2行可以看出,段ramfuncs中的函数DSP28x_usDelay()的装载地址和运行地址是不同的,本程序中装载在Flash的块FLASHD中,而在SARAM L0中运行,这只是目标,实际运行时DSP并不会自动将Flash中的代码拷贝到SARAM中,因此需要手动添加代码来完成。
在C函数中,为了使用变量RamfuncsLoadStart、RamfuncsLoadEnd和RamfuncsRunStart,必须先声明,本工程在文件DSP2833x_GlobalPrototypes.h中做了如下声明:
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
然后就可以使用了。在Main.c中,使用MemCopy()函数将段ramfuncs中的函数DSP28x_usDelay()的代码从装载地址RamfuncsLoadStart—RamfuncsLoadEnd拷贝到RamfuncsRunStart开始的SARAM空间中。之后在程序运行时,只要调用DSP28x_usDelay()函数,都会自动地指向SARAM中相应的函数入口地址,这一点是自动完成的。MemCopy()函数原型在MemCopy.c中,DSP2833x_GlobalPrototypes.h声明。

7.如何将一个函数放到ram中运行?

参考TI公司头文件中自带InitFlash函数,这些函数会以CODE_SECTION申明。如:#pragma CODE_SECTION(InitFlash, "ramfuncs");

其他:

1、一个完整的工程包含的文件

CCS建立一个完整的工程,至少需要以下4个文件:

1)存储器分配cmd文件:cmd命令文件是用来分配存储空间的。

2)C语言系统库rts2xx.lib:rts2xx.lib是C语言系统库,包含了编译器提供的所有功能:

    ①初始化C语言环境(入口地址是_c_int0)

    ②设置堆栈

    ③提供标准的c语言函数库。

3)包含main函数的c源文件:有且只有一个包含main函数的c源文件,系统库初始化完毕后就把控制权交给main()函数了。

4)矢量跳转表asm汇编文件:矢量跳转表文件,通常是汇编文件(asm)形式,此文件需要准确的定位在程序的起始地址,其内容是汇编语句中的无条件跳转语句“B”。

2、DSP启动过程理解

入口函数地址最终跳到code_start函数(参见DSP280X_Codestartbranch.asm文件)。

--------------------------------------------------------------------------

 |.sect"codestart" |

| |

|code_start: |

   |.ifWD_DISABLE == 1 |

   |     LB wd_disable       ;Branch to watchdog disable code |

  | .else |

  |      LB_c_int00         ;Branch to start ofboot.asm in RTS library |

   |.endif   |

|;end codestart section |

        ---------------------------------------------------------------------------

上述这个段,根据引导空间不同,被cmd分配在不同的地址:

ram引导:

   BEGIN      : origin = 0x000000, length =0x000002 

flash引导:

  BEGIN      : origin = 0x3f7ff6, length = 0x000002 

而_c_int00这个函数,具体代码找不到,该函数应该放在rts这个库中,这个函数_c_int00应该是C初始化代码的入口地址,在你用C编程的时候,DSP需要执行一段C运行支持库代码以完成C运行环境的初始化,_c_int00就是这段初始化代码的入口地址。执行完初始化代码后,库代码会自动跳到main函数继续运行。

完成的内容有:c_int0函数进行以下工作以建立C运行环境:为系统堆栈产生.stack块,并初始化堆栈指针。

从.cinit块将初始化数据拷贝到.bss块中相应的变量。调用main函数,开始运行C程序。

这篇关于C2000的启动过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/646309

相关文章

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx