u-boot启动涉及源文件:sections.c

/arch/arm/lib/secions.c

目的:指定一些零长度数组在编译链接时放入到指定的section 中

参考:嵌入式C语言自我修养 06:U-boot镜像自拷贝分析:section属性 - 宅学部落 - 博客园

 

char __bss_start[0] __attribute__((section(".__bss_start")));
char __bss_end[0] __attribute__((section(".__bss_end")));
char __image_copy_start[0] __attribute__((section(".__image_copy_start")));
char __image_copy_end[0] __attribute__((section(".__image_copy_end")));
char __rel_dyn_start[0] __attribute__((section(".__rel_dyn_start")));
char __rel_dyn_end[0] __attribute__((section(".__rel_dyn_end")));
char __secure_start[0] __attribute__((section(".__secure_start")));
char __secure_end[0] __attribute__((section(".__secure_end")));
char __secure_stack_start[0] __attribute__((section(".__secure_stack_start")));
char __secure_stack_end[0] __attribute__((section(".__secure_stack_end")));
char __efi_runtime_start[0] __attribute__((section(".__efi_runtime_start")));
char __efi_runtime_stop[0] __attribute__((section(".__efi_runtime_stop")));
char __efi_runtime_rel_start[0] __attribute__((section(".__efi_runtime_rel_start")));
char __efi_runtime_rel_stop[0] __attribute__((section(".__efi_runtime_rel_stop")));
char _end[0] __attribute__((section(".__end")));

<think>嗯,用户遇到了一个编译错误:“unresolved symbol _ADC_cal”,这个问题看起来和之前的“_InitEPwm”类似,但可能涉及到不同的模块,特别是ADC校准相关的函数。首先,我需要回忆一下DSP2833x系列芯片的相关知识,特别是ADC校准的部分。 首先,用户提供的错误信息指出在路径中首次引用了未解析的符号_ADC_cal。根据TI的文档,ADC校准函数通常是芯片出厂时在特定的ROM中预编程的,用于校准ADC模块,确保转换的准确性。这个函数可能不会在用户代码中显式调用,而是由启动代码或链接器脚本自动处理。 接下来,我需要考虑可能的原因。首先,用户可能没有正确包含TI的库文件或者链接器命令文件。特别是,DSP2833x系列的开发需要正确配置链接器脚本(.cmd文件),以确保在构建过程中包含必要的库和内存分配,尤其是Boot ROM中的ADC校准函数。 另外,ADC_cal函数通常由TI的头部文件(如DSP2833x_GlobalVariableDefs.c)中的代码自动调用,但用户可能需要检查他们的项目是否包含了这些文件,或者是否正确配置了链接器脚本中的内存部分,特别是ADC_CAL_TI的段是否正确映射到ROM的地址。 还有一个可能的问题是,用户可能错误地手动调用了_ADC_cal函数,而实际上这个函数应该由启动代码自动处理,不需要用户显式调用。这时候需要检查用户的代码是否有这样的调用,并建议删除它。 此外,检查芯片型号和使用的库版本是否匹配也很重要。如果用户使用的DSP2833x的型号不同,比如F28335和F28334,可能需要不同的链接器脚本和头文件,这会导致符号未解析的问题。 然后,我需要回忆TI的典型解决方案步骤。通常,解决这种未解析符号的问题需要确保链接器正确包含所需的库和内存段,检查头文件包含路径,以及确认启动代码是否正确初始化。 最后,可能需要建议用户参考TI的示例项目,特别是ADC相关的例程,看看他们的项目配置和示例有什么不同,从而找到缺失的部分。 总结一下,可能的解决步骤包括:检查链接器脚本是否正确配置ADC_CAL段;确保项目包含必要的头文件源文件;确认没有手动调用_ADC_cal;验证芯片型号和库的兼容性;以及清理和重建项目。</think>--- **问题分析:** `unresolved symbol _ADC_cal` 是 TI C2000 DSP 开发中常见的链接错误,表明编译器找不到 `_ADC_cal` 函数的定义。此函数与芯片 **ADC 校准值**相关,需通过以下方法解决: --- ### **1. 确认 ADC 校准值的来源** - **关键背景:** `_ADC_cal` 是 TI 芯片内部固化在 **Boot ROM** 中的校准函数,用于自动校正 ADC 转换精度。 开发者无需手动实现此函数,但需确保链接器脚本(`.cmd`)正确关联芯片的 ROM 地址。 --- ### **2. 检查链接器脚本(.cmd 文件)** - **步骤:** 1. 在项目中添加 TI 官方链接器脚本,例如 `F28335.cmd`(路径:`C2000Ware_xxx/device_support/f2833x/cmd`)。 2. 确保脚本中包含 **ADC_CAL_TI** 段的定义: ```c MEMORY { ADC_CAL_TI : origin = 0x380080, length = 0x000009 } SECTIONS { .adc_cal : > ADC_CAL_TI, TYPE = NOLOAD } ``` 3. 若使用非 TI 官方链接器脚本,需手动添加上述段定义。 --- ### **3. 验证头文件与库文件** - **步骤:** 1. 在代码中包含芯片支持库头文件: ```c #include "DSP2833x_Device.h" // 主设备头文件 #include "DSP2833x_Adc.h" // ADC 模块头文件 ``` 2. 确保项目中包含以下关键源文件- `DSP2833x_GlobalVariableDefs.c`(定义全局变量) - `DSP2833x_SysCtrl.c`(系统控制初始化) - `DSP2833x_CodeStartBranch.asm`(启动代码分支) 3. 检查头文件路径是否正确添加到编译器选项(参考:[CCS 路径配置](#))。 --- ### **4. 禁止手动调用 _ADC_cal** - **常见错误:** 用户代码中误显式调用了 `_ADC_cal` 函数(例如 `_ADC_cal();`),而此函数应 **由启动代码自动加载**。 **解决方法:** 删除代码中所有对 `_ADC_cal` 的直接调用。 --- ### **5. 检查芯片型号与库版本匹配** - **可能问题:** - 项目配置的芯片型号(如 F28335)与实际使用的库不匹配。 - 使用的 `C2000Ware` 版本过旧,导致链接器无法识别 `_ADC_cal`。 - **解决方法:** 1. 在 CCS 中确认芯片型号: `Project Properties > General > Target Configuration`。 2. 更新 `C2000Ware` 至最新版本([TI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值