前言

说实话,我喜欢自己的原创,虽然我写得可能简单了,但我觉得自己在写博客的路途上,一点一点地积累知识,我也借鉴别人的东西,特别是在写这篇文章时所使用的是markdownpad2写的,原来我根本就不知道还有这个玩意,所以相信在园里的朋友们都会支持的,如果您知道了,或者懂了,就默默地无视小弟我写的博客,如果没有接触过呢,嘿嘿,我们一起研究进步!

协议栈

TI公司很牛,这是给我的感觉,它能把那些复杂的东西全部写好,就提供一些API来给我们使用,让用户更加方便,这个是我对它崇拜的地方,好了,不说废话了,进入正题。

下面就是协议栈的框图了

那么所谓的协议栈指的就是TI公司的Z-STACK,不得不说人们的智慧是无穷的,这样一个基于8051的芯片在上面写了一个操作系统其名为Z-stack

采用的方法是任务轮回的方法,而且任务ID值越小,优先级越高!

我们使用IAR打开TI公司提供的example 路径如下:

C:\Texas Instruments\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB

可以看到非常清楚的工作目录。

协议栈函数解析

首先我们找到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有了一定的了解了吧!

总结

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

最新文章

  1. 面试&amp;笔试常见题,你了解多少?
  2. Border - SGU 133(排序)
  3. SVN - 详细文档
  4. 转: markdown基本语法
  5. Juniper srx防火墙NAT配置
  6. 41.Linux应用调试-修改内核来打印用户态的oops
  7. 项目Alpha冲刺Day9
  8. spring boot之从零开始开发自己的网站
  9. Nand flash 三种类型SLC,MLC,TLC【转】
  10. 点击倒计时60S获取验证码
  11. 微信小程序之下拉加载和上拉刷新
  12. 视觉中的经典图像特征小结(一): 颜色直方图, HOG, LBP
  13. bzoj3628: [JLOI2014]天天酷跑
  14. Linux安装配置SVN服务器【转】
  15. 多线程操作C++ STL vector出现概率coredump问题及尽量避免锁的双缓冲队列
  16. mysql中字符串类型char(n)和varchar(n)的区别
  17. java基础56 HTML5的标签知识(网页知识)
  18. CentOS怎样安装Python3.6
  19. LG4848 崂山白花蛇草水
  20. 解决The JSP specification requires that an attribute name is preceded by whitespace问题

热门文章

  1. TSQL--如何突破PRINT的8000大限
  2. shell备份文件时加上时间戳
  3. docker容器怎么设置开机启动
  4. .Net Core 2.0 的 ConsoleApp 搭建 Quartz(xml配置)windows服务
  5. 数据库表结构文档查看器 基于netcore
  6. Sql语法高级应用之六:如何在Sql语句中如何使用TRY...CATCH
  7. Gogland配置- 修改Go源代码tab值
  8. CF553C Love Triangles
  9. linux中使用unzip命令中文乱码解决办法
  10. MySQL大数据量的导入