前言

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

总结

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

CC2530zigbee技术-简介协议栈的更多相关文章

  1. 常见爬虫/BOT 对抗技术简介(二)

    上一篇文章分别从网络协议,Robots文件,JS渲染,行为分析等多方面讲了些“反爬虫”,“反-反爬虫”技术. 点击查看:<常见爬虫/BOT 对抗技术简介(一)> 本文将主要介绍各种IP地址 ...

  2. Java Servlet 技术简介

    Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...

  3. 【转】Android 防破解技术简介

    http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是 ...

  4. InfiniBand技术简介

    InfiniBand技术简介   转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍         随着CPU和通讯处理速度的 ...

  5. Windows NT 技术简介

    Windows NT 技术简介 NT:New Technoly(新技术,因比DOS.WIN9X采用了很多新技术而得名) Windows NT基本介绍 WindowsNT是Microsoft推出的面向工 ...

  6. CSS border三角、圆角图形生成技术简介

    http://www.zhangxinxu.com/wordpress/?p=794 一.前言 利用CSS的border属性可以生成一些图形,例如三角或是圆角.纯粹的CSS2的内容,没有兼容性的问题, ...

  7. FC总线技术简介

    FC是由美国标准化委员会(ANSI)的X3T11小组于1988年提出的高速串行传输总线,解决了并行总线SCSI遇到的技术瓶颈,并在同一大的协议平台框架下可以映射更多FC-4上层协议.FC具备通道和网络 ...

  8. P2P技术简介

    P2P技术简介 NAT( Network Address Translation)穿越(俗称打洞)技术 前言: p2p已经存在于我们生活的方方面面:我们通过下载在工具(比如迅雷,bitorent,各种 ...

  9. 【CUDA并行程序设计系列(1)】GPU技术简介

    http://www.cnblogs.com/5long/p/cuda-parallel-programming-1.html 本系列目录: [CUDA并行程序设计系列(1)]GPU技术简介 [CUD ...

随机推荐

  1. SSH案例--入门级

    1.项目功能展示 (1)注册 (2)修改地址与级别信息,点击修改   (3)再添加一位成员,进行删除 点击第二行的删除 (4)登录模块测试 输入数据库中没有的信息: 输入数据库中存在的信息: 2. W ...

  2. ASP.NET OAuth 2.0 新手上路

    OAuth2.0资料 初衷:一直想整理授权系列demo,让自己项目高端大尚,列出新手授权系列,帮助小白程序员不用在为授权头疼 OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服 ...

  3. spring boot maven多模块打包部署到tomcat

    @SpringBootApplication(scanBasePackages = {"com.xxx.*"}) public class ApiApplication exten ...

  4. linux学习之用户的切换

    普通用户: 输入su 用户名,点击Enter Root用户: 输入su root,点击Enter 输入登录密码,点击Enter

  5. 关于gcd和exgcd的一点心得,保证看不懂(滑稽)

    网上看了半天……还是没把欧几里得算法和扩展欧几里得算法给弄明白…… 然后想了想自己写一篇文章好了…… 参考文献:https://www.cnblogs.com/hadilo/p/5914302.htm ...

  6. ElasticSearch5.0——IK词库加载

    Dictionary ConfigurationIKAnalyzer.cfg.xml can be located at {conf}/analysis-ik/config/IKAnalyzer.cf ...

  7. JDK下载与安装、 Eclipse下载与使用的总结心得_20173311118_牛明旺

     一.JDK下载与安装心得: ① 从官网http://www.oracl.com/technetwork/java上下载JDK,注意一定要同意该网站上的协议,否则下载不了(即点击“Accept Lic ...

  8. Linux之Ubuntu切换root su -

    当在Ubuntu系统从普通用户切换到root用户时,总是会报错,提示错误信息.这时因为我们还没有给系统中的root用户设置密码,我们给Ubuntu系统中的root用户设置一个密码就可以实现普通用户和管 ...

  9. 酱油 Noip2018颓废记

    也不知道写一些什么了 凑和着写写吧 最近十分的¥#&(^ --#%!*%¥^#$# Day -1 上午考了一场试 就\(TM\)考了60分 好不容易积攒起来的信心啊~~~~~~ 就这么垮了~~ ...

  10. Centos7安装python3.7.1并与python2共存

    转自:http://www.cnblogs.com/JahanGu/p/7452527.html参考:https://www.jb51.net/article/104326.htm 1. 备份原来的p ...