(3)时钟部分(OSTime.c):uC/OS-II中最小时钟单位是timetick(时钟节拍),其中包含时间延迟、时钟设置及时钟恢复等与时钟相关的函数。
(4)多任务同步与通信(OSMbox.c,OSQ.c,OSSem.c,OSMutex.c,OSFlag.c):包含事件管理函数,涉及Mbox、msgQ、Sem、Mutex、Flag等。
(5)内存管理部分(OSMem.c):主要用于构建私有的内存分区管理机制,其中包含创建memPart、申请/释放memPart、获取分区信息等函数。
(6)CPU接口部分:uC/OS-II针对特定CPU的移植部分,由于牵涉到SP等系统指针,通常用汇编语言编写,包括任务切换、中断处理等内容。
b.移植说明
μC/OS-II 的移植,主要是处理OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM等三个文件。
其中OS_CPU.H 主要包含编译器相关的数据类型的定义、堆栈类型的定义以及几个宏定义和函数说明。重新定义数据类型是为了增加代码的可移植性。
S_CPU_C.C 中则包含与移植有关的C 函数,包括堆栈的初始化函数和一些钩子(hook)函数的实现。
S_CPU_A.ASM 中则包含与移植有关的汇编语言函数,包括开关中断、上下文切换、时钟中断服务程序等等。
c.移植过程
首先在通用PC 的CodeWarrior for ADS1.2软件开发平台上建立移植项目μC/OS-II 项目,加入初始化和启动代码,组织μC/OS-II 源代码和各种程序数据,经编译、调试通过生成.axf(ARM executable file)文件。在AXD 调试器中装载该程序,使用JTAG 接口下载应用程序到板载FLASH,即可进行调试。μC/OS-II 移植调试成功后可以将程序固化到FLASH,脱机运行。
3. 各种驱动程序的编写
//按芯片手册上的命令序列完成芯片的读写,擦除等操作。
#define _WR(addr,data) *((volatile U16*)(addr<;<;1))=(U16)data//写函数
#define _RD(addr) (*((volatile U16*)(addr<;<;1)))//读函数
#define _RESET() _WR(0x0,0xf0f0)
int SST39VF800_ProgFlash(U32realAddr,U16data)//真正的烧写函数
{
volatile U16*tempPt;
tempPt=(volatile U16*)realAddr;//将目标地址转化为指针
_WR(0x5555,0xaaaa);
_WR(0x2aaa,0x5555);
_WR(0x5555,0xa0a0);
*tempPt=data;//将要烧写的程序两字节两字节的烧进去
return SST39VF800_WAIT();//状态查询
}
//探测DM9000参数的函数,得到DM9000的厂商ID和产品ID,返回真或假,真:网卡被探测到,否则没有
BOOL dm9000Probe(void)
{
USHORT id_vendor,id_product;
CONSOL_Printf(“\n [DM9000Test]\n”); //往串口0上打印字符串
id_vendor =READ_REG1(PKTPG_VNDR_ID_L); //读DM9000厂商ID
id_vendor |=READ_REG1(PKTPG_VNDR_ID_H)<;<;8;
if (id_vendor !=DM9000_VNDR_ID) //判断读取的对不对
{
CONSOL_Printf(“VENDOR ID Error (0x%04x !=0x%04x)\n”,DM9000_VNDR_ID,id_vendor);
return FALSE;
}
else
CONSOL_Printf(“VENDOR ID =0x%04x\n”,id_vendor);
id_product =READ_REG1(PKTPG_PRDCT_ID_L); //读DM9000产品ID
id_product |=READ_REG1(PKTPG_PRDCT_ID_H)<;<;8;
if ((id_product &;DM9000_PRDCT_ID)!=DM9000_PRDCT_ID) //判断读取的对不对
{
CONSOL_Printf(“Product ID Error (0x%04x !=0x%04x)\n”,DM9000_PRDCT_ID,id_product);
return FALSE;
}
else
CONSOL_Printf(“Product ID =0x%04x\n”,id_product);
return TRUE;
}
文件系统相关数据结构
FDT表记录了本目录下有哪些文件、目录以及各文件目录的属性和存储位置等信息。下面是FDT 表项数据结构定义:
typedef struct_FDT
{
char DIR_Name[11];//目录项名,亦即文件名或目录名(后三位扩展名)
uint8DIR_Attr;//文件或目录属性
uint8DIR_Resv;//FAT 保留域
uint8DIR_FstClusHI;//起始簇号高1字节
uint16DIR_CrtOrLstWrtTime;//建立或最后修改时间
uint16DIR_CrtOrLstWrtDate;//建立或最后修改日期
uint16DIR_FstClusLO;//起始簇号低两字节
uint32DIR_FileSize;//文件大小
}
打开文件的数据结构
该数据结构主要纪录已经打开文件的基本信息。数据结构定义如下:
typedef struct_FILE
{
uint8Flags;//一些标志,主要是文件是可读或可写标志
char Name[11];//文件名
uint8Drive;//文件所在驱动器
uint24DirClus;//所在目录开始簇号
uint32FileSize;//文件大小
uint24FstClus;//起始簇号
uint24Clus;//当前簇号
uint32Offset;//文件指针偏移量
}OP_FILE;
4. 轻量级嵌入式TCP/IP协议LwIP
嵌入式操作系统UC/OS是一个公开源代码的抢先式多任务的微内核RTOS,其性能和安全性可以与商业产品竞争。uC/0S-II是一个富有开放色彩的RTOS,只要买一本书就可获得源代码,对学校和教育使用完全免费,商业应用的费用相对也很低。但是它目前的一些第三方TCP/IP支持都是完全商业化的,用户需要付费才能获得,很少给出源代码,这就影响了uC/0S-II的研究和推广。通过把开放源代码的TCP/IP协议栈LwIP移植到uC/0S-II上来,就获得了一套可免费研究、学习的嵌入式网络软件平台。
LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP的含义是Light Weight(轻型)IP协议。LwIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LwIP TCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端嵌入式系统中使用。
LwIP的特性如下:
(1)支持多网络接口下的IP转发
(2)支持ICMP协议
(3)包括实验性扩展的UDP(用户数据报协议)
(4)包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议)
(5)提供专门的内部回调接口(Raw API)用于提高应用程序性能
(6)可选择的Berkeley接口API(多线程情况下)
我们目前使用的是LwIP的最新稳定版V1.30。有关LwIP的详细内容,可以参考其代码和网站上的文档。
LwIP包含多个模块,除了那些实现TCP/IP协议族(IP、ICMP、UDP、TCP)的模块外,也实现了其他一些支持的模块,如:操作系统仿真层、缓冲及内存管理子系统、网络接口函数、计算检验和的函数及其他一些抽象的API。
消息传递的实现是一个抽象为“邮箱”的简单机制。一个邮箱有两种操作:邮递和收取。邮递操作不会阻塞该进程,而邮递给一个邮箱的信息会由操作系统仿真层列入队列,直到另外的进程收取该信息。即使下层操作系统不支持邮箱机制,它也能容易地由信号量实现。
5. 总结
随着信息时代的发展,嵌入式技术已经被广泛应用到日常生活中的方方面面,嵌入式系统在消费、汽车电子、微控制、无线通信、数码产品、网络设备、安全系统等领域的应用方兴未艾,从广义概念来说,除了通用的计算机系统应用外,其他所有的智能电子设备都属于嵌入式系统。未来的技术人员不懂嵌入式,就如同现代人不懂电脑一样,会与时代格格不入的。
目前在嵌入式平台上还很少有对大容量硬盘的支持及相关接口,也没有相关支持大容量硬盘的嵌入式文件系统,基于uC/OS-II系统不完善的内核进行嵌入式的应用开发虽有一定的难度,但也更具有挑战性。对于本系统,笔者原本只想拿一个小的开发板挂接上大的硬盘,接上网络放到宿舍当一个可长时间开机的、不怎么费电的网络硬盘或文件服务器用,将来还有可能为其添加USB接口U盘、移动硬盘、串口硬盘、图形用户接口等,但这要涉及嵌入式硬件及软件模块的大量工作。本系统可以作为公司及个人文件服务器、网关等使用,另外在本系统的基础上稍加改造即可实现小型网站服务器、打印管理服务器、多媒体服务器、数据汇集中心等多种功能。
参考文献:
[1]Wilson Y.H.Wang,Tow Chong Chong.An Ethernet based data storage protocol for home network.IEEE Transactions on Consumer Electronics,2004,50(2):543-551.
[2]Katz R H.Network-attached storage systems[C].Proc.SHPCC92Conf.Scalable High Performance Computing.1992,68-75.
[3]杜春雷,ARM体系结构与编程[M].北京:清华大学出版社,2003.
[4]Labrose J Jean.邵贝贝译.嵌入式实时操作系统uC/OS-II(第2版)[M].北京:北京航空航天大学出版社,2003.
[5]Charlotte Brooks,Ravi Khattar,Satoshi Suzuki,Mats Wahlstrom.IBM TotalStorage:Introducing the SAN File System.IBM International Technical Support Organization,2003.
[6]微软公司,FAT32文件系统特性(1.03)[S].2000.
[7]张江陵,冯丹.海量信息存储[M].北京:科学出版社,2003.
[8]刘柱鸿,赵跃龙.嵌入式系统IDE 接口驱动设计的关键技术[J].计算机时代,2007.1:47-48,51.
[9]韦东山,嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.
[10]杨宗德,张兵编著.uC/OS-II标准教程[M].北京:人民邮电出版社,2009.
[11]史军勇,赵跃龙.智能网络磁盘IND 软件设计与实现[J].单片机与嵌入式系统应用,2006(2):17-20.
[12]任哲.嵌入式实时操作系统uC/OS-II 原理及应用[M].北京:北京航空航天大学出版社,2005:15-36.