TI论坛
直播中

王燕

7年用户 1734经验值
私信 关注

请问怎么才能唤醒cc1310并且再唤醒后执行Task_sleep的下一句代码?

本帖最后由 一只耳朵怪 于 2018-6-6 17:02 编辑

您好,我使用Task_sleep(5000000 / Clock_tickPeriod);让系统进入待机模式,待机时间为5秒,并使能一个引脚中断,用于唤醒cc1310。但实测中,在待机模式时,我通过按一个按键触发中断,的确能唤醒cc1310,但唤醒后代码执行中断函数后退出似乎又进入待机模式,除非5秒过后才退出。
所以请问怎么才能唤醒cc1310并且再唤醒后执行Task_sleep的下一句代码?

回帖(13)

华农武

2018-6-6 10:34:44
LaoSheng Lin,
你是在task的执行函数里面调用Task_sleep()的吗?
把你代码贴上来看看呗。
举报

王燕

2018-6-6 10:51:06
引用: 骑猪去天山 发表于 2018-6-6 10:34
LaoSheng Lin,
你是在task的执行函数里面调用Task_sleep()的吗?
把你代码贴上来看看呗。

您好,我是在task中调用Task_sleep的。
在task中首先我注册按键下降沿中断
const PIN_Config keyPinTable[] = [
KEY | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
PIN_TERMINATE
];
keyPinHandle = PIN_open(&keyPinState, keyPinTable);
if (keyPinHandle != 0)
[
PIN_registerIntCb(keyPinHandle, &keyCallbackFxn);
]
然后再一个大循环中每睡眠5秒后进行一次RF发送
while(1)
[
RF_TxPacket txPacket = [0];
/* Create packet with incrementing sequence number and random payload */
txPacket.payload[0] = (uint8_t)(seqNumber >> 8);
txPacket.payload[1] = (uint8_t)(seqNumber++);
txPacket.payload[2] = battMeasure();
uint8_t i;
for (i = 3; i < PAYLOAD_LENGTH; i++)
[
txPacket.payload = i;//rand();
]
txPacket.len = PAYLOAD_LENGTH;
txPacket.dstAddr[0] = 0xaa;
txPacket.dstAddr[1] = 0x55;
txPacket.absTime = 0;/*RF_getCurrentTime() + RF_ms_To_RadioTime(1000);*/
LED_Set(Led_Red,1);   //红灯亮
RF_transmit(rfHandle, &txPacket);
LED_Set(Led_Red,0);  //红灯灭
Task_sleep(5000000 / Clock_tickPeriod);
]
在按键中断函数中让蓝灯反转
void keyCallbackFxn(PIN_Handle handle, PIN_Id pinId)
[
LED_Set(Led_Blue, !PIN_getOutputValue(LED_BLUE));
]
结果的现象是:我在进入待机时,按下按键,蓝色灯反转,说明进入中断,但红色灯不会亮即不发送RF,需等待机5秒后才发送RF
举报

华农武

2018-6-6 11:07:32
引用: 十个名字V 发表于 2018-6-6 10:51
您好,我是在task中调用Task_sleep的。
在task中首先我注册按键下降沿中断
const PIN_Config keyPinTable[] = [

LaoSheng Lin,
你这样按键也不会唤醒task呀,你按键中断跟这个task没任何关系,中断归中断,task还在5秒中睡着呢,所以肯定是每隔5秒醒来一次调用RF_transmit(),所以就是你看到的现象。
正确的做法你应该用semaphore,while(1) 之后等待semaphore, 这个时候这个task就是在sleep的, 然后按键中断的处理函数发送semaphore去唤醒task,不要用sleep函数。
如果你同时想要每隔5秒RF_transmit一下,那么你就要结合timer来做,用的也不是sleep。在上面我说的方法的基础上,设置个timer,每隔5秒用semaphore唤醒task,给task一个event, 在这个event中重新设置timer。如果收到按键中断, 也给个event给task,task在这个event下面停止timer,然后重启5秒的timer。
举报

王燕

2018-6-6 11:25:27
引用: 骑猪去天山 发表于 2018-6-6 11:07
LaoSheng Lin,
你这样按键也不会唤醒task呀,你按键中断跟这个task没任何关系,中断归中断,task还在5秒中睡着呢,所以肯定是每隔5秒醒来一次调用RF_transmit(),所以就是你看到的现象。
正确的做法你应该用semaphore,while(1) 之后等待semaphore, 这个时候这个task就是在sleep的, 然后按键中断的处理函数发送semaphore ...

谢谢Y的指点,我明白了,也就是说TI-RTOS自动会进入待机模式的吧,难怪我以前测试待机电流时,使用Task_Sleep和不使用时的功耗都差不多,都小于1uA
举报

更多回帖

×
20
完善资料,
赚取积分