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.

[参考译文] RTOS/AWR1642:SYS/BIOS:邮箱

Guru**** 2589265 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/654429/rtos-awr1642-sys-bios-mailbox

器件型号:AWR1642
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我想动态 创建一个 SYS/BIOS 邮箱,但 遇到了一个问题。完整 代码如下:

#include

#include
#include

#include
#include
#include
#include

EVENT_Handle myEvent;
Task_handle tsk1;
Task_handle tsk2;

mailbox_handle mbox;
typedef 结构{
UINT id;
char buf[10];
} msg;

MSG msgC、msgA、msgB;
/ /
/**//
/*延迟*/
/**//
/ /
空延迟(UINT n)

UINT I;

for (i=n;i>0;i--);

空 writerTask (空)

Mailbox_post (mbox、&msgA、BIOS_wait_forever);
/*将 Event_ID_00隐式布置到 myEvent */

空 ISR (空)

EVENT_POST (myEvent、Event_ID_01);

空 readerTask (空)

UINT 事件;
UChar I;
while (1){//*等待 ISR 或邮箱消息*/
事件= Event_pend (myEvent、
EVENT_ID_NONE、/*且掩码= 0 */
EVENT_ID_00 + Event_ID_01、/* orMask */
BIOS_wait_forever);/*超时*/
if (Events & Event_ID_00){
/*获取发布的消息。
* Mailbox_pend ()不会阻止、因为 Event_pend ()
*已保证消息可用。
*请注意特殊的 BIOS_NO_WAIT
*参数告诉邮箱 Event_pend()
*用于获取可用消息。
*
Mailbox_pend (mbox、&msgB、BIOS_no_wait);
system_printf ("循环次数为%d!\n"、(msgB.id));
for (i=0;i<10;i++)
system_printf ("循环次数为%d!\n"、(msgB.buf[i]));

if (Events & Event_ID_01){
System_printf ("事件是--Event_ID_01--!\n");


/ /
/**//
/*任务*/
/**//
/ /
空 TaskCore1 (UARg a0、UARg A1)

UChar I;
System_printf ("Enter TaskCore1()\n");
for (;;)

// System_printf ("TaskCore1 ()休眠之前******* \n");
// Task_sleep (10);
// System_printf ("TaskCore1 ()休眠之后刚启动******* \n");
//循环
for (i=0;i<10;i++)

//延时
system_printf ("循环次数为%d!\n"、i);
system_flush();
延迟(0x002FFFFF);
延迟(0x002FFFFF);
if (i=1)

writerTask();
System_printf ("已发布 Event_ID_00!\n");

if (i==5)

ISR();
System_printf ("已发布 Event_ID_01!\n");



空 TaskCor2 (UARg a0、UARg A1)

for (;;)

System_printf ("Enter TaskCor2 ()\n");
system_flush();
////////////////////////////////////////////////////////////////////////////////////////////
readerTask();

/ /
/**//
/*主函数*/
/**//
/ /
int main()

Mailbox_Params mboxParams;
ERROR_Block EB;

ERROR_INIT (&EB);
myEvent = Event_create (NULL、&EB);
if (myEvent == NULL){
system_abort ("事件创建失败");

System_printf ("myEvent 设置成功!\n");

Mailbox_Params_init (&mboxParams);
mboxParams.readerEvent = myEvent;
/*将 Event_ID_00分配给邮箱"非空"事件*/
mboxParams.readerEventId = Event_ID_00;
mbox = Mailbox_create (sizeof (msg)、50、&mboxParams、NULL);
if (mbox == NULL){
system_abort ("创建邮箱失败");

System_printf ("mboxParams 设置成功!\n");
/* Mailbox_create()将邮箱的 readerEvent 设置为
*计数模式和初始计数= 50 */

UChar aa;
(msgc.id)=100;
//循环

(aaa=0;a<10;a++)
msgc.buf[aa]=aa*aa;

msgA=msgC;

//创建两个任务
Task_Params taskParams;
Task_Params_init (&taskParams);
taskParams.priority = 1;
tsk1 = Task_create (TaskCore1、&taskParams、NULL);

Task_Params_init (&taskParams);
taskParams.priority = 2;
tsk2 = Task_create (TaskCor2、&taskParams、NULL);

//启动 SYS/BIOS 系统
BIOS_start();

返回(0);

我 根据  MMW_Cap外 转演示重写 MMW_DSS.c 。编译时出错。 错误 如下所示:

未定义对./dss_main.oe674 .xdchelp /MMW_DSS C/C++问题中的"ti_SysBIOS_KNL_Mailbox_Params__init_S"的引用

未定义对./dss_main.oe674 .xdchelp /MMW_DSS C/C++问题中的"ti_SysBIOS_KNL_Mailbox_pend_E_E"的引用

未定义对./dss_main.oe674 .xdchelp /MMW_DSS C/C++问题中的"ti_SysBIOS_KNL_Mailbox_post_E_E"的引用

当我将内容(__LW_AT__var Mailbox = xdc.useModule('ti.sysbios.knl.Mailbox');)添加到 dss_mmw.cfg 文件,项目 编译成功。调试时,会遇到 以下问题:

[C674x_0] myEvent 设置成功!

{MODULE#35}:第78行:错误{id:0x10000、args:[0x804a1d、0x804a1c]}

xdc.runtime.Error.raise:终止执行

能不能帮我、非常感谢!

 

 

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

    是的、您需要将 var Mailbox = xdc.useModule('ti.sysbios.knl.Mailbox'添加到.cfg 文件中。 这会告诉内核将模块包含在链接中。

    我假设在 Mailbox_create 调用中此操作失败。 你堆的大小是多少? 您可以在 Tools->ROV->HeapMem->Module 中查看堆的大小和可用的大小。 在您调用 Mailbox_create 之前、我会执行此操作。

    如果不是这样、您能否在.cfg 文件中设置以下内容。 这将在错误消息中提供更多信息。

    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    Defaults.common$.namedModule = true;

    var text = xdc.useModule('xdc.runtime.Text');
    text.isLoaded = true;

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您不能查看 Tools->ROV->HeapMem->Module。 我只看 Tools->ROV Classic、然后它显示 RTOS 对象视图(ROV)、我不能 HeapMem->Module。 我使用 ccs7.2 HeapMem->Module Compiler Environment。

    我在.cfg 文件中设置以下内容。 这种结果仍然是错误的。

    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    Defaults.common$.namedModule = true;

    var text = xdc.useModule('xdc.runtime.Text');
    text.isLoaded = true;

    错误的结果仍然是:
    [C674x_0] myEvent 设置成功!
    {MODULE#35}:第78行:错误{id:0x10000、args:[0x804a1d、0x804a1c]}
    xdc.runtime.Error.raise:终止执行

    我认为 Mailbox_create 调用,失败、因为"mboxParams 设置成功!" 不输出。代码如下:

    System_printf ("myEvent 设置成功!\n");

    Mailbox_Params_init (&mboxParams);
    mboxParams.readerEvent = myEvent;
    /*将 Event_ID_00分配给邮箱"非空"事件*/
    mboxParams.readerEventId = Event_ID_00;
    mbox = Mailbox_create (sizeof (msg)、50、&mboxParams、NULL);
    if (mbox == NULL){
    system_abort ("创建邮箱失败");

    System_printf ("mboxParams 设置成功!\n");
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉。 它是"详细"而非"模块"

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

    您好,

    在我调试代码,显示为流:后

    我在.cfg 文件中设置以下内容。 这种结果仍然是错误的。  

    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    Defaults.common$.namedModule = true;

    var text = xdc.useModule('xdc.runtime.Text');
    text.isLoaded = true;

    错误的结果仍然是:
    [C674x_0] myEvent 设置成功!
    {MODULE#35}:第78行:错误{id:0x10000、args:[0x804a1d、0x804a1c]}
    xdc.runtime.Error.raise:终止执行

    我认为 Mailbox_create 调用,失败、因为"mboxParams 设置成功!" 不输出。代码如下:

    System_printf ("myEvent 设置成功!\n");

    Mailbox_Params_init (&mboxParams);
    mboxParams.readerEvent = myEvent;
    /*将 Event_ID_00分配给邮箱"非空"事件*/
    mboxParams.readerEventId = Event_ID_00;
    mbox = Mailbox_create (sizeof (msg)、50、&mboxParams、NULL);
    if (mbox == NULL){
    system_abort ("创建邮箱失败");

    System_printf ("mboxParams 设置成功!\n");

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

    是否确定重建.cfg 文件? 您能否查看 ROV 的以下设置并在目标上确认该设置?

    注意:您不应将 NULL Error_Block 传递到 create 调用中。 查看示例/文档以了解如何使用 Error_Block。 基本而言、您需要初始化 Error_Block 并将其传递到 create 调用中。 Error_Block 可用作高级调试功能。

    是否可以附加.cfg 文件?

    Todd

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

    您好,

       我重新编译 MMW_DSS 工程,、但结果仍然如下所示:

    dss_mmw.cfg 如下所示:

    /*
    *德州仪器公司版权所有2016。
    *
    *保留所有权利。 德州仪器(TI)公司的财产。
    *使用、复制或披露此代码的受限权限为
    *通过合同授予。
    *
    *
    环境['xdc.cfg.check.fatal']='fals';

    /********
    秘书长的报告 BIOS 模块********
    (二 /
    VAR 内存= xdc.useModule('xdc.runtime.Memory');
    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
    VAR 空闲= xdc.useModule('ti.sysbios.knl.Idle');
    VAR SEM = xdc.useModule('ti.sysbios.knl.Semaphore');
    VAR 事件= xdc.useModule('ti.sysbios.knl.Event');
    VAR Hwi = xdc.useModule('ti.sysbios.family.c64p.Hwi');
    VAR 系统= xdc.useModule('xdc.runtime.System');
    VAR SysStd = xdc.useModule('xdc.runtime.SysStd');
    VAR EventCombiner = xdc.useModule('ti.sysbios.family.c64p.EventCombiner');
    VAR Load = xdc.useModule('ti.sysbios.utils.Load');
    VAR 邮箱= xdc.useModule('ti.sysbios.knl.Mailbox');
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    Defaults.common$.namedModule = true;

    var text = xdc.useModule('xdc.runtime.Text');
    text.isLoaded = true;

    System.SupportProxy = SysStd;

    /*
    *在此处启用事件组并完成特定 GEM INTC 的 ISR 注册
    *使用 EventCombiner_dispatchPlug()和 Hwi_EventMap() API
    *
    EventCombiner.eventGroupHwiNum[0]= 7;
    EventCombiner.eventGroupHwiNum[1]= 8;
    EventCombiner.eventGroupHwiNum[2]= 9;
    EventCombiner.eventGroupHwiNum[3]= 10;

    /*默认堆创建:本地 L2存储器*/
    var heapMemParams = new HeapMem.Params();
    heapMemParams.size = 16*1024;
    heapMemParams.sectionName ="systemHeap (系统堆)";
    program.global.heap0 = HeapMem.create (heapMemParams);
    Memory.defaultHeapInstance = Program.global.heap0;

    /*启用 BIOS 任务调度程序*/
    BIOS.taskEnabled = true;

    /*请勿调用用于加载的更新-应用程序将在帧间边界调用它*/
    load.updateInIdle = false;

    /*
    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    VAR 日志= xdc.useModule('xdc.runtime.Log');
    VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
    var logerBufParams = new LoggerBuf.Params();
    LoggerBufParams.numEntry = 1024;
    var logger0 = LoggerBuf.create (logerBufParams);
    Defaults.common$.logger = logger0;
    VAR 诊断= xdc.useModule('xdc.runtime.Diags');
    Hwi.common$.logger = logger0;
    Hwi.common$.diags_USER1 = Diags.RUNTIME_ON;
    Hwi.common$.diags_USER2 = Diags.RUNTIME_ON;
    *

    /*
    Task.common$.diags_USER1 = Diags.always_on;
    Task.common$.diags_USER2 = Diags.always_on;
    *
    //Program.sectMap[".vecs"]="向量";

    /*一些用于减少 BIOS 代码和数据大小的选项,请参阅“BIOS 用户指南”部分
    "最大限度地减小应用尺寸"*/
    System.maxAtexitHandlers = 0;
    BIOS.swiEnabled = false;//我们不使用 SWI */
    BIOS.libType = BIOS.LibType_Custom;
    Task.defaultStackSize = 1500;
    task.idleTaskStackSize = 800;
    program.stack = 1048;/*对于 ISR 上下文*/
    var text = xdc.useModule('xdc.runtime.Text');
    text.isLoaded = false;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我创建一个 Error_Block,如何查看其信息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    设置
    text.isLoaded = true;

    cfg 中的最后一条语句将其设置为 false。 这将擦除先前的设置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已将.cfg 中的最后一条语句设置为 false。 但调试仍然是错误!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将其设为真!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    控制台显示:[C674x_0] myEvent 设置成功!
    TI.SYSBIOS.KNL.Semaphore:第78行:断言失败:A_noEvents:禁用 Event.supportsEvents 标志。
    xdc.runtime.Error.raise:终止执行
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请在.cfg 文件中设置以下内容

    Semaphore.supportsEvents = true;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将其设置为 true 后,控制台显示:
    [C674x_0] myEvent 设置成功!
    TI.SYSBIOS.KNL.Semaphore:第78行:断言失败:A_noEvents:禁用 Event.supportsEvents 标志。
    xdc.runtime.Error.raise:终止执行
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢! 我的调试成功!