楼主: outman

[原创]奥特曼Zigbee读书日记(二)--OSAL系统框架专题

[复制链接]
tankooo 发表于 2010-6-5 17:31:37 | 显示全部楼层
支持LZ THANKS
gu520 发表于 2010-7-4 10:15:15 | 显示全部楼层
学习中。。。good!!顶你啊!outman!值得期待。。。
天脉男孩 发表于 2010-7-19 16:47:01 | 显示全部楼层
events = (tasksArr[idx])( idx, events );/请问这个events里面保留的是什么,是怎么得到的,然后怎么和后来要运行的程序进行连接的?小弟先多谢啦!
 楼主| outman 发表于 2010-7-19 22:02:13 | 显示全部楼层
不要把"events"和"task"搞混。每个task都有不同的events

tasksEvents[]这个数组存放的是"每个任务是否要在本次循环中运行(0为不运行)"和"如果要运行,具体是要执行哪个events"

比如,tasksEvents[0] =0说明,task0--macEventLoop这个任务在本次循环中无须执行;而tasksEvents[5] =KEY_CHANGE说明,task5--SampleApp_ProcessEvent这个任务在本次循环中要执行,而且具体要执行KEY_CHANGE这个events.

具体调用函数的地方是:
      events = (tasksArr[idx])( idx, events );
其中,(tasksArr[idx])指明了函数地址,( idx, events )是参数,events 是函数返回值。
天脉男孩 发表于 2010-7-20 09:18:26 | 显示全部楼层
醍醐灌顶,多谢!
天脉男孩 发表于 2010-7-27 16:35:55 | 显示全部楼层
请问按键检测程序中,最开始的Hal_ProcessEvent是怎么触发的?
 楼主| outman 发表于 2010-7-27 17:10:35 | 显示全部楼层
非中断模式下,是循环触发的

    /* if interrupt disabled, do next polling */
    if (!Hal_KeyIntEnable)
    {
      osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
    }
也就是说,每次在读完按键后,马上触发下一次的查询。

那第一次应该是由系统初始化程序来触发的,就像汽车打火一样。。。。
天脉男孩 发表于 2010-7-28 14:21:52 | 显示全部楼层
非常感谢!
ssls18years 发表于 2010-7-29 13:35:29 | 显示全部楼层
可恨现在才看到楼主的文章啊,这嘛的生动活泼。

我也是艰苦卓绝的跟踪了2天,基本上搞明白了这个框架,和奥版文章两厢印证,受益匪浅啊。

但是这里有个问题,奥版文章没提到,但确实困扰了我半天,当然现在已经明白了:

Timer4的初始化和轮询都没有问题,但是我从冷启动开始看源代码,一直看到轮询,都没有发现有启动Timer4的语句。请注意我说的是源码。后来经过跟踪T4CTL状态,结果发现从NWK_init()出来就改变了,估计是在初始化网络层中有启动的语句,但是这个函数不是开源的,也无从去验证了。
ssls18years 发表于 2010-7-29 13:41:43 | 显示全部楼层
这篇文章实在好,一个Timer4, 一个Key检测流程其实就是Zstack OS的关键。

关于Key检测的第一次是怎么启动的,奥版说的没错,是系统初始化时启动的。说细致了其实就是在Key的组态函数中有调用osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100), 作用就是吧Key检测这个任务放入轮询数组中,这样当Timer4心跳来临时,就能触发key的检测函数。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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