-
Z-Stack
操作系统
学习
Zi
gBee
有两个月了,
学习期间也走了不少弯路,
刚开始调试了几个
LED
小灯的实
< br>验,串口通信实验,
点对点通信实验,以为这样基本就差不多可以做定位系统了,
于是直接
跳到定位这一块,
实际上远没
有那么简单。
我想很多初学者都是打开协议栈就被左边那一列
给
镇住了,看到那么多代码都不知道从何入手,下面我重点介绍一下关于
ZigBee
p>
协议栈操
作系统的原理,让更多初学者能看清
Z-Stack
操作系统(其实只是一个简单的小系统,看明
白了觉得也没有多复杂)的工作过程。
下面的图片是我根据书上的资料自己绘制出来的,从这个图中可以看到
Z-Stac
k
的整个
系统的工作流程。
Z-Stack
操作系统
似乎这个对于初学者来说也看不出
什么道道来,
我在看代码的时候完全不知道从哪里看
起。
即使找到了主函数,
找到了
OSAL_sta
rt_system()
也不知道他到底是怎么运行的。
首先我
们先好好看一些这个微操作系统的工作流程:在
ZMain
p>
主函数当中,基本上都是一些初始
化函数,从中断、系统时钟、堆栈
等等到最后按键、液晶显示初始化,这个对于我们来说基
本上不用看,
< br>只需大致了解其功能即可,
就像在电脑上编程只需了解软件和底层硬件的接口
p>
一样。在初始化函数执行完以后便进入了
osal_start_s
ystem()
函数,开始
OSAL
操
作系统。
OSAL
操作系统里面有七个任务,
< br>该循环轮询查询每个任务是否有需要处理的事件,
如果有
则处理,没有则跳到下一个任务,这七个任务有不同的优先级,从图中可以看出
MAC<
/p>
层拥
有最高的优先级,
MAC
层如果有任务,则下面的任务不会被处理。
<
/p>
好了,
基本上对于该操作系统有了一个简单的了解以后,
我们再来结合代码看看代码到
底是怎么运行的。
先大致浏览一下协议栈的目录,可以看到有
< br>ZMain
文件夹(如下乳所示)
,这个应该就
是主函数,看了很多资料确定了确实是从这里开始运行的。
打开
ZM
ain.c
,找到
ZSEG int main( void
)
函数,函数内容如下:
ZSEG
int main( void )
{
// Turn off
interrupts
osal_int_disable(
INTS_ALL );
//
Initialize HAL
HAL_BOARD_INIT();
// Make sure supply voltage
is high enough to run
zmain_vdd_check();
// Initialize stack memory
zmain_ram_init();
// Initialize board I/O
InitBoard(
OB_COLD );
//
Initialze HAL drivers
HalDriverInit();
// Initialize NV System
osal_nv_init(
NULL );
//
Determine the extended address
zmain_ext_addr();
// Initialize
basic NV items
zgInit();
// Initialize the MAC
ZMacInit();
#ifndef NONWK
// Since the AF isn't a task, call it's
initialization routine
afInit();
#endif
#ifdef LCD_SUPPORTED
HalLcdInit();
#endif
// Initialize
the operating system
osal_init_system();
// Allow interrupts
osal_int_enable( INTS_ALL );
// Final board
initialization
InitBoard( OB_READY );
//HalLcdInit();
// Display information
about this device
zmain_dev_info();
/* Display the device info
on the LCD */
#ifdef LCD_SUPPORTED
zmain_lcd_init();
#endif
osal_start_system();
// No
Return from here
}
// main()
————来自百度文库,转载请注明出去
大致看一下,和上述图中的初始化基本上一样。功能描述都换
做了绿色字体以便查看,
这些英文不是很难,
大都可以看懂什么
意思我就不再标注了,
实在不懂可以看上边图片,
有
具体解释。
函数最后是
osal_start_system();
// No
Return from here
开始
OSAL
操作系统,
并且标注
了这里没有返回,也就是说在<
/p>
OSAL
操作系统里面会一直永无止境的执行下去知道系统停
p>
止工作。那么
osal_start_system()
这个函数在哪呢?一般习惯好的话看程序就知道什么意思,
更何况是那么大
的一个公司,
在函数前面有一个
osal
,
我们就顺着
osal
找下去。
p>
查看协议栈
会发现有一个
OSAL
文件夹,那么函数很有可能就在这里面。如下图:
在
OSA
L
里面仔细查找可以找到这个函数,具体如下:
void osal_start_system( void )
{
#if !defined ( ZBIT )
for(;;)
// Forever Loop
#endif
{
uint8 idx = 0;
Hal_ProcessPoll();
// This replaces MT_SerialPoll() and
osal_check_timer().
do {
if
(tasksEvents[idx])
// Task
is highest priority that is ready.
{
break;
}
}
while (++idx < tasksCnt);
//
得到了待处理的具有最高优先级的任务索引号
idx
if
(idx < tasksCnt)
//
确认本次有任务需要处理
{
uint16 events;
halIntState_t intState;
//
p>
进入
/
退出临界区,来提取出需要处理的任
务中的事件
HAL_ENTER_CRITICAL_SECTION(intState);
events =
tasksEvents[idx];
tasksEvents[idx] = 0;
// Clear the Events for this task.
HAL_EXIT_CRITICAL_SECTION(intState);
-
-
-
-
-
-
-
-
-
上一篇:从51到ARM编程快速入门教程精华.
下一篇:51单片机C语言变量定义