我目前想实现的目的是:
1:sensor小核采集ADC等数据每间隔10秒左右唤醒大核一次,然后发出一些采集数据
2:加入OAD功能可以对用程序进行升级。
目前已经分别实现了两个功能,但是把程序移植到OAD例程时发现
我目前想实现的目的是:
1:sensor小核采集ADC等数据每间隔10秒左右唤醒大核一次,然后发出一些采集数据
2:加入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();
}
}
您好,
是的,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)。