1804|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

DSP编程时 c_int00是什么内容 [复制链接]

c_int00(也作_c_int00)是C/C++程序初始化代码的入口地址,完成建立C程序的运行环境。它是运行支持库(如rts2800_ml.lib)中的一个重要函数。

DSP上电时,由Bootloader负责引导至c_ini00。

1 c_int00完成的工作
1) 定义系统栈.stack,并初始化栈指针,配置相关寄存器
2) 初始化全局变量(.cinit)
3) 若使用C++,还会完成全局对象构造(.pinit)
4) 调用main函数运行C程序
5) 当main函数return时,调用exit函数

用户可以对c_int00函数进行修改,但修改后的函数必须完成以上任务。

2 系统初始化
在TI官网找到了rts2800_ml.lib对应的boot.asm源文件,其中核心内容为c_int00函数,其中关于“定义系统栈.stack,并初始化栈指针,配置相关寄存器”等系统初始化的部分如下


该部分完成了C程序运行的基础条件设置,不包括对全局变量的初始化。此时如果进入main函数执行应用程序的话,需要注意所有全局变量将不再遵守C语言定义时初值的标准规定,也就是说,除非在程序中对全局变量重新赋值,否则全局变量的初值是随机的。需要说明的是除了全局变量初值随机,程序是可以完整准确运行的。这可以应用到用户自定义c_int00的场合,在程序开始执行后重新对所有全局赋值,从而减少该部分的工作量,例如二次Bootloader,当二次Bootloader执行完毕进入main之前重新调用c_int00即可。

(说明:二次Bootloader需要自定义c_int00的原因是希望C环境初始化完毕后不必进入main函数,而是进入二次Bootloader的主程序)

3 全局变量初始化
全局变量初始化(.cinit)分为两种初始化方式:运行时自动初始化、加载时初始化。
1) 运行时自动初始化
.cinit段与其他段一并从目标文件加载入存储器,链接器定义了一个名为CINIT的符号,用来标识初始化表的首地址。程序开始运行时,C启动程序将表中的数据复制给.bss段中特定的变量,这便允许将初始化数据放入ROM/FLASH中,在每次程序开始时将其复制到RAM中,从而达到ROM/FLASH保存初值、RAM中运行变量的目的。
.cinit段初始化表的格式如下图所示

 >(图源:TMS320C28x Optimizing C/C++ Compiler v18.1.0.LTS User's Guide)
2) 加载时初始化:
连接器将.cinit段头中的STYP_COPY置位为1,并告知加载器不要把.cinit中的表加载入存储器并将符号CINIT赋值-1,告诉启动器初始化表不在储存器中,因此启动时不执行初始化。而由加载器直接把目标文件的.cinit复制到RAM的.bss中。

更详细的内容参考《TMS320C28x Optimizing C/C++ Compiler v18.1.0.LTS User’s Guide》7.9.3节

4 全局对象构造
全局对象构造(.pinit)用于C++变成环境,与全局变量初始化过程类似,不详细表述。

5 main函数与exit函数的调用
当完成以上过程之后,整个C程序运行环境就完整地构建好了,便可以进入main函数调用应用程序了


当main函数返回时调用的exit函数,但我们通常会在main函数中放置无限循环来保证main函数不被跳出。若main函数一旦跳出,将调用exit函数,保证程序能够安全退出并重新进入main函数。

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表