Contiki学习笔记(重写版)
Contiki_学习PPT
– Process must NOT block.
• Protothreads provide sequential flow of control in Contiki processes
Event-driven vs MultiThread
• Event-driven requires less memory • Multithreading requires per-thread stacks
Contiki processes are protothreads
Put your logic here
Limitations of the protothread implementation • Automatic variables not stored across a blocking wait
Multithreading
The problem: code flow
Protothreads: A new programming abstraction • A design point between events and threads • Programming primitive: conditional blocking wait
Start user processes
Main scheduler loop
loop until 1 poll_requested==1 or 2 nevents>0
Method: POLL
Method : POST
Timer based programming: etimer
Every tick(125ms), etimer_process is called by a clock interrupt Etimer_process checks if any etimer is expired in the etimer list Etimer_process tells the main scheduler loop to call the process correspond to the expired etimer
Contiki实验2 - 问题timer
1.etimer结构(代码在附录中-文档末尾)选中etimer后按F12转到etimer结构体的定义中其中struct timer timer;是一个定时器,按F12转定义后可以看到timer仅包含起始时刻clock_time_t start;和间隔时间clock_time_t interval;,通过比较到到期时间和新的当前时间,从而判断该定时器是不是到期。
struct etimer *next;用于指向下一个etimer。
struct process *p;指向一个进程,当etimer到期时,会给相应的进程传递事件PROCESS_EVENT_TIMER,从而使该进程启动。
2.etimer相关的部分函数(位于core->sys->etimer.c文件中)2.1 void etimer_set(struct etimer *et,clock_time_t interval)(位于第180行)参数1 struct etimer *:需要设置的etimer指针参数2 clock_time_t interval: etimer的时间间隔主要功能:设置etimer中的timer,然后将etimer添加到timerlist链表中。
选中timer_set函数,按F12跳转到timer_set函数中主要功能:设置timer的时间间隔interval和开始时间start。
时间间隔为传入的参数,开始时间为当前时间。
2.2 static void add_timer(struct etimer *timer)(位于第155行)选中add_timer函数,按F12跳转到add_timer函数中首先etimer_request_poll用于提升etimer_process进程的优先级,以便于etimer 能尽快的得到响应。
然后判断etimer所绑定的进程是否被执行过(被执行过之后,etimer绑定的进程会置为PROCESS_NONE),如果没执行过,则遍历timerlist链表,如果需要设置的etimer在timerlist链表中,则直接修改etimer绑定的进程为正在执行的进程(PROCESS_CURRENT 宏返回系统当前正在执行的进程),然后调用update_time函数更新时间,如果etimer不在timerlist链表中,绑定正在执行的进程,将etimer插入在timerlist链表的头部,然后,调用update_time函数更新时间。
ArcCatalog读书笔记
第一章ArcCatalog简介欢迎使用ESRI ArcCatalog 软件,它将使地理数据访问和管理更为容易。
首先,将所操作的地理数据连接添加到Catalog中,可以连接本地磁盘上的文件夹、网上的共享文件夹和数据库,或地理信息系统(GIS)服务器。
建好Catalog后,就可以用不同视图查找所需要的数据和浏览查找的结果。
ArcCatalog对不同格式数据的处理方法是一样的。
它提供的一些工具可以帮助用户组织和维护数据。
对于一个制图者来讲,确保将正确的数据加入地图中一直都不容易。
但是,无论是分析管理个人数据,还是管理大型机构的数据,ArcCatalog 都可以使工作简化。
第二章快速入门教程ArcCatalog可用于浏览和管理数据。
连接数据后,即可使用Catalog浏览其内容。
当找到想要使用的数据后,可以将其添加到地图中。
通常获取到项目所需数据后,不能立即使用它,可能需要改变它的投影或格式,修改属性,或者将其他表中存储的属性与地理要素进行链接。
数据最终准备完毕后,需要把数据内容和所作修改存档。
这些数据管理的工作可以采用Catalog中提供的工具来完成。
第三章Catalog基础无论是查找指定地图,归档其内容,还是修改一个coverage,都可以在ArcCatalog 中完成。
在开始工作前,请阅读本章内容。
主要包括:ArcCatalog启动后可以看到什么,如何使用它浏览手头现有数据,解释如何使用在线帮助(提供了解ArcCatalog窗口中每个元素的信息)。
此外,帮助主题还提供逐步指导功能,为用户演示怎样完成任务。
第四章Catalog内容ArcCatalog集中了所有要用到数据的连接。
选中一个连接后,可以访问它链接的数据。
连接可以访问本地磁盘上的文件,网络上的数据库或一个ArcGIS服务器。
总的来说,这些连接创建了地理数据源的目录。
在目录中,单个的文件夹和Coverages都是数据项。
如果使用过ArcInfo Workstation,当提到一个coverage属性时,习惯使用术语item(数据项)。
ContikiMAC翻译
ContikiMAC周期性休眠RDC协议Adam Dunkels(瑞典)2011.12摘要低功耗设备必须尽可能的保持射频的关闭,以达到尽量的能耗,但也需经常的醒来以接收周围节点的通信数据。
这份报告描述了ContikiMAC周期性休眠机制,在Contiki2.5中的默认机制中使用了一个高效的唤醒机制,并使用一系列的时序管理尽可能使射频处于关闭状态。
使用ContikiMAC,节点可以在网络中通信时,保持基本上99%的时间中射频都处于关闭状态。
这份报告描述了ContikiMAC机制,测量单个ContikiMAC操作的能量消耗,以及评估快速休眠和时序锁定的优化效果。
1. 前沿低功耗无线设备必须维持严格的能耗以获得数年的生存时间。
在低功耗无线设备的所有部件中,无线收发器通常能耗消耗更高。
无线收发器在被动监听其他设备的信号中的功率与主动传输的功率一致,因而收发机必须完全的关闭以节省能量。
因为节点在收发机关闭状态不能接受任何数据,周期性的休眠管理机制必须被用于不时地打开收发机。
在多年发展中,提出了许多的周期休眠机制(例如,Dutta和Dunkels的更加彻底的周期休眠机制的审视);这篇文档描述了ContikiMAC的周期休眠机制,使用的是Contiki 2.5 中的默认机制。
ContikiMAC被设计来易于理解和实现。
ContikiMAC仅使用异步机制,没有同步信息,也没有额外的包头数据。
ContikiMAC数据包是普通的链路层信息。
ContikiMAC具有更为高效节能的唤醒机制。
通过一系列的精准的时间约束来实现。
另外,ContikiMAC使用了快速休眠的优化方法,以允许快速的检测到失败的唤醒,并且采用传输时序锁优化方法,允许传输数据时能耗的实时优化。
ContikiMAC中的机制是由现有的周期循环机制中启发而来的。
周期唤醒的想法在许多的协议中都使用过,如B-MAC,X-MAC和BoX-MAC。
时序锁优化已经先前由WiseMAC中所推荐使用,也已经被用于其他的一些协议。
(完整word版)传智播客C经典入门课堂笔记-苏坤
今天学习的第一句话:Console.WriteLine(“你想显示的内容。
”);第二句话:Console.ReadKey();当程序执行到Console.ReadKey();时,程序会停到这里,等待用户从键盘上键入一个键,用户键入这个键之后,程序才会继续执行。
在C#中,每一句话都必须以“分号”结束C#中的注释,什么是注释呢?对我程序进行的解释,注释是给人看的。
下面的一对指示可以折叠代码。
#region内容#endregionMSIL:微软中间语言Microsoft Inter mediate LanguageCLR:公共语言运行时Common Language RuntimeCLS公共语言规范Common Language SpecificationCTS:通用类型系统Common Type SystemJIT:即时编译器Just In Time第二天课程:复习--Console.WriteLine()可以用CW加Tab键。
这样就能直接打出Console.WriteLine();变量1:变量:变量代表着一块内存空间,我们可以通过变量名称向内存存\取数据。
有变量就不需要我们记忆复杂的内存地址。
向内存申请一块内存空间的语法:数据类型变量名;整数在我们C#中的数据类型叫intInt nuber;Double:小数Char:字符型只能存储一个字符,并且存储的这个字符要求用单引号引起来String 类型:字符串,就是把0个或1个或多个字符连接起来。
字符串要求用双引号引起来。
Decimal 类型:用来表示钱和货币,失精度不至于丢失。
注意:在C#开发环境中,直接写一个有小数点的数字,这个数字是double类型。
在一个小孩苏idan后面加个m\M,就告诉编译器这是个decimal类型应该写成:money = 100.34m;变量的命名规则:1.必须以“字母”_或@符号开头、2.后面可以跟任意“字母”,数字,下划线。
contiki_protothread
AUTOSTART_PROCESSES 宏实际上是定义一个指针数组,存放 Contiki 系统运行时需自动启动的进程。AUTOSTART_PROCESSES 在 contiki 中 的第一如程序九。
程序四中 PROCESS_THREAD(hello_world_process, ev, data); 是紧跟分号的,在 c 语言中这说明这程序五中这是对函数的声明,而 程序三中 PROCESS_THREAD(hello_world_process, ev, data)后面没 有分号,紧接的是 "{}" 这说明这个函数是执行体。
(3)PROCESS_BEGIN 宏和 PROCESS_END 宏 程序十二:
1 #define PROCESS_BEGIN() PT_BEGIN(process_pt))/*protothread 开始*/
2 #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
7 Return i;/* 退出函数 */
8 case__LINE__:;/* 在退出之后的下次调用将直接从此出运行 */
9 /* 在此处继续执行你的代码。。。 */
10 }
11 }
12 }
还原后的这段代码充分利用 c 语言的特性用 switch 分支结构穿插 在循环体结构中,用 state 来保存程序退出点,使得程序可以在上次 断点出得以继续执行。
先介绍两个宏‘…’、‘__VA_ARGS__ ’。‘…’指可变参数,可 以是任意个数任意形式的参数;‘__VA_ARGS__ ’是一个可变参数的
contiki3.0之button_sensor全面解析,已经测试成功
contiki3.0之button_sensor全⾯解析,已经测试成功以InstantContiki3.0环境的cc2538dk为例进⾏解剥原理》》》》⾸先找到3.0\platform\cc2538dk⾥⾯有⼀个contiki-main.c⼀般不⽤更改,就是我们通常的main.c主函数,⼀切将从这⾥开始。
特别注意的是,3.0\cpu\cc2538这⾥⾯所有⽂件不⽤更改,因为都是作者按照芯⽚⼿册和OS制定好的。
在3.0\core\lib的sensors.c, 在3.0\core\dev的button-sensor.c不⽤更改, 是系统的⽂件改什么改。
哈哈,要更改的内容是,3.0\platform\cc2538dk⾥⾯的contiki-main.c必要时更改,我们重点看⼀下这些内容1/*---------------------------------------------------------------------------*/2/**3 * \brief Main routine for the cc2538dk platform4*/5int6 main(void)7 {8 nvic_init();9 ioc_init();10 sys_ctrl_init();11 clock_init();12 lpm_init();13 rtimer_init();14 gpio_init();1516 leds_init();17 fade(LEDS_YELLOW);1819 process_init();2021 watchdog_init();22 button_sensor_init();这个是平台的初始化部份,很重要!你看button_sensor_init()出现了。
在\3.0\platform\cc2538dk\dev⾥⾯有button-sensor.c,这是我们要更改的,和3.0\core\dev的button-sensor.c名字⼀样,这种搞法在IAR⾥⾯,肯定会报⽂件重名错误,看来linux很⾃由也很不严瑾。
Contiki入门手册
Contiki OS入门手册
第 1 页, 共 28 页
Contiki OS 入门手册
目录
1 源代码目录结构说明...............................................................................................................3 2 Hello-world实验教程 ..............................................................................................................7 3 Blink-hello实验教程..............................................................................................................11 4 Event-post实验教程 ..............................................................................................................16 5 Timers实验教程.....................................................................................................................21
Contiki操作系统是基于事件驱动(Event-driven)内核的操作系统,在此内核上,应用 程序可以在运行时动态加载,非常灵活。在事件驱动内核基础上,Contiki实现了一种轻量级 的名为protothread的线程模型,来实现线性的、类似于线程的编程风格。该模型类似于Linux 和windows中线程的概念,多个线程共享同一个任务栈,从而减少RAM占用。Contiki还提供 一种可选的任务抢占机制、基于事件和消息传递的进程间通信机制。Contiki中还包括一个可 选的GUI子系统,可以提供对本地串口终端、基于VNC的网络化虚拟显示或者Telnet的图形 化支持。
狂神课堂笔记
狂神课堂笔记⽬录打开CMD的⽅式1. 开始+系统+命令提⽰符2. Win键+R 输⼊cmd 打开控制台(推荐使⽤)3. 在任意⽂件夹下⾯,按住shift键+⿏标右键,选择在此处打开命令⾏窗⼝4. 资源管理器的地址栏前⾯加上cmd(空格)路径管理员⽅式运⾏:选择以管理员⽅式运⾏常⽤的Dos命令1 #盘符切换输⼊D:2 #查看当前⽬录下得所有⽂件输⼊dir3 #切换⽬录 cd changge directory4 #返回上⼀级 cd ..5 #清屏 cls (clear screen 英⽂清理屏幕)6 #退出终端 exit7 #查看电脑ip ipconfig8 #打开应⽤计算机 calc画图⼯具 mspaint记事本 notepad9 #ping命令ping 10#创建⽂件夹 md打开⽂件 cd创建⽂件 cd>a.txt删除⽂件 del a.txt移除⽬录 rdJAVA特性和优势简单性⾯向对象可移植性⾼性能分布式动态性多线程安全性健壮性JDK卸载1. 删除java的安装⽬录2. 删除环境变量⾥⾯的JAVA_HEOM3. 删除环境变量⾥⾯的path下关于java的⽬录4. 最后查看java_version安装JDK1. 百度搜索JDK8,找到下载地址2. 同意协议3. 下载电脑对应的版本4. 双击安装JDK5. 记住安装的路径6. 配置环境变量我的电脑---右键---属性环境变量---JAVA_HOME配置path变量7. 测试JDK是否安装成功打开cmdJAVA -versionNotepad++HelloWord1. 随便新建⼀个⽂件夹2. 新建⼀个java⽂件 - ⽂件后缀名为.java - 如helloword.java - 系统可能没有显⽰⽂件后缀,我们需要⼿动打开3. 编写代码public class Hello{public static void main(String[] rags){System.out.print("Hello,World");}}3. 编译javac java⽂件,会⽣成⼀个class⽂件4. 运⾏class⽂件,java class⽂件可能会遇到的情况1. 每个单词的⼤⼩不能出现问题,java是⼤⼩写敏感词2. 尽量使⽤英⽂3. ⽂件名和类名必须保持⼀致4. 符号使⽤了中⽂JAVA程序运⾏机制编译型解释型直接⽣成开头1. psvm2. sout注释单⾏注释://多⾏注释:/**/⽂档注释:/***内容*/标识符abstract assert boolean break bytecase catch char class constcontinue default do double elseenum extends final finally floatfor goto if implements importinstanceof int interface long nativenew package private protected publicreture strictfp short static superswitch synchronized this throw throwstransient try void volatile while标识符注意点1. 标识符⼤⼩写⼗分敏感2. 可以⽤中⽂,不建议使⽤数据类型强类型语⾔要求变量的使⽤要严格符合规定,所有变量都必须先定义后才能使⽤//⼋⼤基本数据类型//整数int num1=10; //最常⽤byte num2=20;short num3=30;long num4=30L; //long类型要在数字后⾯加个L,⽤于区分//⼩数:浮点数float num5=50.1F;//float类型要在数字后⾯加个F,⽤于区分double num6=3.1415926;//字符char name ='A';//字符串,String不是关键字,是类String namea ="秦疆";//布尔值:是⾮boolean flag = true;//boolean flag = false;数据扩展整数扩展public class Demo4 {public static void main(String[] args) {//整数扩展:进制⼆进制0b ⼋进制⼗进制0 ⼗六进制0xint i =10;int i2 =010;//⼗进制0int i3 =0x10;//⼗六进制0xSystem.out.println(i);System.out.println(i2);System.out.println(i3);}}浮点数扩展public class Demo05 {public static void main(String[] args) {//浮点数扩展银⾏业务怎么表⽰?钱//BigDicimal 数学⼯具类//float 特点:有限离散舍⼊误差⼤约接近但不等于//double//最好完全避免使⽤浮点数进⾏⽐较//最好完全避免使⽤浮点数进⾏⽐较//最好完全避免使⽤浮点数进⾏⽐较float f =0.1f;//0.1double d =1.0/10;//0.1System.out.println(f==d);System.out.println(f);System.out.println(d);float d1 =010*******f;float d2 =d1+1;System.out.println(d1==d2);//ture}}字符扩展public class Demo05 {public static void main(String[] args) {//字符扩展char c1='秦';char c2='疆';System.out.println(c1);System.out.println((int)c1);//强制转换System.out.println(c2);System.out.println((int)c2);//强制转换//所有的字符本质还是数字//编码 Unicode 表:A=65 a=97 2个字节 65536 Excel 2 16=65536 // U0000 UFFFFchar c3 ='\u0061';System.out.println(c3);}}转义字符public class Demo05 {public static void main(String[] args) {//转义字符// \t 制表符// \n 换⾏System.out.println("Hello\tWorld");//空格System.out.println("Hello\nWorld");//换⾏String sa = new String( "hello world");String sb = new String( "hello world");System.out.println(sa==sb);String sc = "hello world";String sd = "hello world";System.out.println(sc==sd);//对象从内存分析}}布尔值扩展public class Demo05 {public static void main(String[] args) {//布尔值扩展/* boolean flag=ture;if (flag=ture){}//新⼿程序员//相等if (flag){}//⽼⼿程序员*/}}类型转换由于java是强类型语⾔,所以要进⾏有些运算的时候,与要⽤到类型转换低---------------------------------------------------------------------------------------------⾼byte,short,char-------->int------->long-------->float-------->doublepublic class Demo05 {public static void main(String[] args) {int i =128;byte j =(byte)i;//=-128,内存溢出,⾼----低(强制转换)double x =i;//低----⾼(⾃动转换)//强制转换(类型)变量名⾼----低//⾃动转换低----⾼System.out.println(i);System.out.println(j);System.out.println(x);/** 1.不能对布尔值进⾏转换* 2.不能把对象类型转化为不相⼲的类型* 3.把⾼容量转化为低容量时⼀定要“强制转换”* 4.转换时可能出现内存溢出,或者精度问题!** */System.out.println("======================================================================="); System.out.println((int)24.5); //=24System.out.println((int)-45.95f); //=45System.out.println("======================================================================="); char c = 'a';int d = c+1;System.out.println(d);System.out.println((char)d);}}注意问题public class Demo05 {public static void main(String[] args) {System.out.println("======================================================================="); //操作⽐较⼤的数的时候,注意溢出问题//JDK的新特性,数字之间可以⽤下划线分割int money =10_0000_0000;int year = 20;int total = money*year;//-1474836480,计算的时候溢出了long tota2 = money*year;//默认是int,转换之前已经出现问题long tota3 = money*((long)year);//20000000000System.out.println(tota3);变量变量是什么:就是可以变化的量!java是⼀种强类型语⾔,每个变量都必须声明其类型java变量是程序中最基本的存储单位,其要素包括变量名,变量类型和作⽤域例: type varName [=value] [{,varName[=value]}] ;//数据类型变量名 =值,可以⽤逗号隔开来声明多个同类型变量。
JNDI学习笔记
JNDI学习笔记由于工作需要学习了一天的JNDI有一些收获,写下来与大家分享.高手可以帮忙纠正和指点,在此谢过!一:几个概念,Context,entry/object,filter.AttributeContext:上下文,我的理解是相当与文件系统的中的目录(JNDI的Naming Service是可以用操作系统的文件系统的,哈哈).entry/object:一个节点,相当与文件系统中的目录或文件.filter:查询/过滤条件是一个字符串表达式如:(&(objectClass=top)(cn=*))查询出objectClass属性为top,cn属性为所有情况的entry.Attribute:entry/object的属性可以理解成JAVA对象的属性,不同的是这个属性可以多次赋值.镖师甲回复于:2004-09-30 19:15:59(怕发丢了分着发)二:Naming Service的简单例子,JNDI的全称是名字与目录服务,LDAP服务器都可以做Naming Service和Directory Service.JNDI Toturial上为了方面用File System做为naming service.以下的一个例子是演示一个从File System Lookup.package study.jndi;import java.util.Hashtable;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;public class Lookup{public static void main(String[] args){Hashtable env = new Hashtable();String name = "C:/aaa.txt";try{env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSC ontextFactory"); //use the file system as service providerContext ctx = new InitialContext(env);Object obj = ctx.lookup(name);System.out.println("the name " + name + " is bound to object:" + obj);}catch(Exception ex){ex.printStackTrace();}}}为了运行的程序你要到/products/jndi/downloads/index.html下载JNDI的相关包,然后把两个jar:fscontext.jar和providerutil.jar加入到你的CLASSPATH 中.这样就可以运行了.你可以做进一步的操纵如bind,unbind等等.Context ctx = new InitialContext();是以文件系统为初始上下文,这样一来你可以把String name = "C:/aaa.txt";换成你系统中的任意目录和文件的路径名.env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFac tory");是指明Service provider是文件系统.镖师甲回复于:2004-09-30 19:51:18由于我的工作主要是对Directory Service进行操作,所以重点学习了,javax.naming.directory包中的类.以下的几个例子演示从LDAP上查询ENTRY并得到属性和属性值.假设我的LDAP是这样存放的: 根节点c=com 二级节点 ou=t 以及其它三级节点 ou = xc 以及其它四级节点 cn=bsj. LDAP服务器安装在我自己的机器上。
c学习笔记c重点审批稿
c学习笔记c重点TPMK standardization office【 TPMK5AB- TPMK08- TPMK2C- TPMK18】C#学习笔记1.C#具有所有面向对象的语言的所有特性:封装,继承,多态。
在C#系统中,所有的类型都可以看作一个对象。
C#只允许单继承,即一个类不会有多个基类,C#不会有全局函数,不会有全局变量,不会有全局常数,所有的一切只能封装在一个类中。
包括四个部分:vos类型系统;元数据;公用语言规范;虚拟执行系统。
ing system表示导入名称空间。
4.让我们从第一个程序开始就记得:每个东西都必须属于一个类,类里面的方法总是为我们完成某件工作的。
在C#中,程序的执行总是从main()方法开始的,一个程序中不允许出现两个或两个以上的main()方法。
对于习惯学C控制台程序的读者,必须要牢记:main()方法必须包含在一个类中。
5.利用string可以方便地对字符串进行连接或剪切。
例:strings=”good”+”morning”;char x=s[3]字符串可以通过下标进行索引,得到一个字符。
6.我们可以用//进行单行标注,/* */进行多行标注。
7.在C和C++中,任何非0值都表示真,在C#中,任何非0值都不能代替true.在其它类型的整型值和布尔值之间不存在任何的转换,将整型转换成布尔型是不合法的。
8.把一系列相关的变量组织成单一实体的过程称为生成结构的过程。
这个单一实体的类型叫结构类型,每一个变量就是结构的成员。
9.结构类型包含的成员类型可以相同,也可以不同。
我们甚至可以把一个结构类型当作另一个结构成员的类型。
10.枚举实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。
结构类型变量的值由各个成员的值组合而成。
而枚举则不同,枚举类型的变量在某一时刻只能取枚举中某个元素的值。
按照系统的设定,每个元素的类型都为整型。
且第一个元素的值为0,后面的每个元素梯加1,也可以直接赋值。
Contiki 系统移植
上一页
返回
11.2 搭建 Contiki 开发环境
• 11.2.2 Contiki 系统移植过程
• 嵌入式的操作系统在硬件平台上的移植,一直以来让很多新手望而却 步,因为移植一个操作系统比写一个 C 语言程序复杂多了。那么究 竟怎样移植 Contiki 系统到 STM32 上呢?移植过程中需要修改源码 的哪个部分呢?通过下面的分析,读者就知道了。
• 2. core • core 目录下是 Contiki 的核心源代码,包括网络(net)、文件系统
(cfs)、外部设备(dev)、链接库(lib)等,并且包含了时钟、 I/O、ELF 装载器、网络驱动等的抽象。 • 3. cpu • cpu 目录下是 Contiki 目前支持的微处理器,例如 arm、avr、 msp430 等。如果需要支持新的微处理器,可以在这里添加相应的源 代码。 • 4. doc • doc 目录是 Contiki 帮助文档目录,对 Contiki 应用程序开发很有参 考价值。使用前需要先用 Doxygen 进行编译。
• 7. tools
• tools 目录下是开发过程中常用的一些工具,例如 CFS 相关的 makefsdata、网络相关的tunslip、模拟器 Cooja 和 Mspsim 等。
• 为了获得良好的可移植性,除了 CPU 和 platform 中的源代码与硬 件平台相关以外,其他目录中的源代码都尽可能与硬件无关。编译时, 根据指定的平台来链接对应的代i 开发环境
• 5. examples
• examples 目录下是针对不同平台的示例程序。
• 6. platform
• platform 目录下是 Contiki 支持的硬件平台,例如 mx231cc、 micaz、sky、win32 等。Contiki的平台移植主要在这个目录下完成。 这一部分的代码与相应的硬件平台相关。
WSN 操作系统-contiki
• 测试contiki cd contiki/examples/hello-world make TARGET=native hello-world ./hello-world.native
Small devices c compiler:SDCC
(1)下载SDCC cd /opt sudo svn co -r 7100 https:///svnroot/sdcc/tr unk/sdcc/
• System is programmed by uploading the binary – In-system programming tools or external flashers
Cross-compiler Environments
• Integrated development environments (IDEs) – Commercial compilers are usually of this type – Usually dependent on a specific OS (Windows) – Integrate a text editor, compiler tools and project management along with C library – System programmer tool usually tightly integrated
Contiki学习笔记(重写版)
II
Contiki 学习笔记(重写版)①
Contiki 是由瑞典计算机科学研究所开发专用的网络节点操作系统,自 2003 年 发布 1.0 版本以来,得到飞速发展,成为一个完整的操作系统,包括文件系统 Coffee、 网络协议栈 uIP 和 Rime、网络仿真器 COOJA,并于 2012 年发布全新版本 2.6。 Contiki 由标准 C 语言开发,具有很强的移植性,已被移植到多种平台,包括 8051、 MSP430、AVR、ARM,并得到广泛应用。除此之外,Contiki 将 Protothreads 轻量 级线程模型和事件机制完美整合到一起,Proththreads 机制使得系统占用内存极小, 事件机制保证了系统低功耗,非常适合资源受限、功耗敏感的传感器网络。
① 分析 Contiki 操作系统源码时,已将分析笔记分享在个人博客 (),本章大部分 是对这些内容的重新整理。
3
开始
时钟初始化 进程初始化
有高优先
级进程 是
否
启动系统进动进程
结束
图 2- 1 Contiki 运行原理示意图
框框所示,实际上是 process_run 函数的功能)。通过遍历执行完所有高优先级的进
Cisco IOS 软件结构读书笔记
IOS 软件结构读书笔记ios的结构主要聚焦在怎样快速和有效地转发包。
现代操作系统的两大功能:硬件控制和资源管理。
同时运行多个程序就是多任务。
支持这种的就是多任务操作系统。
多个程序中的一个子程序叫做一个线程。
每一个线程都有一个cpu注册值,这个值叫做context=上下文。
但是可以共与其他线程享内存地址空间,占有相同地址空间的一组线程叫做进程。
一个进程控制一个子集的操作系统资源。
操作系统和cpu都支持虚拟内存,每个进程都可能运行在分离的地址空间,用来保护其他进程。
决定运行哪个进程,这叫做预留。
预留经常是由一个操作系统的核心来做的,这个叫做内核。
一个操作系统会使用多个手段来预留线程。
这也取决于操作系统的可选支持情况。
先进、先出是一个最简单的方式。
它所占负载很小。
是公平的:即所有的线程都均等,先来,就先服务。
FIFO.FIFO不适合实时的交互处理应用,实时处理需要快速、低cpuzu占用率一种可能的解决方法是给每个进程机遇应用地绑定优先级,保证实时应用先占用cpu.预约方式利用争抢来取代运行完整的,这个叫做争适者生存。
这种操作系统叫做适者生存的多任务操作系统。
注意:上下文交换发生生在操作系统内核从cpu删除一个线程,且把其他线程填进来的时候。
换言之,上下文交换发生在电脑在当前工作下改变任务的时候上下文交换可以使安静的执行在cpu时间的术语中,因为所有的处理器注册器必须保存给开始拿掉cpu和还原给一开始放入cpu的线程。
上下文本质是让争抢线程知道谁离开了,并让正要运行的线程知道上一个进程持续的时间多任务争抢的好处是:他是周期性的。
他是难以打破的,没有谁可以垄断资源。
缺点是:他不如全运行完的方式有效利用。
他加大了软件应用的复杂性。
show process Command 详细解释:CPU utilization for five seconds: 98%/65%; one minute: 87%; five minutes:49%PID QTy PC Runtime (ms) Invoked uSecs Stacks TTY Process1 Csp 602F5488 4 472 8 2624/3000 0 Load Meter2 ME 60542634 3192 4261 749 7756/9000 0 OSPF Hello3 Lst 602E0E00 1408 278 5064 5632/6000 0 Check heaps4 Cwe 602D85E0 0 1 0 5572/6000 0 Chunk Manager5 Cwe 602E6AA8 4 11 363 5620/6000 0 Pool Manager6 Mst 6025F148 0 2 0 5588/6000 0 Timers7 Mwe 6001D610 0 3 0 5476/6000 0 Serial Backgroun8 Mwe 60326EE0 0 1 011608/12000 0 OIR Handler9 Msi 6033B2D0 0 80 0 5612/6000 0 Environmental mo10 Lwe 6033D0A8 2272 298 7624 4916/6000 0 ARP Input11 Mwe 604D0180 0 4 0 5544/6000 0 DDR Timers12 Mwe 604E67A8 0 2 011596/12000 0 Dialer event13 Lwe 60638AE8 12 2 6000 5592/6000 0 Entity MIB API14 Mwe 600218D8 0 1 0 5632/6000 0 SERIAL A'detect15 Cwe 602EBBB0 0 1 0 5636/6000 0 Critical Bkgnd16 Mwe 602B0370 172 1599 10710720/12000 0 Net Background17 Lwe 602544C8 4 27 14811404/12000 0 Logger18 Msp 602722D8 124 2348 52 5424/6000 0 TTY Background19 Msp 602AF8F0 24 2358 10 5756/6000 0 Per-Second Jobs20 Msi 60333560 68 2352 28 5616/6000 0 Partition Check21 Hwe 602AFB64 10792 15682 688 5608/6000 0 Net Input——More—— _? PID—进程描述号。
alias学习笔记整理
第一章基本工具的认识及使用1.ctrl+shift+鼠标左键ctrl+shift+鼠标中键ctrl+shift+鼠标右键2.alt+A 删除鼠标左键---在选择与非选择间转换中---只选择点击的物体右----取消选择物体3.shift+alt+zuo=旋转shift+alt+中=移动shift+alt+you=缩放5.鼠标中——拖动6.ctrl捕捉点alt捕捉网格ctrl+alt捕捉线7.货架的保存:在工具架标签行空白处单击拖动---save8.第三个按住shift键单击skin画曲面9.revole话旋转体local按照几何中心旋缩捕捉绿点,改变旋转轴10.planar让一个封闭的在一个平面上的线变成一个平面crv phr将不再一个平面内的不封闭的曲线平面化捕捉+鼠标中建-----沿水平移动不改变远造型(对于封闭的不在同一平面的曲线手动移动cv点)捕捉+鼠标右键--------沿竖直移动11.1个跨度比较好两个Cv点之间叫一个跨度12.控制面板或control on 打开CV点ctrl +鼠标移动选取CV点上下移动改变曲度曲面确认无误删除历史13.旋缩时第二个CV点与第一个水平对齐(鼠标中键),保证上表面是一个平整的面14.pick ----hull----center pivot-----move缩放15.extrud 放样:先单击截面,再单击路径16. contrl panel-----transparecy-----canvases调整画面透明度17.draft拔模18.(surface fillet )倒角半径值增大可以导出不相邻的两个面的倒角调节倒角flow control------start……19.剪切需要有COS线surface edit-----Intersect找出交线------trim(剪切)Knot spacing节间距;空间步长•Chord n. 弦;和弦•Perference:首选项•Component:组件•Tutorial :个别指导的,辅导的•Toggle :切换•Planar:平面的,二维的•Revolve:旋转•20、改变图标尺寸:preferences----general preference21.自定义快捷菜单:perferences----interface---marking menus22.ctrl+双击=改名23.、热键:perferences----interface---hotkeys/menus----layouts24.view---look at将被观察物体移至中央25.改变视图旋转基点:perference--generalperference----input----use point of interest26.指示器中心的黄色或蓝色箭头表示曲面在这一点的法线方向,当物体从反面观察时,箭头有黄色变成蓝色单击黄、红、蓝色的箭头,就会从相应的角度来观察物体27.在透视图中,shift+alt=观察面板Point of interest-----visible:显示旋转指示器的可见性Locked:锁定旋转基点观察面板上有look at观察面板上可以设置书签New bookmark 在当前视角增加新书签Prev bookmark 改变不同书签的显示顺序Cycle bookmark 在所有书签中逐个转换,每个视角默认停留2s Publish bookmark 把当前书签的视角导出为图片28.Pick-----component :(确认第四个即surface 是按下去的)可以选择物体的某一部分29.Use tutorial window names 使用教程窗口canvas planes 画布层第二章建模1、非比例变形中:鼠标左键自由变形鼠标中建水平方向变形鼠标右键竖直方向变形2、利用右键可以保证中心点是在竖直方向移动3、rotate旋转-----鼠标左键------沿X轴鼠标中键---------Y---鼠标右键---------Z---4、当不再需要编辑CV点时,最好将其关闭,有利于观察模型,早控制面板上,display====单击CV/HULL edit points可关闭CV点5.Thansform---modify---proportional modification 工具直接通过对曲面一系列的CV按照一定规律的改动修改曲面的目的,falloff值表示前面CV点的改动对后一个cv影响的衰减幅度,值越大,影响越小,值为0时,所有被影响到的CV都会跟着初始CV做相同的改动Proceeding和succeeding的值(都输入2)表示所选择的CV 影响到在UV两个方向的前边和后边CV的个数,可以看到现在曲面的UV方向上各个额外的两排CV被选中,他们将跟随着左下角的CV按照衰减幅度一起移动。
digsilent七个案例学习总结(1)教程文件
C 章练习1:创建项目的教程设计一个新的电力系统(包括本教程)的第一步是创建一个项目project。
一个项目提供了基本结构中定义和存储电力系统,连同他们的设计阶段和单线图、类型库、计算阶段、计算命令,等等。
这一章描述了如何创建一个新的项目,并解释了它的大部分功能。
对于新用户开始教程前,推荐阅读PowerFactory介绍(章节B:程序概述)。
它将使用户比较容易理解文档其余部分的PowerFactory术语和概念。
教程管理器Tutorial Manager是Power Factory一个特殊的功能设计,通过本教程指导用户。
它将为每一个练习安装一个所需的项目。
对于第一个练习,您不能使用Tutorial Manager,因为第一个项目应该由你自己创建。
C.1 PowerFactory的登录在开始PowerFactory前,你必须输入一个用户名和密码进入“登录”Log on 对话框。
为执行本教程,您可以登录为“Demo”用户,它是一个预定义的用户帐户没有密码。
或者你可以用一个特定的用户登录名。
你可以输入特定的用户名进入PowerFactory的演示文本,即如果你使用的PowerFactory演示版,并不局限于使用“Demo”用户。
如果你有对于多用户数据库的许可,这是推荐的,每一个用户登录他/她自己的用户名,通常这种情况下他/她是管理员。
您可以在PowerFactory的登录对话框中简单的通过输入一个新用户名创建一个新的用户帐户,例如“Tutorial User”或“My User”。
如果你有一个演示版本,或者如果你有一个单一用户的许可,推荐你这样。
虽然用户名是必需的,使用密码是可选的(一旦你设置了密码,每次登录时就必须输入)。
Tutorial Manager存储教程项目的地方被称为User文件夹(User文件夹含有输入到登录对话框的用户名)。
User文件夹将为您创建文件夹,通过管理员administrator或自己编写。
康奈尔大学做笔记的方法及多种笔记方法中文简体
右栏:课堂的笔记(标出重点;轮廓做好) 左栏:总结(用大括号括着右边的内容);为了结合要点所提出的问题;总结的图表 下面:关键词(重要的点,用一种颜色的笔写 TOP ;自己的感想和经验(BOTTOM 只记载一页,空白一页;一章过后或几章过后,空白一页画一个各个概念间关系图表,然后以后看图表,关键词, 笔记的方式来复习一、5R 笔记法•在这里记谨讲义的内育 -便甬简犖的记号-俛用壕垢-写威列衾-婴点和靈点之间錢幫有一庫的空白 口巒(Summary)5R 笔记法,又叫做康乃笔记法,是用产生这种笔记法的大学校名命名的。
这一方法几乎适 用于一切讲授或阅读课,特别是对于听课笔记, 5R 笔记法应是最佳首选。
这种方法是记与 学,思考与运用相结合的有效方法。
具体包括以下几个步骤:-life hacker, camUR (Cues) EQ (Notes) ■主賢旳駅魅■犬了更妊炖绪合要点所擢出 O«1R •團舉 •学另曲提示1.记录(Record)。
在听讲或阅读过程中,在主栏(将笔记本的一页分为左大右小两部分,左侧为主栏,右侧为副栏)内尽量多记有意义的论据、概念等讲课内容。
2.简化(Reduce)。
下课以后,尽可能及早将这些论据、概念简明扼要地概括(简化)在回忆栏,即副栏。
3.背诵(Recite )。
把主栏遮住,只用回忆栏中的摘记提示,尽量完满地叙述课堂上讲过的内容。
4.思考(Reflect )。
将自己的听课随感、意见、经验体会之类的内容,与讲课内容区分开,写在卡片或笔记本的某一单独部分,加上标题和索引,编制成提纲、摘要,分成类目。
并随时归档。
5.复习(Review)每周花十分钟左右时间,快速复习笔记,主要是先看回忆栏,适当看主这种做笔记的方法初用时,可以以一科为例进行训练。
在这一科不断熟练的基础上,然后再用于其他科目。
二、符号记录法符号记录法就是在课本、参考书原文的旁边加上各种符号,如直线、双线、黑点、圆圈、曲线、箭头、红线、蓝线、三角、方框、着重号、惊叹号、问号等等,便于找出重点,加深印象,或提出质疑。
ACCSEE重点笔记
第一、维护表随着数据库的不断使用,也需要增加一些内容或删除一些内容,这样表结构和表内容都会发生变化。
为了使数据库中表结构更合理,内容更新、使用更有效,需要经常对表进行维护。
打开和关闭表表建立好以后,细果需要,可以对其进行修改。
例如,修改表的结构、编辑表中的数据,浏览表中的记录等,在进行这些操作之前,要打开相应的表;完成操作后,要关闭表。
1.打开表在Access中,可以在“数据表”视图中打开表,也可以在“设计”视图中打开表。
例2.21 在“数据表”视图中打开“学生”表,操作步骤如下:(1)在“数据库”窗口中,单击“表”对象。
(2)单击“学生”表名称,然后单击“打开”按钮;或直接双击要打开表的名称。
此时,Access打开所需的表。
在“数据表”视图下打开表以后,可以在该表中输入新的数据、修改已有的数据、删除不需要的数据,添加字段、删除字段或修改字段。
如果要修改字段的数据类型或属性,应当使用工具栏上的“视图”按钮切换到“设计”视图,或在“设计”视图中打开表。
在“设计”视图中打开“学生”表,操作步骤如下:(1)在“数据库”窗口中,单击“表”对象。
(2)单击“学生”表,然后单击“设计”按钮。
此时,也可以单击工具栏上的“视图”按钮切换到“数据表”视图。
2.关闭表表的操作结束后,应该将其关闭。
无论表是处于“设计”视图状态,还是处于“数据表”视图状态,单击“文件”菜单中的“关闭”命令或单击窗口的“关闭窗口”按钮都可以将打开的表关闭。
在关闭表时,如果曾对表的结构或布局进行过修改,会显示一个提示框,询问用户是否保存所做的修改。
单击“是”按钮保存所做的修改;单击“否”按钮放弃所做的修改;单击“取消”按钮则取消关闭操作。
第二、修改表结构修改表结构的操作主要包括增加字段、删除宇段、修改字段、重新设置主键等。
1.添加字段在表中添加一个新字段不会影响其它字段和现有数据。
但利用该表建立的査询、窗体或报表,新字段不会自动加入,需要手工添加上去。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.1 运行原理
嵌入式系统可以看作是一个运行着死循环主函数系统,Contiki 内核是基于事 件驱动的,系统运行可以视为不断处理事件的过程。Contiki 整个运行是通过事件 触发完成,一个事件绑定相应的进程。当事件被触发,系统把执行权交给事件所 绑定的进程。一个典型基于 Contiki 的系统运行示意图如下:
I
图表目录
图 2- 1 CONTIKI 运行原理示意图 ................................................................................... 4 图 2- 2 THREAD 与 PROTOTHREADS 栈对比示意图 ........................................................ 5 图 2- 3 CONTIKI 进程链表 PROCESS_LIST........................................................................ 7 图 2- 4 CONTIKI 进程状态转换图 ................................................................................... 8 图 2- 5 函数 PROCESS_START 流程图 ............................................................................ 10 图 2- 6 CALL_PROCESS 流程图........................................................................................11 图 2- 7 EXIT_PROCESS 流程图 ........................................................................................ 12 图 2- 8 CONTIKI 事件队列示意图 ................................................................................. 13 图 2- 9 PROCESS_POST 函数流程图 ............................................................................... 14 图 2- 10 DO_EVENT 函数流程图 .................................................................................... 15 图 2- 11 TIMER 链表 TIMER_LIST 示意图 ....................................................................... 16 图 2- 12 ETIMER_SET 流程图 ......................................................................................... 17 图 2- 13 ETIMER_PROCESS 的函数 THREAD 流程图....................................................... 18 图 2- 14 RIME 协议栈结构框图 .................................................................................... 19 图 2- 15 OPEN、COON、CALLBACKS 对应关系............................................................. 21 图 2- 16 RECV 函数流程图 ............................................................................................ 23
clock_init(); process_init(); process_start(&etimer_process, NULL); autostart_start(autostart_processes);
① 分析 Contiki 操作系统源码时,已将分析笔记分享在个人博客 (),本章大部分 是对这些内容的重新整理。
3
开始
时钟初始化 进程初始化
有高优先
级进程 是
否
启动系统进 程
执行该进程
处理事件
启动用户自 启动进程
结束
图 2- 1 Contiki 运行原理示意图
事实上,上述的框图几乎是主函数的流程图。通常情况下,应用程序作为一
个进程放在自启动的指针数组中,系统启动后,先进行一系列的硬件初始化(包括
串 口 、 时 钟 ), 接 着初 始 化 进 程, 启 动系统 进 程 ( 如 管理 etimer 的 系 统 进 程
etimer_process)和用户指定的自启动进程,然后进入处理事件的死循环(如上图右边
Contiki 学习笔记(重写版)
Jelline Blog: 新个人独立博客:
如果您引用本文的内容,记得添加引用: [1]苏铅坤.无线传感器网络文件系统与重编程技术研究[D].电子科技大学.2013.
框框所示,实际上是 process_run 函数的功能)。通过遍历执行完所有高优先级的进
程,而后转去处理事件队列的一个事件,处理该事件(通常对应于执行一个进程)
之后,需先满足高优先级进程才能转去处理下一个事件。将 process_run 代码展开
加到 main 函数,保留关键代码,如下: int main() {
2.1 运行原理................................................................................................................. 3 2.2 CONTIKI 内核 .......................................................................................................... 5
II
Contiki 学习笔记(重写版)①
Contiki 是由瑞典计算机科学研究所开发专用的网络节点操作系统,自 2003 年 发布 1.0 版本以来,得到飞速发展,成为一个完整的操作系统,包括文件系统 Coffee、 网络协议栈 uIP 和 Rime、网络仿真器 COOJA,并于 2012 年发布全新版本 2.6。 Contiki 由标准 C 语言开发,具有很强的移植性,已被移植到多种平台,包括 8051、 MSP430、AVR、ARM,并得到广泛应用。除此之外,Contiki 将 Protothreads 轻量 级线程模型和事件机制完美整合到一起,Proththreads 机制使得系统占用内存极小, 事件机制保证了系统低功耗,非常适合资源受限、功耗敏感的传感器网络。
2.2.1 Protothreads ...................................................................................................... 5 2.2.2 进程控制块 ..................................................................................................... 6 2.2.3 进程调度 ......................................................................................................... 8 2.2.4 事件调度 ....................................................................................................... 12 2.2.5 定时器 ........................................................................................................... 16 2.3 文件系统 COFFEE................................................................................................. 18 2.4 动态加载 .............................................................................................................. 18 2.5 RIME 协议栈.......................................................................................................... 19 2.5.1 协议栈结构 .................................................................................................... 19 2.5.2 建立连接 ....................................................................................................... 20 2.5.3 数据发送 ....................................................................................................... 22 2.5.4 数据接收 ....................................................................................................... 22 2.5.5 释放连接 ....................................................................................................... 23 2.6 本章小结 .............................................................................................................. 24