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-CC2640R2:Task_yield | TI-RTOS

Guru**** 2595805 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/612181/rtos-launchxl-cc2640r2-task_yield-ti-rtos

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

工具/软件:TI-RTOS

大家好、

我使用了 ble5_simple_broadcaster _cc2640r2lp_app 示例项目。我创建了另外两个控制 UART 和 ADC 的任务。  

UART 和 ADC 的任务优先级为1

 SimpleBLEBroadcaster 的任务优先级为1  

现在、我有3个具有相同优先级的任务。

我尝试使用 Task_yield ()来共享这三个任务的 CPU。

UART 的任务函数

静态空 SimpleUART_taskFxn (XDC_UARg arg0、XDC_UARg arg1){

const char text[]="试用版文本";

UART_Handle uartHandler;
UART_Params uartParams;

UART_INIT();
UART_PARAMS_INIT (uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_return_full;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudrate = 115200;

uartHandler = UART_OPEN (Board_UART0、uartParams);
while (1){
UART_WRITE (uartHandler、text、sizeof (text));
Task_yield ();
}

} 

ADC 的任务函数

静态空 threadFxn0 (XDC_UARg arg0、XDC_UARg arg1)
{
ADC_Handle adcHandler;
ADC_Params adcParams;

ADC_Params_init (&adcParams);
adcHandler = ADC_open (Board_DIO23_analog、&adcParams);

if (adcHandler == NULL){
while (1);
}

while (1){
ADC_convert (adcHandler、&adcValue);
Task_yield ();
}

adc_close (adcHandler);

} 

SimpleBLEBroadcaster 的任务函数

静态空 SimpleBLEBroadcaster _taskFxn (UArg a0、UArg A1)
{
//初始化应用
SimpleBLEBroadcaster _init ();

//
应用程序主循环用于(;)
{
//获取自启动以来的节拍数
uint32_t tickStart = Clock_getTicks();

uint32_t 事件;

事件= Event_pend (syncEvent、Event_ID_none、SBB_All_Events、
iCall_TIMEOUT_FOREVER);

IF (事件)
{
iCall_EntityID dest;
iCall_ServiceEnum src;
iCall_HciExtEvt *pMsg =空;

if (iCall_fetchServiceMsg (&src、&dest、
(void **)&pMsg)=ICALL_errno_Success)
{
IF (((src =ICALL_SERVICE_CLASS_BLE)&&(dest =self Entity))
{
//处理任务间消息
SimpleBLEBroadcaster _processStackMsg ((iCall_HDR *) pMsg);
}

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

//如果 RTOS 队列不为空,则处理应用程序消息。
IF (事件和 SBB_queue_EVT)
{
while (!Queue_empty (appMsgQueue))
{
sbbEvt_t *pMsg =(sbbEvt_t *) Util_dequeueMsg (appMsgQueue);
if (pMsg)
{
//处理消息。
SimpleBLEBroadcaster _processAppMsg (pMsg);

//从消息中释放空间。
iCall_free (pMsg);
}
}

}
Task_yield ();
}

我将代码上传到 launchpad 并打开 UART 终端以查看"试用版文本"。 然而,没有任何东西。  
我可能以错误的方式使用了 Task_yield ()函数。  

请帮助我找出我的问题

谢谢你  

祝你度过美好的一天

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

    我不确定这是使用 Task_yield 实现 RTOS 应用程序的最佳方法。 您是否与调试器进行了检查、以查看执行了什么? 我还建议您参加 RTOS SimpleLink Academy 实验:www.ti.com/simplelinkacademy

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

    您好!

    我在 Task_yield ()函数上放置一个断点来了解问题。  

    ROV 任务输出如下所示。 threadFxn0按预期运行、SimpleUART_taskFxn 为就绪状态。  

    在断点之后、我收到错误消息:

    在 C:/work\ccs_workspace\cc2604R2\send_adc_bluetooth\ble5_simple_broadcaster _cc2640r2lp_app\FlashROM_StackLibrary\ble5_simple_adc_bluetooth\ble5_simple_ccs_ccs2640r2lp_app_app\FlashROM_stackLibrary\ble5_cc2640r40r4}{cc2640r40r40r3}没有可用源代码:  

    当 CPU 执行 Task_yield ()时,我会得到这个错误消息。 我使用 Task_yield 函数在具有相同优先级的任务之间共享 CPU。  

    但是、永远不会执行 SimpleUART_taskFxn。

    谢谢你