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
大家好、
我尝试使用 System_printf 进行调试、我使用的是 ti-RTOS 和 am5728 idk、我的 CCS 版本为9.1.0.00010。 我创建了一个新的 CCS 项目、选择了 cortex A15和典型的 SYS/BIOS 项目。 我编译了该项目并在目标板上运行它、但无论是在控制台还是在 ROV->SysMin 中都看不到任何输出。 下面是我的 main 和.cfg:
VAR Defaults = xdc.useModule('xdc.runtime.Defaults'); var Diags = xdc.useModule('xdc.runtime.Diags'); var Error = xdc.useModule('xdc.runtime.Error'); var Log = xdc.useModule('xdc.runtime.Log'); var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf'); var Main = xdc.useModule('xdc.runtime.Main'); var Memory = xdc.useModule('xdc.runtime.Memory' ) var SysMin = xdc.useModule('xdc.runtime.SysMin'); var System = xdc.useModule('xdc.runtime.System'); var Text = xdc.useModule('xdc.runtime.Text'); var BIOS = xdc.useModule('ti.sysbios.BIOS'); var Clock = xdc.useModule('ti.sysbios.knl.Clock'); VAR Swi = xdc.useModule('ti.sysbios.knl.Swi'); var Task = xdc.useModule('ti.sysbios.knl.Task'); var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore'); var Hwi = xdc.useModule('ti.sysbios.hal.Hwi'); // *取消注释此行以全局禁用断言。 *所有模块继承'库'模块的默认值。 您 *可以使用 Module.common$按模块覆盖这些默认值。 *禁用断言将节省代码空间并提高运行时性能。 Defaults.common$.diags_ASSERT = Diags.always_off; */ * 取消注释此行以防止模块名称加载到目标上。 *模块名称字符串放置在.const 段中。 将此 *参数设置为 false 将节省.const 段中的空间。 错误和 *断言消息将包含"未知模块"前缀、而 不是*实际模块名称。 Defaults.common$.namedModule = false; */ /* 将系统中的 exit 处理程序数组最小化。 System 模块包括 *一组函数,这些函数在 System_atexit()中注册, *由 System_exit()调用。 // System.maxAtexitHandlers = 4; /* 取消注释此行以禁用错误打印功能。 *禁用时,我们会丢失错误信息,因为 *不打印错误。 如果 *由于 Error_print()函数 *调用 System_printf(),禁用 raiseHook 将节省一些代码空间。 error.raiseHook =空; */ /* 取消注释此行以防止*在 目标上加载错误、断言和日志字符串。 这些字符串放置在.const 段中。 *将此参数设置为 false 将节省.const 段中的空间。 *错误、断言和日志消息将打印原始 ID 和 args、而不是 *格式化的消息。 text.isLoaded = false; */ /* 取消注释此行以在 程序退出时禁用 SysMin *的字符输出。 SysMin 向循环缓冲区写入字符。 *可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。 SysMin.flushAtExit = false; */ SysMin.flushAtExit = true; // * BIOS 模块将为系统创建默认堆。 *指定此默认堆的大小。 // BIOS.heapSize = 0x1000; // *从源代码构建自定义 SYS/BIOS 库。 // BIOS.libType = BIOS.LibType_Custom; //系统堆栈大小(由 ISR 和 Swi 使用)*/ Program.stack = 0x2000; // System_printf ()的循环缓冲区大小*/ sysmin.bufSize = 0x200; // *为整个系统创建和安装记录 器*/ var logerBufParams = loggerBufParams; 创建 LoggerBufParams = 16.0=LoggerLoggerBufParams;创建和安装记录器 Defaults.common$.logger = logger0; Main.common$.diags_INFO = Diags.always_on; System.SupportProxy = SysMin;
这是我的主要:
/* === main.c ====== */ #include #include #include #include #include /* === taskFxn ==== */ void taskFxn (UArg a0、UArg A1) { system_printf ("enter taskFxn ()\n"); Task_sleep (10); system_printf ("exit taskFxn ()\n"\}); system_flush();/*强制 SysMin 输出到控制台*/ } /* === main ==== */ int main() { Task_Handle 任务; ERROR_Block EB; system_printf ("enter main()\n"); ERROR_INIT (&EB); 任务= Task_create (taskFxn、NULL、&EB); if (task =NULL){ System_printf ("Task_create() failed!\n"); BIOS_exit (0); } BIOS_start();/*不返回*/ 返回(0); }
您可以看到、这些是默认文件、我没有更改任何内容。 有趣的一点是,当我根据 c66x DSP 和 SYS/BIOS->典型值(使用完全相同的.c 和.cfg)创建项目时,它可以正常工作,但是它会在控制台中打印输出,而不是 ROV->SysMin:
我搜索了文档和论坛、但仍然无法理解如何使用 xdc.runtime 系统模块、为什么我的代码不起作用? 为什么 DSP 在控制台上打印其输出? 因为我读取了必须使用 SysStd 来实现该目的的某个位置、但如您所见、我正在使用 SysMin (System.SupportProxy = SysMin;)。
尊敬的 Alex:
System_flush 将字符从 SysMin 内部缓冲区(可通过 ROV 查看)刷写到控制台。 刷新后、字符在 ROV 中不可见。
您能否连接不提供任何输出(ROV 或控制台)的工程。
Todd
您好 Todd、
再次感谢您的响应、我为 CortexA15创建了一个新项目并在我的板上运行它、但仍然看不到任何输出:
这里是我的项目文件夹:
e2e.ti.com/.../emptyPrintA15.zip
很抱歉耽误你的时间、我无法访问我的主板和 PC。
B.R、
Alex。
尊敬的 Alex:
首先、您能否在 System_flush 中设置断点、然后查看 ROV。
void taskFxn (UArg a0、UArg A1) { system_printf ("enter taskFxn ()\n"); Task_sleep (10); system_printf ("exit taskFxn ()\n"\}); system_flush();/*强制 SysMin 输出到控制台*/<--在此处添加断点 }
如果 ROV->SYSMIN->OutputBuffer 仍然为空,您能告诉我您拥有的 SYS/BIOS 和 XDCtools 版本。 多核器件上早期版本的 ROV 存在一些问题。 此外、您能否试用 ROV Classic。 它显示相同的基本数据(并且在多核器件上没有任何问题)。
Todd