微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > 关于CC1310 EasyLink例程Semaphore的问题

关于CC1310 EasyLink例程Semaphore的问题

时间:12-23 整理:3721RD 点击:

代码看到这里

    while(1) {
#ifdef RFEASYLINKRX_ASYNC
        EasyLink_receiveAsync(rxDoneCb, 0);

        /* Wait 300ms for Rx */
        if(Semaphore_pend(rxDoneSem, (300000 / Clock_tickPeriod)) == FALSE)
        {
            /* RX timed out abort */
            if(EasyLink_abort() == EasyLink_Status_Success)
            {
               /* Wait for the abort */
               Semaphore_pend(rxDoneSem, BIOS_WAIT_FOREVER);
            }
        }
#else

1.在EasyLink_receiveAsync(rxDoneCb, 0);中已经有回调函数行使Semaphore_post,那之后的Semaphore_pend(rxDoneSem, (300000 / Clock_tickPeriod)) 不是会立即触发?怎么样在没有收到数据的时候等待300ms?

2.我记得在rfpacket例程中进入接收模式是永久性的,EasyLink_receiveAsync是否也是一样?还是接收完数据会退出接收模式?

3.Semaphore是确保同步的逻辑吧?函数中为什么会使用Async字眼呢?

也许问题问的很菜鸟,还请ti工程师们不吝赐教,O(∩_∩)O谢谢

求解答

xin wang22,

在RFEASYLINKRX_ASYNC 模式下,是300ms开窗RX,然后结束,循环模式。

不是在RFEASYLINKRX_ASYNC下,则是一直RX,不停。

我调试了一下,在RFEASYLINKRX_ASYNC模式下接收函数接收到了后会触发回调函数,回调函数中有post解除占用,此时接收已经结束了吧。另外在等待接收的过程中是否可以执行主程序?一段时间后再检查信号量是否post以实现异步?

xin wang22,

是的,此时接收已经结束。

在pending的状态下,其他task是可以继续执行的,只是这个task在pending。咱们这里的做法首先是等300ms,如果没有接收完成,就自己abort。abort成功的话会发semaphore。所以在abort函数调用之后就在那里forever pending。这个时候其他task也可以继续执行。

明白了,谢谢解答,另外task是否是根据优先级循环顺序执行的?如果一个task中死循环就不会执行其他task了是吗?

xin wang22,

是的。这是RTOS的知识了。

Task都是有优先级的,优先级高的task有更高的执行优先,整个系统说白了还是时间片轮转,作为一个单核的MCU,如果其中一个task在跑wihle(1) 死循环且中间没有用pending之类的方式让出时间给其他task,那么整个系统就挂起了。

你可以上网搜索一下RTOS的介绍。

TI RTOS也是有user guide的,你可以在安装目录下找到:C:\TI\tirtos_cc13xx_cc26xx_2_16_00_08\docs

好的,谢谢解答

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top