nesC——模块和配件的细节总结

模块和配件的细节总结
0.关于模块:
(1)默认的代码实现
<1>模块能为使用的接口命令或事件a指定默认的代码实现
<2>模块不能为提供的接口命令或事件a指定默认的代码实现
<3>如果a未与任何命令或事件进行绑定,就会执行默认的实现
<4>默认的命令或事件在定义时以default作为前缀
举例:

tinyos之nesC

继续来谈谈对tinyos和nesC的理解,当然了,是比较肤浅的见解
1.nesC的编程框架
nesC可以看成是C的一种方言。。。个人观点~~请无视==!
组件:分为module和configuration
module实现具体程序逻辑,configuration负责连接各个组件
接口:可以看成一些函数声明的集合。组件之间只能通过接口交流
接口具有双向性
接口一般在组件中实现
module分两类:
1.提供接口(provider):接口的提供者必须实现接口的所有命令
2.使用接口(user):接口的使用者必须实现接口的所有事件
举例:接口StdControl:
相应接口文件:里面只是StdControl的声明(这和JAVA是相似的)
接口提供者(组件):如果一个组件要具有开关一个元器件的功能,那它就应该提供StdControl,并实现它的命令
接口使用者(组件):如果一个组件要使用该元器件,则需要调用上述组件的StdControl接口,它就需要实现StdControl的事件,即当事件发生时做什么
由上述例子可见:很多组件可以提供同一个接口,当然它们的内部代码(功能)是不同的,这也是需要在configuration中连接的原因,个人感觉连接很像电子设计中的布线。。
2.本质上为什么要进行连接?
下面是个人的一些初步理解,错误之处请大牛指出
和标准c一样,nesC也有命名空间,不同在于,nesC的命名空间都是局部的,它没有一个全局的命名空间,组件内部的变量和函数都是私有的,所以说组件沟通的唯一方法是通过接口。
连接的本质也在这里,因为没有全局的命名空间,因此无法实现像标准c那样的连接(函数名在外部是无效的),甚至于像c++那样的动态绑定(函数指针实现),所以nesC通过configuration显式地连接,把调用名与具体实现关联。当然了,这样的连接是静态的。
3.关于命令和事件的一点看法:
接口的提供者实现命令,触发相应事件。当使用者调用的命令完成,该命令(在提供者内部)触发相对应的事件,并以某种方式(早上看的比较乱,居然忘了。。)向上到达使用者。
早上数据结构课上机,本来想的挺好,写好的程序给他看下就走人,结果人太多,他一个一个看,到12点还没轮到我。。好惨。不过正好利用这段时间看了下tinyos programming的一部分,受益匪浅,不知道为什么很多东西到现在又忘了,看来有些原理性的东西得再看。然后晚上本来想找个好点的编辑环境,发现实验室给的xubuntu的vim已经增加了nesC的语法高亮,哈哈,考虑周全,省心多了~~

面向TelosB的tinyos编程基础

1.数据类型

支持float与double类型,但在nx类型网络数据包中不支持。
2.通常在XXX.h中定义数据包格式
XXX.h内容:
#ifdef MODELNULL_H
#define MODELNULL_H
enum{Constant1=256,Constant2=0×93};
typedef nx_struct tobase{
nx_uint16_t nodeid;
nx_uint16_t data;
}tobase_t;
#endif
复习一下c语言枚举类型:http://blog.csdn.net/jidanit/article/details/2652848 这篇博文写的很不错
3.Command 和函数类似,调用时用call。Command也可能有返回值
4.event 也和函数类似。但是用signal调用
5.输出leds
(1)TelosB正面,usb向左,3个LED灯从左向右依次为RGB。
(2)leds的常用Command:
led0Off() 使灯灭
led0On() 使灯亮
led0Toggle() 灯的状态取反

tinyos初体验

今天开始学习tinyos
1.xubuntu集成了tinyos
2.几个文件:(XXX代表工程名)
XXXAppC.nc 对程序的一个总体的结构上的说明。
XXXC.nc 程序主文件,其中的event void Boot booted()函数相当于C中的main()函数
makefile 这个无需说明,大家都明白~。当然,注意里面的语法
COMPONENT=XXXAppC //表示XXXAppC是描述工程整体结构的文件
include $(MAKERULES)
echo了一下这个变量,发现如下

vi了一下,发现是一份较长的默认makefile,好吧,不看了~~
3.编译器ncc(这个编译器是第一次听说,,类似gcc吧)
如何编译源文件?
答:make telosb
4.写入TelosB节点
motelist 查看当前与系统连接的telosb设备。
假设com5和com7都连接了telosb设备,如何将程序写入com5的设备,并编号为3?
答:make telosb reinstall,3,bsl,4
reinstall 表示不需要再次编译,直接写入设备
数字3表示给节点编号为3.这个编号被传到程序中是一个常量TOS_NODE_ID
bsl.后面的数字表示写入指定设备(设备com号减1)
注意:如果只有一个设备,直接 make telosb reinstall,3 将其编号为3即可
5.关于TelosB节点:
靠近usb端的按键:reset键
远离usb端的按键:user键
大概先这些吧,开发环境基本了解了,总体感觉TelosB节点和单片机差不多,不过感觉TelosB更高级一些

完善引导程序——未启动分页机制的保护模式3

第二遍写。。刚写完结果电脑重启了。。只好大概重写下要点。。
1.[BITS 32] 明确告诉编译器接下来的段是32位的段
2.用bocsh虚拟机调试操作系统
将run.bat中的..\bochs -q -f bochsrc.bxrc改为..\bochsdbg -q -f bochsrc.bxrc
bocsh常用命令:

3.保护模式下写hello shadow程序
(1)问:如何修改gdt使保护模式下的数据段描述符和代码段描述符的段基址分别与data_32和code_32对应?
答:观察描述符的结构可知,第2、3、4、7位表示段基址(从0开始计数)。修改这几位即可。
相关代码:

引导程序编写小记

1.引导程序:
bios将启动磁盘第一扇区(512Byte)载入内存0000:7c00处。如果第一扇区最后一个字是dw 0aa55h,那么它就是引导程序
2.nasm的语法:
(1)$:编译后的当前行地址
(2)$$:编译后一个节的开始处的地址
(3)任何不被[]括起来的标签或变量名都被认为是地址。没有offset这个关键词
(4)org 07c00h 告诉编译器程序的开始地址是07c00h
(5)times 字节数 db 0 从该行开始,将指定长度空间填0
(6)小技巧:jmp $ 死循环
3.用nasm编译:nasm *.asm -o *.bin
4.反编译:ndisasm *.bin
5.开机时实模式下的1M内存:

因为试了很久都没能给centos纯字符界面装上vbox的增强包,自然也就不能设置共享文件夹,所以果断放弃centos,改用win下的nasm。。。
步骤:
1.写好引导程序
2.用nasm编译
3.用winimage新建个虚拟软盘文件
4.写个c程序copy_image,将写好的引导程序copy到空白软盘镜像boot.vfd
5.vpc挂载boot.vfd,启动
下面先给出int 10h中断,13h号功能:
功能:在Teletype模式下显示字符串
入口参数:AH=13H
BH=页码
BL=属性(若AL=00H或01H)
CX=显示字符串长度
(DH、DL)=坐标(行、列)
ES:BP=显示字符串的地址 AL= 显示输出方式
0—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
1—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变
2—字符串中含显示字符和显示属性。显示后,光标位置不变
3—字符串中含显示字符和显示属性。显示后,光标位置改变
出口参数: 无
下面给出这个可以引导的程序: