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.

[参考译文] CCS/TMDXIDK57X-LCD:System_printf 在 cortex-A15 tidpal sys/BIOS 中不工作

Guru**** 2027820 points
Other Parts Discussed in Thread: AM5728
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/827110/ccs-tmdxidk57x-lcd-system_printf-is-not-working-in-cortex-a15-tipycal-sys-bios

器件型号:TMDXIDK57X-LCD
主题中讨论的其他器件:AM5728

工具/软件: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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对此进行了任何更新?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Todd:

    正如您所说、我在  System_flush 中放置了一个断点  、现在我可以在 ROV 中看到输出:

    但是、当我删除断点时、ROV 中不显示任何内容、如果我单步执行我的断点并转到下一行、ROV 将被清除、但控制台中不显示任何内容!

    P.S:我的 SYS/BIOS 版本为 6_75_02_00、我的 XDCtools 版本为 3_51_01_18。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Alex、

    您使用的是哪种编译器? 如果您使用 GCC、是否有半托管集。 此处提供更多详细信息:  

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Todd、

    你是对的,问题是半宿主,我不知道有这样的事情存在。

    现在它按预期工作。 感谢你的帮助。

    B.R、

    Alex。