This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好!
我正在尝试为 TMS320F28075设置一个具有 Driverlib 支持的 RTOS 程序。 我使用了 Code Composer Studio 中 RTOS 项目的给定典型示例作为基础。
但是、在工程编译期间、我遇到了以下问题。
"../TMS320F28075.cmd"、第107行:错误#10099-D:程序将无法放入可用内存中。 对于"codestart"大小为0x2的第0页、放置对齐/阻断失败。 可用存储器范围:
开始大小:0x2未使用:0x0最大孔:0x0
我没有更改示例工程中提供的链接器命令文件。 对于如何解决此问题、我很难找到自己的头脑、感谢您提供任何帮助或建议。
提前感谢。
Nisal
听起来您的应用和 SYS/BIOS 都在尝试将代码放置在入口点地址。 如果您的项目中包含 CodeStartBranch.asm 文件、则可以继续操作并将其删除、让 SYS/BIOS 生成该文件。
惠特尼
尊敬的惠特尼:
非常感谢您的回复。 这解决了我的问题。 我对 Driverlib 还有另一个问题。
由于必须在项目中包含 driverlib.lib 文件才能获得 driverlib 支持、因此我将此文件添加到了我的项目中。
但是、会显示此警告、
警告#10207-D:将索引库"driverlib.lib"解析为"driverlib_coff .lib"、但未找到"driverlib_coff .lib"
driverlib.lib 和 driverlib_coff .lib 之间的区别是什么、我应该在项目中包含什么内容。
谢谢你
Nisal
driverlib.lib 是一个将重定向到 driverlib_coff .lib 和 driverlib_eabi.lib 的索引、具体取决于您已将项目配置为使用的输出格式。 由于您使用的是 COFF、因此它会尝试查找 driverlib_coff。
创建项目时、是否链接到 driverlib.lib 或是否复制了它? 如果您复制了它、它可能无法找到 driverlib_coff .lib、因为它位于不同的位置。 如果要将库复制到工程中而不是进行链接、请复制 driverlib_coff。lib 并直接使用它。
惠特尼
非常感谢 Whitney
尊敬的惠特尼:
我遇到了另一个问题。 尽管工程构建过程没有任何错误、 但 CAN_sendMessage 等 drivelib 函数 不会突出显示、这通常是突出显示的。 我们看到另一个问题存在、因为 CAN_sendMessage 运行一次、程序中断。 我认为我没有采取适当的步骤将这个可爱的东西包括在我的项目中。 我遵循 了 F2807x_dev_user_guide。 我想知道 RTOS 工程的步骤是否不同。 如果是、是否可以获得有关这方面的建议。
谢谢你
Nisal
事实上、它的构建很可能意味着您已经正确地包含了 driverlib。 您能更详细地介绍一下该计划以什么方式中断吗? 它是否卡在某个位置? 您是否获得了 ITRAP?
您需要对 RTOS 进行一些考虑。 您将尝试避免 SYS/BIOS 器件初始化和您在应用程序中调用的代码之间的冲突-例如,您希望 SYS/BIOS 引导模块为您配置 SYSCLK,还是要使用 Device_init()中调用的时钟初始化代码? 此外、SYS/BIOS 会将其 Hwi 调度程序插入 PIE 矢量表、因此您需要确保您的应用程序不会调用 Interrupt_initVectorTable ()或 Interrupt_register ()并覆盖它。
惠特尼
尊敬的惠特尼:
我正在使用 Device_init()函数来设置 TMS320F28075。 我错误地将 Interrupt_initVectorTable()函数保留为未注释。 在注释后、程序运行时会出现任何中断。 但是、在程序中、我已设置为每100ms 发送几条 CAN 消息、但在使用 CAN 总线分析器进行检查时、是否看到每1.2s 发送一次消息。 下面给出了项目中使用的 app.cfg 文件。
VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
VAR 诊断= xdc.useModule('xdc.runtime.Diags');
VAR 错误= xdc.useModule('xdc.runtime.Error');
VAR 日志= xdc.useModule('xdc.runtime.Log');
VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
VAR Main = xdc.useModule('xdc.runtime.Main');
VAR 内存= xdc.useModule('xdc.runtime.Memory')
VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
VAR 系统= xdc.useModule('xdc.runtime.System');
var text = xdc.useModule('xdc.runtime.Text');
VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');
VAR Hwi = xdc.useModule('ti.sysbios.family.c28.Hwi');
VAR 空闲= xdc.useModule('ti.sysbios.knl.Idle');
/*
*取消注释此行以全局禁用断言。
*所有模块继承'库'模块的默认值。 您
*可以使用 Module.common$按模块覆盖这些默认值。
*禁用断言将节省代码空间并提高运行时性能。
Defaults.common$.diags_ASSERT = Diags.always_off;
*
/*
*取消注释此行以防止模块名称加载到目标上。
*模块名称字符串放置在.const 段中。 设置此值
*将参数设置为 false 将节省.const 段中的空间。 误差和
*断言消息将包含"未知模块"前缀
实际模块名称的*。
Defaults.common$.namedModule = false;
*
/*
*最小化系统中的 EXIT 处理程序数组。 系统模块包括
*向 System_atexit()注册的函数数数组
*由 System_exit()调用。
*
System.maxAtexitHandlers = 4;
/*
*取消注释此行以禁用错误打印功能。
*禁用此功能时,我们会丢失错误信息,因为错误是这样
*未打印。 如果禁用 raiseHook、则会节省一些代码空间
*由于 Error_print()函数,您的应用程序未使用 System_printf()
*调用 System_printf()。
error.raiseHook =空;
*
/*
*取消注释此行以防止 Error、Assert 和 Log 字符串成为字符串
*加载到目标上。 这些字符串放置在.const 段中。
*将此参数设置为 false 将节省.const 段中的空间。
*错误、断言和日志消息将打印原始 ID 和 args 而不是
*格式化的邮件。
text.isLoaded = false;
*
/*
*取消注释此行以禁用 SysMin 的字符输出
*程序退出时。 SysMin 向循环缓冲区写入字符。
*可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
SysMin。flushAtExit = false;
*
/*
* BIOS 模块将为系统创建默认堆。
*指定此默认堆的大小。
*
BIOS.heapSize = 0x800;
/*
*从源构建自定义 SYS/BIOS 库。
*
BIOS.libType = BIOS.LibType_Custom;
/*系统堆栈大小(由 ISR 和 Swi 使用)*/
program.stack = 0x100;
System_printf()的/*循环缓冲区大小*/
SysMin。bufSize = 0x200;
/*
*为整个系统创建并安装记录器
*
var logerBufParams = new LoggerBuf.Params();
LoggerBufParams.numEntry = 32;
var logger0 = LoggerBuf.create (logerBufParams);
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.always_on;
System.SupportProxy = SysMin;
idleFxns[0]="&background_fxn";
var hwi0Params = new hwi.Params();
hwi0Params.instance.name ="cpuTimer0_handle";
program.global.cpuTimer0_handle = Hwi.create (38、"&cpuTimer0ISR"、hwi0Params);
var hwi1Params = new hwi.Params();
hwi1Params.instance.name ="canA0_handle";
Program.global.canA0_handle = hwi.create (100、"&canaISR"、hwi1Params);
var hwi2Params = new hwi.Params();
hwi2Params.instance.name ="canB0_handle";
Program.global.canB0_handle = hwi.create (102、"&canbISR"、hwi2Params);
var hwi3Params = new hwi.Params();
hwi3Params.instance.name ="eCAP1_Handle";
program.global.eCAP1_handle = Hwi.create (56、"&ecap1ISR"、hwi3Params);
好的、听起来可能存在一些时钟问题。 使用 Device_init 设置时钟没有问题-只需进入引导模块、确保它不会尝试配置时钟并导致冲突。 它应显示在您的 cfg 文件中、如"Boot.configureClocks = false"。 此外、为了确保 BIOS 节拍率正确、请确保已为 BIOS 提供实际的 CPU 频率(在 cfg 文件中为 BIOS.cpufreq.lo)。
默认情况下、时钟模块应每1ms 递增一次。 您是否可以使用 ROV 并运行目标10秒钟? 查看 ROV 中的时钟模块、10秒后您应该会看到10、000的增量。
惠特尼
尊敬的惠特尼:
我进行了更改、并且时钟正常运行。 非常感谢。
Nisal