社区导航

 

搜索
查看: 1079|回复: 5

[求助] App_Thread是如何运行的?

[复制链接]

96

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-7-2 00:10:41 | 显示全部楼层 |阅读模式
下面是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.         }
复制代码


回复

使用道具 举报

96

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-7-2 00:49:55 | 显示全部楼层
在这个函数的说明中说This function is called to process all events for the task. Events  include timers, messages and any other user defined events.
哪个文档中有具体说明哪些是定时器事件,哪些是AD事件,用户如何自定义事件?


回复

使用道具 举报

96

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-7-2 00:59:57 | 显示全部楼层
osaEventFlags_t event;中定义的事件类型只是一个32位的无符号整数,怎么知道事件中每一位的含义?
如果要在App_Thread程序中处理定时器(TPM和PIT),AD,DMA的事件应该如何修改这个函数?


回复

使用道具 举报

96

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-7-2 01:25:52 | 显示全部楼层
捕获4.PNG
如何查看这些文件的层级和引用关系?



回复

使用道具 举报

103

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-7-5 23:38:51 | 显示全部楼层
ble要处理两种类型消息, 一种是从host(master)过来的消息, 一直是发送给host的。
pMsgIn->handler (pMsgIn->param);就是调用注册过的handler回调函数处理。

点评

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


回复

使用道具 举报

96

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-7-16 16:23:02 | 显示全部楼层
allenliu 发表于 2017-7-5 23:38
ble要处理两种类型消息, 一种是从host(master)过来的消息, 一直是发送给host的。
pMsgIn->handler (pMs ...

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


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-1-23 08:01 , Processed in 0.180277 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表