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/LAUNCHXL-CC2650:正确放置&TI-RTOS 中辅助任务的队列

Guru**** 2553260 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/575695/rtos-launchxl-cc2650-proper-placement-queuing-of-secondary-task-in-ti-rtos

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件:CC2650

工具/软件:TI-RTOS

您好!

除了蓝牙功能之外、我还需要 CC2650上的 ADC 支持(目前正在使用 launchpad)。  我相信 Project Zero 正在工作、我认为我理解该计划的一般流程、但我仍然有疑问。

我将从 Project Zero 发布主要任务以供参考:

静态空 ProjectZero_taskFxn (UArg a0、UArg A1)
{
//初始化应用
ProjectZero_init ();

//
应用程序主循环(;)
{
//等待与调用线程关联的信号量。
//请注意、当发出信号时、与线程关联的信号量会发出信号
//消息在线程的消息接收队列中排队,或在何时排队
// iCall_signal ()函数被调用到信号量上。
iCall_errno errno = iCall_Wait (ICALL_TIMEOUT_FOREVAL);

if (errno =ICALL_errno_Success)
{
iCall_EntityID dest;
iCall_ServiceEnum src;
iCall_HciExtEvt *pMsg =空;

//检查我们是否由于堆栈消息而获得信号
if (iCall_fetchServiceMsg (&src、&dest、
(void **)&pMsg)=ICALL_errno_Success)
{
uint8 safeToDealloc = true;

IF (((src =ICALL_SERVICE_CLASS_BLE)&&(dest =self Entity))
{
iCall_Stack_Event *pEvt =(iCall_Stack_Event *) pMsg;

//检查接收到的事件标志(事件签名0xFFFF)
if (pEvt->signature == 0xFFFF)
{
//完成连接事件时接收到的事件
if (pEvt->EVENT_FLAG & PRZ_CONN_EVT_END_EVT)
{
//尝试重新发送待处理的 ATT 响应(如果有)
ProjectZero_sendAttRsp();
}
}
否则//它是来自堆栈的消息,而不是事件。
{
//处理任务间消息
safeToDealloc = ProjectZero_processStackMsg ((iCall_HDR *) pMsg);
}
}

if (pMsg && safeToDealloc)
{
iCall_freeMsg (pMsg);
}
}

//处理从另一个任务或另一个上下文发送的消息。
while (!Queue_empty (hApplicationMsgQ))
{
app_msg_t *pMsg = Queue_dequeue (hApplicationMsgQ);

//处理可能从我们自己发送的应用层消息。
USER_processApplicationMessage (pMsg);

//释放收到的消息。
iCall_free (pMsg);
}
}

} 

关于 Queue_empty 和去队列的最后一位使我相信附加辅助任务的正确方法是创建任务并将其结果排队到 hApplicationMsgQ 队列中、以便在 user_processApplicationMessage (pMsg)中进行处理;

我的问题是:

1. 这是正确/推荐的方法吗?  (使用已建立的应用程序队列)

2. 我是否需要休眠主任务以便次级运行?  (我是否需要设定优先级以及它们在哪里?)

 3、次要任务或多或少是一个定时任务(ADC 每~ 100ms 采样一次)。  我将如何使该任务在某个时间间隔内休眠或触发?

4. Log_info 在哪里 呼叫定向至?  它们似乎会导致 XDC、这使我认为它们已连接到调试器。  这些消息是否会传递到电路板运行的 CCS 实例?

谢谢!

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

    您好!

    请参阅内嵌注释以获取答案。

    1. 这是正确/推荐的方法吗?  (使用已建立的应用程序队列)

    -->是的。

    2. 我是否需要休眠主任务以便次级运行?  (我是否需要设定优先级以及它们在哪里?)

    --> 这取决于次要任务的优先级。 如果将其设置为1、该值与项目0相同、则在没有任何操作时、应让次级侧休眠。

     3、次要任务或多或少是一个定时任务(ADC 每~ 100ms 采样一次)。  我将如何使该任务在某个时间间隔内休眠或触发?

    void taskcustom_createTask (void)
    {
    Task_Params taskParams;
    
    //为状态机创建任务
    Task_Params_init (&taskParams);
    taskParams.stack = TaskStack;
    taskParams.STACKSIZE = task_stack_size;
    &priority = task_priority;//在此处设置优先级任务 Params.stack =任务 Params.h
    
    
    、任务 Params.stack
    
    
    =任务1、任务 UxArn (任务1)、任务1、任务1 Urguyourg (任务1)
    
    //此处为伪代码
    adc_init();
    //... 添加所有初始化代码
    
    while (1){
    if (adc_read()){
    //执行所需的任何操作
    }
    
    if (readFlag = 1){
    //您可以使用属性写入/读取回调来更改 readFlag
    //然后调用 myservice_SetParameter 以更改特征数据
    }
    /*睡眠*/
    Task_sleep (sleep_time);
    }
    }
    

    4. Log_info 在哪里 呼叫定向至?  它们似乎会导致 XDC、这使我认为它们已连接到调试器。  这些消息是否会传递到电路板运行的 CCS 实例?

    项目0中的所有日志信息都会重定向到 UART。 只要对器件进行了编程、就无需运行 CCS 即可查看日志记录。