_c_int00 DSP

关于DSP的 _c_int00 问题

_c_int00 是c语言程序的入口。首先上电后,系统执行reset矢量代码,该代码是我们写的话,我们就令cpu转到c_int00,这段程序为c语言运行作准备,准备工作做好后,就转到c语言的main()。

如果reset矢量代码不是我们写的,是ti写的,那么就执行bootloader程序,该程序先将从某个外部得到的真正程序放在规定的地方,然后转过去执行该代码。

   那么如何决定reset矢量代码是ti写的还是我们写的,那就看复位后mp/mc脚的电平。要是调试的时候我们的mp/mc脚选择了我们不希望的方式,怎么办?(在调试的时候一般不管bootloader的,只有项目最后成功了才管),用jtag来控制。

C程序开始运行时,必须首先初始化C运行环境,这是通过c_int0函数完成的,这个函数在运行支持库(rts,runtime-support library)中。连接器会将这个函数的入口地址放置在复位中断向量处,使其可以在初始化时被调用。c_int0函数进行以下工作以建立C运行环境:为系统堆栈产生.stack块,并初始化堆栈指针。从.cinit块将初始化数据拷贝到.bss块中相应的变量。调用main函数,开始运行C程序。用户可以对c_int0函数进行修改,但修改后的函数必须完成以上任务。

DSP建立C环境函数c_int00() 

我们知道,在DSP启动后,系统会进入复位中断,此时复位中断服务函数为c_init00,此函数用于建立C环境,为进入main()函数进行系统初始化,主要工作是建立堆栈,初始化全局变量等。

全局变量的初始化:如果程序在链接时采用-c选项,则编译链接后的可执行程序会将全局变量的初始化放在c_init00()函数中进行,在此函数中会调用_auto_init(CINIT)函数,将.cinit段的内容拷入.bss中相应的变量中,此过程是在系统上电后进入main()函数之前执行的。

如果程序在链接时采用-cr选项,则编译后的可执行程序中全局变量需要使用loader进行初始化,这种方法一般用于在JTAG调试时,CCS即为loader。

   _c_int00符号的说明。它是运行支持库(RTS.lib)包含的一个重要函数。如果Linker选项使用-c-cr选项,_c_int00被自动定义为程序的入口点。用c语言编程时要注意:在project-》optionslinker属性页中要有-c,那是与c程序的入口。在Linker选项下面选择NoAutoinitialization

c_int00C初始化代码的入口地址,在你用C编程的时候,DSP需要执行一段C运行支持库代码以完成C运行环境的初始化,_c_int00就是这段初始化代码的入口地址。执行完初始化代码后,库代码会自动跳到main函数继续运行。
   
我以前遇到有汇编和c混合编程有c_int00() 错误和警告的问题,你的bootload程序运行到c_int00()跳转不了!运行c_int00() 后直接死了,会不会是没有加载到合适的库(rts.lib),进入了一个死循环,跳不到主函数那去。

### ARM DSP 中的整数到浮点数数据类型转换 在 ARM 数字信号处理器 (DSP) 应用程序开发过程中,经常需要处理不同类型的数据表示形式之间的转换操作。例如,在某些情况下可能需要将 `int` 类型的数据转换为 `float` 类型以便于后续计算。 #### 数据类型转换背景 ARM Cortex-M 和其他支持 DSP 扩展的架构通常提供硬件加速功能来优化这些类型的转换过程。对于 C/C++ 编程环境中的开发者来说,可以利用标准库函数或者编译器内置指令完成此任务。以下是具体方法: 1. **使用强制类型转换** 最简单的方式就是通过显式的 `(float)` 转换来实现从 `int` 到 `float` 的转变。 ```c int integer_value = 10; float floating_point_value = (float)integer_value; // 显式类型转换 ``` 2. **调用专用 API 函数** 如果项目依赖 CMSIS-DSP 库,则还可以考虑采用更高级别的接口来进行数值映射。尽管上述引用并未直接提及此类特定用途的功能名称,但基于实际经验以及常见实践模式推测应该存在类似的辅助工具可供选用[^3]。 3. **性能考量** 需要注意的是,不同平台上的效率可能会有所差异。因此建议测试多种方案并对比其运行时间开销后再决定最终实施方案。 #### 示例代码展示 下面给出一段完整的示范程序片段用于说明整个流程: ```c #include <stdio.h> void main(){ int intValue = 42; /* Method One */ float floatValueMethodOne = (float)intValue; printf("Integer Value:%d\n", intValue); printf("Converted Float Value(Method One):%.2f\n", floatValueMethodOne); } ``` 以上例子展示了最基本的转换方式之一——即借助简单的 cast 运算符达成目标效果。当然还有更多复杂场景下的应用实例等待探索发现!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值