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.

[参考译文] TMS320F28374S:我能否在同一上下文中发布到邮箱、然后在该邮箱上挂起?

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1031081/tms320f28374s-can-i-post-to-a-mailbox-then-pend-on-that-mailbox-in-the-same-context

器件型号:TMS320F28374S

您好!

我有一个用于某些通信调度的任务,我想知道是否可以在同一个任务中执行 Mailbox_post ()和 Mailbox_pend()来进行初始化。 我尝试的代码与下面列出的代码类似、并且在邮箱指针中列出的数据中遇到错误:

typedef struct 
{
	int id;
	char firstname[25];
	char lastname[25];
} MY_MAILBOX_STRUCT;

/*---------------------------------------------------------------------------*/
/** @brief A Task for Scheduling Messages
 * This task pends on messages being posted into it's mailbox
 *//*------------------------------------------------------------------------*/
void someTask(void)
{
	void* msgPtr;
	MY_MAILBOX_STRUCT *MbxPtr;
	
    MY_MAILBOX_STRUCT mbx = 
	{
		10, "HELLO", "WORLD"
	}
		
    Mailbox_post(someMailbox, (void*)&mbx, BIOS_NO_WAIT);

    while(true)
    {
		Mailbox_pend(someMailbox, msgPtr, BIOS_WAIT_FOREVER);
		MbxPtr = (MY_MAILBOX_STRUCT*)msgPtr;
		
		//Do whatever work with the newMbxPtr I have
    }
}

感谢您的任何帮助!

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

    我认为这不会有问题。 当您说您看到错误时、您意味着数据不是预期值?

    如果您查看 POST 和 PEND 函数的返回值、它们是否符合预期?

    惠特尼

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

    感谢您对 Whitney 的回应  

    我需要更正的轻微拼写错误:我尝试在同一个邮箱上发布、然后挂起。  在我编辑之前、 有不同的邮箱名称、但我更正了代码。

    pend 和 post 函数的返回都为 true、我可以看到消息被放置到邮箱中并被移出。  问题是当我将'void*' msgPtr 转换为'My_mailbox_struct*'时,所有字段都不正确,就像有垃圾数据被从邮箱或其他内容中拉出一样。 如果我保持此代码不变,但我有一个单独的较低优先级任务执行第一个 Mailbox_post (),那么一切都可以正常工作,我不确定原因。 当我将该单独的任务设置为更高的优先级时、我会遇到相同的问题。 就好像邮箱在任何讯息被张贴到它之前需要被挂起。 邮箱系统应该是怎样工作的?

    再次感谢您的回答、很抱歉回答了我刚刚提出的所有问题  

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

    您是否考虑共享邮箱的配置方式? 配置文件中、还是动态地? 什么参数?

    我搜索了一些示例并找到 了这些示例。 我尝试了第一个项目、它运行良好。 即使我添加了一个任务睡眠来确保布置在挂起之前发生、或者将两个循环移动到一个任务中、打印的结果仍然可以、因此我认为这两个顺序都没有任何错误。

    您是否在 ROV 中看到任何错误?

    惠特尼

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

    我不介意分享! 我在调试时查看 CCS 表达式窗口中的数据。 我在配置文件中配置邮箱、如下所示:

    /*
     * Mailboxes
     */
    var i2cManagerMailboxParams = new Mailbox.Params();
    i2cManagerMailboxParams.instance.name = "i2cManagerMailbox";
    Program.global.i2cManagerMailbox = Mailbox.create(24, 100, i2cManagerMailboxParams);

    如果您需要其他信息、请告诉我!

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

    此外、当我第一次使用 ROV 时、我遇到此错误:

    错误:无法使用'comm=DSLite、wsPort=58820':InternalError: Cannot find method xdc.rta.Formatter.setOFReader(org.mozilla.javascript.Undefined 启动 ROV)。 (C:/ti/ccs1020/xdctools_3_62_00_08_core/packages/xdc/rov/Model.xs #315)

    可能是一个单独的问题、但我想我应该提及它。 再次感谢 Whitney!

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

    为什么 Mailbox.create 中的邮件大小为24? my_mailbox_struct 是否至少为51?

    惠特尼

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

    哦、抱歉。 当我问我的问题时,我使用了一些通用的邮箱对象结构来说明我正在做什么。 我实际上将所有这些用于的是一种调度 I2C 消息的方法。 当我在 I2C_Mailbox_Structt 上进行大小化时、该值变为12。 我将该值加倍、以确保安全。 下面是我的实际邮箱结构:

    typedef struct
    {
        I2CM_TRANSACTION_ID transactionID;
        volatile I2C_MESSAGE_STRUCT *msg;
        int16_dtc messageCount;
        I2C_SETTINGS_STRUCT *settings;
        I2C_DEVICE_ID deviceID;
        void *i2cDevice;
    }I2C_MAILBOX_STRUCT;

    我不知道所有这些细节是否都相关 ,因为 在一个 Mailbox_pend()启动后,当我调用 Mailbox_post ()时,我有一些工作要做。 不过、如果您需要、我可以为您提供所有细节。 我对这种混乱表示歉意。

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

    不确定您的 ROV 可能会发生什么情况、但让它正常工作会更好。 经典 ROV 和常规 ROV 是否都出现错误(假设您使用的是同时具有这两种 ROV 的 CCS 版本)?

    您是否可以尝试在 Mailbox_pend()上放置一个断点并单步执行它并确保一切看起来正常? 我特别想知道 memcpy 的参数。 如果难以单步执行、您可以更改 SYS/BIOS 运行时选项以执行自定义编译、在该编译器中、您可以将优化编译器选项更改为-o0或-ooff

    惠特尼

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

    嘿、Whitney、我发现了我的问题。

    我有2个问题:

    第一个问题是我创建的 I2C_mailbox_struct 未正确打包、因此我遇到了存储器对齐问题。 我按如下方式重新排列了结构以解决该问题:

    typedef struct
    {
        void *i2cDevice;
        volatile I2C_MESSAGE_STRUCT *msg;
        I2C_SETTINGS_STRUCT *settings;
        I2CM_TRANSACTION_ID transactionID;
        I2C_DEVICE_ID deviceID;
        int16_dtc messageCount;
    }I2C_MAILBOX_STRUCT;

    先放置2个字变量、然后放置1个字变量。

    第二个问题是、我的变量超出了上下文范围。 我放置了一个代码的通用版本,但我实际上是从邮箱任务的同一文件范围内的一个单独函数中执行 Mailbox_post ()。 在该局部函数内、我创建了局部变量、这些变量进入了邮箱结构、如果我没有在局部函数内创建新的 I2C_MESSAGE_STRUT 并且只将指针传递 到该 I2C_MAILBOX_STRUT、这是可以的。 我只复制了一个指针,当局部函数结束时,指针不会像它应该的那样指向任何内容,这就是局部变量的工作方式 。 这是我应该捕获的东西、因此我对此感到抱歉。

    我感谢您的帮助、尽管您非常出色、现在我知道 ROV、所以这是我可以使用的其他工具! 再次感谢您的帮助、我非常感谢您的帮助!