- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE \* MERGEFORMAT 57
A 先粗看了一些东西
如果某一个任务的event被置位了,就处理它。
即 taskEvents[idx]!=0
而这个事件是由中断程序之类的设置的或者由某一任务设置的?
只有有events事件发生的任务才去处理。没有事件发生的任务将跳过。
系统信息,可能会发给本任务,这个用函数:
Osal_msg_receve(simpleosal_taskID)就可以得知。
猜想:当系统事件发生时,它会将一个全局变量中的事件数组的某一个与0x8000或运算,到底是哪一个就是我们的任务排列的序号来决定的,例如我们在本例子中有11个任务(后来我自已又加了一个)如果第2个任务要发系统信息运去,就将这个数组置为1。
程序中的这样处理的:
tasksEvents[task_id] |= event_flag; // Stuff the event bit(s)见osal.c中。
这个信息处理函数(带任务ID参数)它就是读这个全局变量,看这个是发给谁的。
所以它先看有没有系统事件是发给本任务的,
uint8 *osal_msg_receive( uint8 task_id )
{
osal_msg_hdr_t *listHdr; ///队列指针,用于搜索的
osal_msg_hdr_t *prevHdr = NULL; ///前一个
osal_msg_hdr_t *foundHdr = NULL; ///发现的指针处
halIntState_t intState; ///这个不知是干什么用的
// Hold off interrupts
HAL_ENTER_CRITICAL_SECTION(intState); ////进入
// Point to the top of the queue
listHdr = osal_qHead; ////指向队列的前部
// Look through the queue for a message that belongs to the asking task
while ( listHdr != NULL ) ////只要队列不空,就一直往下走
{
if ( (listHdr - 1)-dest_id == task_id ) ///事件队列中的目标ID是指向本地ID否?
{
if ( foundHdr == NULL ) ///第一次发现消息是给自已的
{
// Save the first one
foundHdr = listHdr; ////发现一个消息是给自已的
}
else
{
// Second msg found, stop looking 又发现一个 直接退出了
break;
}
}
if ( foundHdr == NULL )
{
prevHdr = listHdr; ///当前这个就是第一个
}
listHdr = OSAL_MSG_NEXT( listHdr ); ///指向下一个
}
// Is there more than one?
if ( listHdr != NULL )
{
// Yes, Signal the task that a message is waiting
osal_set_event( task_id, SYS_EVENT_MSG );
}
else
{
// No more 如果没有消息就告诉任务,现在没有系统消息
osal_clear_event( task_id, SYS_EVENT_MSG );
}
// Did we find a message?
if ( foundHdr != NULL ) ////将这个消息从中间抽出来让它消失掉,这时就要知道前一个
{
// Take out of the link list
osal_msg_extract( osal_qHead, foundHdr, prevHdr );
}
// Release interrupts
HAL_EXIT_CRITICAL_S
文档评论(0)