CC1312R: 关于CC1312R1的休眠,可以由两种事件唤醒么?

Part Number: CC1312R


我目前想实现的目的是:

1:sensor小核采集ADC等数据每间隔10秒左右唤醒大核一次,然后发出一些采集数据

2:加入OAD功能可以对用程序进行升级。

目前已经分别实现了两个功能,但是把程序移植到OAD例程时发现

 uint32_t events = Event_pend(clientEventHandle, 0, CLIENT_EVENT_ALL, BIOS_WAIT_FOREVER);
该函数只能对一个时间有用,如何两个时间无论是哪个事件到来都能够唤醒大核运行对应的功能
  • 您好

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待

  • Semaphore_pend
    Event_pend
    我想要使用这两个函数
    Semaphore_pend用来等待小核唤醒大核;
    Event_pend用来OAD事件唤醒大核进行OAD操作
  • 您好,    

    sensor小核

      这是指传感器控制器吗?也就是说,你使用的是Sensor Controller's ADC,而不是main MCU吗?

       OAD 是基于协议栈(TI 15-4 栈)还是基于RF?

      rfOADClientIntFlashUapp 显示了如何使用

    uint32_t events = Event_pend(clientEventHandle, 0, CLIENT_EVENT_ALL, BIOS_WAIT_FOREVER); 并从中唤醒。

    你需要在中断中使用 Semaphore_post 来从 Semaphore_pend 中唤醒。

    请具体说明您目前的问题。

  •  OAD 是基于协议栈(TI 15-4 栈)还是基于RF?

    基于RF,使用SUB1G进行发送

    这是指传感器控制器吗?也就是说,你使用的是Sensor Controller's ADC,而不是main MCU吗?

    是的,因为我需要只有在使用SUB1G发送数据的时候才唤醒大核处于工作状态从而把功耗降到最低,

    我遇到的问题是,我开了两个线程将OAD的rfOADClientIntFlashUapp程序保持不动,将我的功能加入到新开的线程里面去,程序根本无法运行,运行到Event_pend或者Semaphore_pend就会死机重启;我有尝试将两个功能放在一个线程里面,Event_pend和Semaphore_pend放在一起,算是一前一后这样也会死机然后重启。根本无法运行

    我最终需要实现的目的是:

    1、超低功耗的前提下,将小核sensor采集数据,并切定时唤醒大核,让大核计算并发送出去。

    2、实现应用程序可以使用SUB1G进行更新(升级)这样无需接触无需拆壳,在无需升级时只需等待尽可能不要提高功耗。

    因为详细查阅过 rfOADClientIntFlashUapp 的使用方法目前已经基本了解,但是现在将我需要的功能移植到 rfOADClientIntFlashUapp 遇到了问题,只要加入Semaphore_pend整个程序就会死机。尚未查到具体什么原因。为了避免表达有误以下是我已经实现的功能的代码,需要一直到 rfOADClientIntFlashUapp程序里面去。

    void *mainThread(void *arg0)
    {
    create_sin_tab(CREATE_SIN_TAB,32);

    Timer_Params params;
    RF_Params_init(&rfParams);
    if(RFQueue_defineQueue(&dataQueue,
    rxDataEntryBuffer,
    sizeof(rxDataEntryBuffer),
    NUM_DATA_ENTRIES,
    PAYLOAD_LENGTH + NUM_APPENDED_BYTES))
    {
    /* Failed to allocate space for all data entries */
    while(1);
    }
    /* Modify CMD_PROP_TX and CMD_PROP_RX commands for application needs */
    RF_cmdPropTx.pktLen = PAYLOAD_LENGTH;
    RF_cmdPropTx.pPkt = txBuffer;
    RF_cmdPropTx.startTrigger.triggerType = TRIG_NOW;//TRIG_ABSTIME;
    RF_cmdPropTx.startTrigger.pastTrig = 1;
    RF_cmdPropTx.startTime = 0;
    RF_cmdPropTx.pNextOp = (rfc_radioOp_t *)&RF_cmdPropRx;
    /* Only run the RX command if TX is successful */
    RF_cmdPropTx.condition.rule = COND_STOP_ON_FALSE;

    /* Set the Data Entity queue for received data */
    RF_cmdPropRx.pQueue = &dataQueue;
    /* Discard ignored packets from Rx queue */
    RF_cmdPropRx.rxConf.bAutoFlushIgnored = 1;
    /* Discard packets with CRC error from Rx queue */
    RF_cmdPropRx.rxConf.bAutoFlushCrcErr = 1;
    /* Implement packet length filtering to avoid PROP_ERROR_RXBUF */
    RF_cmdPropRx.maxPktLen = 5;//PAYLOAD_LENGTH-5;
    RF_cmdPropRx.pktConf.bRepeatOk = 0;
    RF_cmdPropRx.pktConf.bRepeatNok = 0;
    RF_cmdPropRx.pOutput = (uint8_t *)&rxStatistics;
    /* Receive operation will end RX_TIMEOUT ms after command starts */
    RF_cmdPropRx.endTrigger.triggerType = TRIG_REL_PREVEND;
    RF_cmdPropRx.endTime = RX_TIMEOUT;
    rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    /* Set the frequency */
    RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    RF_yield(rfHandle);
    sleep(2);
    sensor_controller_init(COLLECT_TIMER);
    while(1)
    {
    Semaphore_pend(Semaphore_handle(&semScTaskAlert), BIOS_WAIT_FOREVER);
    txFunctionUpdate();//该函数内仅包含计算sensor采集的数据以及使用RF_runCmd函数发送的相关代码

    /* Power down the radio */
    //RF_yield(rfHandle);
    scifAckAlertEvents();
    }
    }

  • 您好,

         推荐的方法是使用两个线程,一个用于 RF OAD(可以使用 SDK 提供的示例),另一个为Sensor Controller创建一个新线程。

        在Sensor Controller Studio中有一些示例可供参考。

        请注意,需要从 scTaskAlerCallback 中调用 Semaphore_post。

       

  • Semaphore_post只能从 scTaskAlerCallback 中调用么?否者不能实现?

    如果将Semaphore_post放在scTaskAlerCallback里面,主函数while(1){}里面应该怎么阻塞才能低功耗

  • 您好,

      是的,Semaphore_post 应该放在 scTaskAlerCallback 内,因为这是当传感器控制器唤醒主核时执行的回调函数。

    下面是一个快速示例,我将 rfOADClientIntFlashUApp 与传感器控制器的 adc_window_monitor 合并在一起。

    rfOADClientIntFlashUApp_CC1312R1_LAUNCHXL_tirtos7_ticlang.zip
    这里有两个 while(1) 循环:

    1. 一个 while 循环在 rfClient.c 内(属于 rfOADClientIntFlashUApp)

    1.1 它在执行 Event_pend(clientEventHandle, 0, CLIENT_EVENT_ALL, BIOS_WAIT_FOREVER) 后会无限等待;

    1.2 当通过 Event_post(clientEventHandle, CLIENT_EVENT_XXXXXX) 发布事件时,while 循环会继续。

    2. 第二个 while 循环在 taskFxn() 内,main_tirtos.c(属于传感器控制器示例)

    2.1 它在执行 Semaphore_pend(Semaphore_handle(&semScTaskAlert), BIOS_WAIT_FOREVER) 后会无限等待;

    2.2 当 ADC 窗口(DIO 23)发生变化时,信号量会被发布,循环继续。
    你可以使用调试器设置两个断点:一个在 scifClearAlertIntSource(main_tirtos.c),另一个在 if (events & CLIENT_EVENT_STATUS_UPDATE)(rfClient.c)。
    这些断点不会触发,直到你从 rfOADServer 启动 OAD 命令,或者 ADC 输入发生变化(使用跳线将 DIO 23 接地或拉到 VDD)。