Part Number:CC1310
各位专家大家好: 现在我正在分析 SENSOR 例程中,关于应用程序 OSALPort TI 15.4 STACK 进行任务通讯的流程,通过分析源码和文档了解到。TI 创建了 OSALPort 架构用于和 TI 15.4 STACK 进行任务通讯。
以确保各任务间通过事件、信号量、队列进行进程间的同步和共享资源的使用。
查看源码分析:
_macTaskId = macTaskInit(macUser0Cfg); 创建MAC 任务。并向OsalPort_registerTask 注册MAC任务,信号量
*ApiMac_init(uint8_t macTaskIdParam, bool enableFH) 向OsalPort_registerTask 注册SENSOR应用任务
问题A: 以上是否就是向OsalPort 注册了两个任务同时为任务目标设置不同信号量,用于唤醒不同任务处理。
SENSOR 任务处理中是 通过 ApiMac_processIncoming(); 进行信号等待,Semaphore_pend(appSemHandle, BIOS_WAIT_FOREVER ) 获取信号量后进行处理。
发送POLL 包具体分析:
Util_setEvent(&Jdllc_events, JDLLC_POLL_EVT);设置事件
/* Wake up the application thread when it waits for clock event */
Semaphore_post(sensorSem);唤醒SENSOR 任务,Jdllc_process 发送POLL 包,sendPollReq–> ApiMac_mlmePollReq(&pollReq); 发送完成后 ApiMac_processIncoming(); 等待信息响应唤醒。
问题2:在sendPollReq–> ApiMac_mlmePollReq(&pollReq) 后,应该是将此命令发送到OsalPort 模块并路由到TI 15.4 ,协议栈响应后由OsalPort 路由到 SENSOR 应用并唤醒处理。
我不清楚sendPollReq 后,是如何向OsalPort 发送信息并路由到TI 15.4 STACK. 跟踪源码没由找到ApiMac_mlmePollReq 的具体实现。我的理解sendPollReq 应该是设置POS MAC 任务 信号量,唤醒MAC TASK 进行处置。
MAC TASK 函数static void macTaskFxn(UArg a0, UArg a1)
请帮忙说明以上两个问题,谢谢。
Kevin Qiu1:
消息传递使用消息队列,线程同步用的是信号量
自由飞翔 说:问题A: 以上是否就是向OsalPort 注册了两个任务同时为任务目标设置不同信号量,用于唤醒不同任务处理。
是否看过https://dev.ti.com/tirex/content/simplelink_cc13x0_sdk_4_10_01_01/docs/ti154stack/html/ti154stack/application-overview.html
它详细说明了OSAL框架的使用
问题2:MAC层不开源,因此看不到具体的实现过程,这个我需要再确认一下之后回复你
,
自由飞翔:
上面的文档已经看过。
在调用APIMAC 请求时,是如何传递到OsalPort 中的?是否由MAC TASK 任务函数处理 static void macTaskFxn(UArg a0, UArg a1),那么是如何通过APIMAC 唤醒MAC TASK 任务函数的,一定要进行MAC TASK 信号量的POST ,要不怎么能唤醒另一各任务。
,
Kevin Qiu1:
和上面的过程类似,上面的链接中General Application Architecture部分大致介绍了OSAL和应用层处理的过程
会通过内部事件变量发布信号量事件和回调函数找到正确的MAC API