3320|5

75

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

App_Thread是如何运行的? [复制链接]

下面是BLE Wireless UART例子程序ApplMain.c中main_task最后调用的函数。其中处理了两类事件:gAppEvtMsgFromHostStack_c(the host to app message)和 gAppEvtAppCallback_c( the callback message ),这两个事件有什么不同,都是由哪里发起的,为什么gAppEvtMsgFromHostStack_c处理是用App_HandleHostMessageInput(pMsgIn);这个函数完成什么功能?

  1. void App_Thread (uint32_t param)
  2. {
  3.     osaEventFlags_t event;
  4.    
  5.     while(1)
  6.     {
  7.         OSA_EventWait(mAppEvent, osaEventFlagsAll_c, FALSE, osaWaitForever_c , &event);
  8.         
  9.         /* Dequeue the host to app message */
  10.         if (event & gAppEvtMsgFromHostStack_c)
  11.         {
  12.             /* Pointer for storing the messages from host. */
  13.             appMsgFromHost_t *pMsgIn = NULL;  
  14.             
  15.             /* Check for existing messages in queue */
  16.             while(MSG_Pending(&mHostAppInputQueue))
  17.             {
  18.                 pMsgIn = MSG_DeQueue(&mHostAppInputQueue);
  19.             
  20.                 if (pMsgIn)
  21.                 {
  22.                     /* Process it */
  23.                     App_HandleHostMessageInput(pMsgIn);
  24.                     
  25.                     /* Messages must always be freed. */
  26.                     MSG_Free(pMsgIn);
  27.                     pMsgIn = NULL;
  28.                 }
  29.             }
  30.         }
  31.         
  32.         /* Dequeue the callback message */
  33.         if (event & gAppEvtAppCallback_c)
  34.         {
  35.             /* Pointer for storing the callback messages. */
  36.             appMsgCallback_t *pMsgIn = NULL;  
  37.             
  38.             /* Check for existing messages in queue */
  39.             while(MSG_Pending(&mAppCbInputQueue))
  40.             {
  41.                 pMsgIn = MSG_DeQueue(&mAppCbInputQueue);
  42.             
  43.                 if (pMsgIn)
  44.                 {
  45.                     /* Execute callback handler */
  46.                     if (pMsgIn->handler)
  47.                     {
  48.                         pMsgIn->handler (pMsgIn->param);
  49.                     }
  50.                     
  51.                     /* Messages must always be freed. */
  52.                     MSG_Free(pMsgIn);
  53.                     pMsgIn = NULL;
  54.                 }
  55.             }
  56.         }
  57.         /* For BareMetal break the while(1) after 1 run */
  58.         if( gUseRtos_c == 0 )
  59.         {
  60.             break;
  61.         }
  62.     }
  63. }
复制代码



gAppEvtAppCallback_c事件用pMsgIn->handler (pMsgIn->param)处理的,怎么感觉什么也没有做呀?到哪里可以看到所有的应用回调函数呀?
  
  1.      /* Dequeue the callback message */
  2.         if (event & gAppEvtAppCallback_c)
  3.         {
  4.             /* Pointer for storing the callback messages. */
  5.             appMsgCallback_t *pMsgIn = NULL;  
  6.             
  7.             /* Check for existing messages in queue */
  8.             while(MSG_Pending(&mAppCbInputQueue))
  9.             {
  10.                 pMsgIn = MSG_DeQueue(&mAppCbInputQueue);
  11.             
  12.                 if (pMsgIn)
  13.                 {
  14.                     /* Execute callback handler */
  15.                     if (pMsgIn->handler)
  16.                     {
  17.                         pMsgIn->handler (pMsgIn->param);
  18.                     }
  19.                     
  20.                     /* Messages must always be freed. */
  21.                     MSG_Free(pMsgIn);
  22.                     pMsgIn = NULL;
  23.                 }
  24.             }
  25.         }
复制代码
此帖出自NXP MCU论坛

最新回复

ble要处理两种类型消息, 一种是从host(master)过来的消息, 一直是发送给host的。 pMsgIn->handler (pMsgIn->param);就是调用注册过的handler回调函数处理。  详情 回复 发表于 2017-7-5 23:38
点赞 关注
 

回复
举报

75

帖子

2

TA的资源

一粒金砂(中级)

沙发
 
在这个函数的说明中说This function is called to process all events for the task. Events  include timers, messages and any other user defined events.
哪个文档中有具体说明哪些是定时器事件,哪些是AD事件,用户如何自定义事件?
此帖出自NXP MCU论坛
 
 
 

回复

75

帖子

2

TA的资源

一粒金砂(中级)

板凳
 
osaEventFlags_t event;中定义的事件类型只是一个32位的无符号整数,怎么知道事件中每一位的含义?
如果要在App_Thread程序中处理定时器(TPM和PIT),AD,DMA的事件应该如何修改这个函数?
此帖出自NXP MCU论坛
 
 
 

回复

75

帖子

2

TA的资源

一粒金砂(中级)

4
 

如何查看这些文件的层级和引用关系?

此帖出自NXP MCU论坛
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

5
 
ble要处理两种类型消息, 一种是从host(master)过来的消息, 一直是发送给host的。
pMsgIn->handler (pMsgIn->param);就是调用注册过的handler回调函数处理。
此帖出自NXP MCU论坛

点评

在这个程序当中,由事件发送过程将回调函数的handler发送到事件队列中,再由事件处理函数处理该事件时调用这个handler。我的问题是为什么不在事件发送过程中直接调用回调函数,而非要通过事件发送方式去调用回调函数  详情 回复 发表于 2017-7-16 16:23
 
 
 

回复

75

帖子

2

TA的资源

一粒金砂(中级)

6
 
allenliu 发表于 2017-7-5 23:38
ble要处理两种类型消息, 一种是从host(master)过来的消息, 一直是发送给host的。
pMsgIn->handler (pMs ...

在这个程序当中,由事件发送过程将回调函数的handler发送到事件队列中,再由事件处理函数处理该事件时调用这个handler。我的问题是为什么不在事件发送过程中直接调用回调函数,而非要通过事件发送方式去调用回调函数?
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表