前言
说实话,我喜欢自己的原创,虽然我写得可能简单了,但我觉得自己在写博客的路途上,一点一点地积累知识,我也借鉴别人的东西,特别是在写这篇文章时所使用的是markdownpad2写的,原来我根本就不知道还有这个玩意,所以相信在园里的朋友们都会支持的,如果您知道了,或者懂了,就默默地无视小弟我写的博客,如果没有接触过呢,嘿嘿,我们一起研究进步!
协议栈
TI公司很牛,这是给我的感觉,它能把那些复杂的东西全部写好,就提供一些API来给我们使用,让用户更加方便,这个是我对它崇拜的地方,好了,不说废话了,进入正题。
下面就是协议栈的框图了
那么所谓的协议栈指的就是TI公司的Z-STACK,不得不说人们的智慧是无穷的,这样一个基于8051的芯片在上面写了一个操作系统其名为Z-stack
采用的方法是任务轮回的方法,而且任务ID值越小,优先级越高!
我们使用IAR打开TI公司提供的example 路径如下:
C:Texas InstrumentsStack-CC2530-2.3.0-1.4.0ProjectszstackSamplesSampleAppCC2530DB
可以看到非常清楚的工作目录。
协议栈函数解析
首先我们找到Zmain目录下的zmain.c,找到int main();没错,这就是传说中的主函数
int main( void ){
osal_int_disable( INTS_ALL );//关闭所有的中断
HAL_BOARD_INIT();//初始化时钟信号
zmain_vdd_check();//检查芯片电压
InitBoard( OB_COLD );//初始化IO LED TIMER
HalDriverInit();//初始化芯片各硬件模块
osal_nv_init( NULL );//初始化flash
ZMacInit();//初始化MAC层
zmain_ext_addr();//确定16位地址
zgInit();//初始化非易失变量
#ifndef NONWK
afInit();
#endif
osal_init_system();//初始化操作系统
osal_int_enable( INTS_ALL );//使能全部中断
InitBoard( OB_READY );//初始化按键
zmain_dev_info();//显示设备信息
#ifdef LCD_SUPPORTED
zmain_lcd_init();//在LCD上显示设备信息
#endif
#ifdef WDT_IN_PM1
WatchDogEnable( WDTIMX );
#endif
osal_start_system(); // No Return from here 进入操作系统后不再返回
return 0;
}
main()
哈哈,我已经做了翻译工作,但是不一定是对的,因为毕竟是站在我的理解上写的!
上述的代码基本上都是一些初始化的代码,一个硬件的启动必须要有各种各样的设定才行!
下面分两个来讲,主要是讲两个函数:osal_init_system()和osal_start_system(),因为这两个函数可是重中之中啊!
osal_init_system()函数分析
在IAR中go to defintion就可以了,当然你也可以在OSAL.c这个文件中找到:
uint8 osal_init_system( void )
{
// Initialize the Memory Allocation System
osal_mem_init();//初始化内存分配系统
// Initialize the message queue
osal_qHead = NULL;//初始化消息队列
// Initialize the timers
osalTimerInit();//初始化定时器
// Initialize the Power Management System
osal_pwrmgr_init();//初始化店里管理系统
// Initialize the system tasks.
osalInitTasks();//初始化系统任务
// Setup efficient search for the first free block of heap.
osal_mem_kick();
return ( SUCCESS );
}
osal_start_system()函数分析
同样的道理,你也可以找到这个函数的定义
void osal_start_system( void )
{
#if !defined ( ZBIT ) && !defined ( UBIT )
for(;;) // Forever Loop永远循环
#endif
{
uint8 idx = 0;
osalTimeUpdate();//扫描哪个事件被触发了,然后置相应的标志位
Hal_ProcessPoll(); // This replaces MT_SerialPoll() and osal_check_timer().
do {
if (tasksEvents[idx]) // Task is highest priority that is ready.
{
break; //得到待处理的优先级最高的是任务ID idx
}
} while (++idx < tasksCnt);
if (idx < tasksCnt)
{
uint16 events;
halIntState_t intState;
HAL_ENTER_CRITICAL_SECTION(intState);//进入临界区进行保护
events = tasksEvents[idx];//提取需要处理的事件
tasksEvents[idx] = 0; // Clear the Events for this task.清楚事件
HAL_EXIT_CRITICAL_SECTION(intState);//退出临界区保护
events = (tasksArr[idx])( idx, events );//通过指针调用处理函数
HAL_ENTER_CRITICAL_SECTION(intState);//进入临界区
tasksEvents[idx] |= events; // Add back unprocessed events to the current task.保存未处理的函数
HAL_EXIT_CRITICAL_SECTION(intState);//退出临界区
}
#if defined( POWER_SAVING )
else // Complete pass through all task events with no activity?//所有任务是否全部完成
{
osal_pwrmgr_powerconserve(); // Put the processor/system into sleep//挂起系统使之进入睡眠状态
}
#endif
}
}
相信看了上面的注释,对于zigbee的z-stack有了一定的了解了吧!
总结
我们可以得出以下的大致流程: