以下为转载内容,因为学习Zigbee,稍作整理了一下,希望作者不要怪罪。
一、下载ZStack-CC2530.2.5.1a 网址http://download.csdn.net/detail/thanksgining/8328925
下载后:
二、安装ZStack-CC2530.2.5.1a
安装后:
Components:顾名思义这个是库文件,里面放了一些ZDO,driver,hal,zcl等库代码
Documents:这个不用说大家都知道是放TI的开发文档的,你能够把这些文档一个个看懂,你对这个协议栈已经是了如指掌了。里面很多都是讲述协议栈的API的必须读
Projects:这个文件夹放的是TI协议栈的例子程序,一个个例子程序都是以一个个project的形式给我们的,学好这些例子程序的一两个,基本你就能做事情了
Tools:这个文件是放TI的例子程序的一些上位机之类的程序,作为工具使用
Components文件夹
如上所言,全是一些库的东西,hal是硬件层面上的一些driver等等。mac、zmac是mac层的协议接口,mt是我们用到的API几乎都可以在这里找到例子。osal这个就是TI的ZStack协议栈的操作系统,是事件驱动的,stack是一些zdo和zcl等等。
三、打开SamleApp.eww工程,路径:Projects\zstack\Samples\SampleApp\CC2530DB
1、进入main函数,文件路径:ZMain下的ZMain.c
int main( void )
{
/* * Turn off interrupts 关闭所有中断,其实就是关闭总中断 * #define INTS_ALL 0xFF * 最终调用 EA = 0; */
osal_int_disable( INTS_ALL );
/* * Initialization for board related stuff such as LEDs * 初始化系统时钟、LEDs */
HAL_BOARD_INIT();
/* * Make sure supply voltage is high enough to run * 检查芯片电压是否正常 */
zmain_vdd_check(); // Initialize board I/O InitBoard( OB_COLD );
/* * Initialze HAL drivers * 初始化ADC、DMA、AES、LED、LCD、KEY * UART、SPI等有放在此函数初始化,但没有实现 * 硬件相关初始化 */
HalDriverInit();
/* * Initialize NV System * 初始化FLASH、存储器 */
osal_nv_init( NULL );
/* * Initialize the MAC * 初始化MAC层 */
ZMacInit();
/* * Determine the extended address * 确定IEEE 64位地址 */
zmain_ext_addr();
#if defined ZCL_KEY_ESTABLISH //没有定义
// Initialize the Certicom certificate information.
zmain_cert_init();
#endif
/* * Initialize basic NV items * 初始化非易失变量 */
zgInit();
#ifndef NONWK
// Since the AF isn‘t a task, call it‘s initialization routine
afInit();
#endif
/* * Initialize the operating system * 初始化操作系统 */
osal_init_system();
/* * Allow interrupts 允许所有中断,其实就是开总中断 * #define INTS_ALL 0xFF * 最终调用 EA = 1; */
osal_int_enable( INTS_ALL );
/* * Final board initialization * 初始化按键 * #define OB_READY 2 */
InitBoard( OB_READY );
/* * Display information about this device * 在LCD上打印显示此设备的设备信息 */
zmain_dev_info();
/* Display the device info on the LCD */
#ifdef LCD_SUPPORTED //没有定义
zmain_lcd_init();
#endif
#ifdef WDT_IN_PM1 //没有定义
/* If WDT is used, this is a good place to enable it. */
WatchDogEnable( WDTIMX );
#endif
/* * No Return from here * 执行操作系统,进入后不会返回 */
osal_start_system();
return 0; // Shouldn‘t get here.
}//main()
对于一个片上系统而言,必需有电源、晶振/时钟、存储器等部件组成,所有我们的协议栈也必需初始化这些。从main函数也可以看出,它确实也初始化的电压、时钟、存储器,还有网络、IEEE、系统、非易失变量等一些初始化,这些初始化主要根据具体的硬件平台。而ZStack协议栈采用的是多任务机制,并且采用轮询方式来执行这些任务。在调用osal_start_system启动系统之后,系统就开始永无止境地轮询来执行每个任务。在看系统启动后是如何轮询所有的任务之前,我们先来看下系统初始化函数osal_init_system
uint8 osal_init_system( void )
{
/* * Initialize the Memory Allocation System * 初始化内存分配 */
osal_mem_init();
/* * Initialize the message queue * 初始化消息队列 * /
/*typedef void * osal_msg_q_t; * osal_msg_q_t osal_qHead;
/*osal_qHead是一个void的指针,可以指向任何类型 */
osal_qHead = NULL;
/* * Initialize the timers * 函数里只有一条语句:osal_systemClock = 0; * 而static uint32 osal_systemClock; * 初始化定时计时变量为0 */
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 );
}
系统的初始化主要从操作系统层面来做相应的初始化,比如内存管理、电源管理、消息队列等一些初始化。其中的定时器初始化,是因为ZStack-OSAL系统采用了定时捕捉任务事件的发生。这里主要是系统任务初始化函数osalInitTask(),将整个系统的所有任务都初始化了。