CC2530zigbee技术-简介协议栈

前言

说实话,我喜欢自己的原创,虽然我写得可能简单了,但我觉得自己在写博客的路途上,一点一点地积累知识,我也借鉴别人的东西,特别是在写这篇文章时所使用的是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有了一定的了解了吧!

总结

我们可以得出以下的大致流程:

原文地址:https://www.cnblogs.com/samuelwnb/p/4208876.html