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/CC1310:如何停止 Rx 射频操作

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/571702/rtos-cc1310-how-to-stop-rx-rf-operation

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

工具/软件:TI-RTOS

大家好、我在我们的项目中使用 TI-RTOS。

伪代码:


ApplTask()
{
while (true)
{ 
………… Queue.add (data) Event_post (readyEventFromAppl) } void RFTask() { while (true) { data = Queue.get(); RfTx (data); RfRx (callback、timeout); Event_pend (readyEventFromRf、timeout); GetDataEvent_Received (readyEventFromApplicent、timeout);Timeout} } callback() { Event_post (readyEventFromRf); }

 

因此 ,RfTask 阻止等待来自 callback()的事件,并且仅在该事件检查来自应用程序的事件之后。 

为了获得随时传输数据的机会 、我可以:

1.将 RfRx 超时设置为受限值,并定期退出队列-这会增加 发送数据进程的延迟。

2.从 AppTask 通过 RF_cancelCmd()显式停止射频, POST EventFromRf 包含 DataForSendReady  -每个射频操作都将停止(包括 Tx)。

3.从 ApplicationTask POST EventFromRf 包含 DataForSendReady -它不安全,因为 calling()也发布 EventFromRf 。

问:唤醒 RfTask()以获得 检查队列并传输数据的机会的正确方法是什么?

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

    您好 Leonid、

    您可以使用单个事件模块等待多个触发器。

    如果您查看 SYSBIOS 用户指南(www.ti.com/lit/spruex3)、Event_pend 具有以下原型:

    UINT Event_pend (Event_Handle 事件、
    UINT 和屏蔽、
    UINT 或屏蔽、
    UINT 超时); 

    因此、如果您对 orMask 使用位掩码(andMask 应等于0)、则一旦布置事件 A 或 B、Event_pend 就会退出。

    这样、您只需要等待一个事件模块、并且您将始终检测发生的事件。 您也不需要使用超时。

    下面是一些用于显示您可以执行的事件的伪代码:

    #define EVENT_A (1 << 0)// 0x01
    #define EVENT_B (1 << 1)// 0x02
    #define NO_EVENT 0
    #define All_EVENT_EVENT (EVENT_A | EVENT_B)
    
    Event_Handle handle;
    
    void TaskA (..) {
    while (1){
    //执行一些操作
    event_post (handle、event_a);
    }
    }
    
    void TaskB (..) {
    while (1){
    //执行一些操作
    EVENT_POST (handle、EVENT_B);
    }
    
    
    }void TaskC (..) {
    UINT EVENT_MASK;
    while (1){
    EVENT_MASK = Event_pend (handle、0、all_events、超时);
    
    if ((EVENT_MASK & EVENT_A)!= 0){
    //发生了 EVENT_A
    //在此处为事件 A 执行操作
    }
    
    if ((EVENT_MASK & EVENT_B)!= 0){
    //发生了 EVENT_B
    //此处为事件 B 执行操作
    }
    }
    

    此致、

    米歇尔

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

    您好、Michel、

    在我的示例中,事件可以从任务中给出,也可以从射频回调中异步给出(由 TI 射频驱动程序调用,实际上是 ISR)。

    这就是问题所在。

    BR

    Leonid

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

    我看不出这是怎么可能的问题。 除非我不明白实际的问题是什么。 ISR 和任务线程之间的唯一区别是一个是异步发送、另一个不是。

    在每次节拍时、调度程序都会唤醒并检查要运行的任务。 假设您的 RfTask 具有最高优先级且处于就绪状态(即事件挂起)、它将唤醒 RfTask 并退出 Event_pend。 然后、您应该能够查看发生了哪个事件。 因此、ISR 内部的事件发布也将唤醒 RfTask (我刚刚在示例代码中使用了任务来说明如何执行此操作)。

    如果您的问题没有得到解答、请提供更多详细信息。

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

    您好、Michel、

    这里是代码  

    task()
    {
    while (true)
    { 
    AddDataToQueue (data); Event_post (readyEvent、data2Send) } void RFTask() { while (true) { RX (回调、超时); Event_pend (readyEvent、any、timeout);

    //发送数据(如果有)
    getDataFromQueue (data);
    TX (数据); } } callback () { Event_post (readyEvent、DataReceived); }

    RfTask 在数据 就绪时被阻止、等待 readyEvent、由射频驱动器回调发送。


    ApplTask 有时希望通过 RF 发送数据。

    因此、readyEvent 事件对象用于回调和 ApplTask 中的 POST 操作。

     此任务可随时被 ISR 抢占。  

    问:从 ISR 和任务调用 Event_post ()是否安全?

     BR

    Leonid

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

    从 ISR 调用 Event_post ()是安全的。 如果 ISR 在处理事件时发生、Event_post 将只布置一个新事件。 ISR 执行其功能后、任务将恢复。 一旦任务返回到其 Event_pend、它将等待新的事件。

    如果您想知道发生了哪个事件、则可以使用我在第一篇文章中建议的策略(用 ISR 回调替换其中一个任务)。

    此致、
    米歇尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michel、
    问题是、从任务和从 ISR 发布事件(具有各种 ID)是安全的。
    BR
    Leonid
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您可以从 ISR 和任务发布到同一事件。 如前所述、建议使用相同的事件、但不同的标志(因此您可以识别事件)。
    此致、
    米歇尔