TI中文支持网
TI专业的中文技术问题搜集分享网站

如何不用c_int00进行C语言初始化

自己写了一个bootloader和上层App合二为一的工程,28035上电后首先进到codestart,此处放置了一条跳转至xxx_func()函数的命令,在xxx_func()函数中进行DSP设置,以便运行C语言主要有如下几条汇编指令:

asm(" MOV @SP,#0x0000");
asm(" SPM 0");
asm(" SETC OBJMODE");
asm(" CLRC AMODE");
asm(" SETC M0M1MAP");
asm(" CLRC PAGE0");
asm(" MOVW DP,#0x0000");
asm(" CLRC OVM");
asm(" ASP");

然后接下来就是判断是否留在此处等待bootloader数据,还是跳转至App程序入口,asm(" LB 3E8000H");     这个入口又放置了一条跳转至c_int00的命令,让28035运行支持库函数来初始化数据和c运行环境。

现在的问题是,我直接修改代码,让程序上电不跳转至App,留在底层,程序就卡死了,LED灯不闪烁,如果修改代码为正常的,跳转至APP后,通过上位机发指令进行bootloader,程序是可以正确bootloader的,LED闪烁。

所以我就做了个实验,把工程改成一个上电就留在boot层的程序,直接运行bootloader代码,但是实际结果是运行卡死。

自己分析的是,可能是此处自己写的初始化dsp的那些汇编指令是不是不对,或者漏了什么,导致无法运行C语言,而从APP层跳转过来的,因为调用过c_int00,所以正确的配置了dsp和初始化了c语言运行环境,所以,回到boot层可以正常运行。

那问题来了,我应该如何模仿或者实现c_int00里初始化c运行环境的功能呢,以便于我不调用c_int00也可以正常运行C程序。

Susan Yang:

c_int00的主要作用为:

1) 定义系统栈.stack,并初始化栈指针,配置相关寄存器

2) 初始化全局变量(.cinit)

3) 若使用C++,还会完成全局对象构造(.pinit)

4) 调用main函数运行C程序

5) 当main函数return时,调用exit函数

用户可以对c_int00函数进行修改,但修改后的函数必须完成以上任务。c_int00是对象模块boot.obj中的汇编代码例程。源代码boot.asm是编译器随附的RTS库源代码的一部分。在您现在使用的编译器文件夹内可以找到boot28.asm,如下面的路径:

ccs1000\ccs\tools\compiler\ti-cgt-c2000_20.8.0.STS\lib\src

综上,我们已经提供了相关的code,您可以参考一下。

另外您为何需要自己来模仿或者实现c_int00里初始化c运行环境的功能?我对此有些疑惑

赞(0)
未经允许不得转载:TI中文支持网 » 如何不用c_int00进行C语言初始化
分享到: 更多 (0)