270 likes | 582 Views
VxWorks 软硬件设计及实例分析. tof@felab 2005.3.27. 主要内容. VxWorks 特点 Tornado 界面 硬件实例 软件流程 用户程序框架 更多技术细节. 一、 VxWorks 的特点. 支持多任务 实时性强 体积小,可裁剪 支持多种 CPU 支持网络通讯、串口通讯 汇编 + 标准 C 的编程模式 内核和定制任务可以分开编译、动态下载,支持用户自定义启动任务. VxWorks 多任务. 为什么多任务 每个明显单独运行的程序称为一个任务. 任务包含什么. 任务名和任务 ID 任务优先级(0~255)
E N D
VxWorks软硬件设计及实例分析 tof@felab 2005.3.27
主要内容 • VxWorks特点 • Tornado界面 • 硬件实例 • 软件流程 • 用户程序框架 • 更多技术细节
一、VxWorks的特点 • 支持多任务 • 实时性强 • 体积小,可裁剪 • 支持多种CPU • 支持网络通讯、串口通讯 • 汇编 + 标准C的编程模式 • 内核和定制任务可以分开编译、动态下载,支持用户自定义启动任务
VxWorks多任务 • 为什么多任务 • 每个明显单独运行的程序称为一个任务
任务包含什么 • 任务名和任务ID • 任务优先级(0~255) • 任务状态
任务操作 • taskSpawn() 发起任务 • taskDelete() 删除任务 • taskDeleteForce() 删除设置了安全保护的任务 • taskSafe() 设置任务的安全保护 • taskUnsafe() 取消任务的安全保护 • taskSuspend() 挂起一个任务 • taskResume() 使任务退出挂起状态 • taskPrioritySet() 设定任务的优先级 • taskPriorityGet() 获得任务的优先级 • taskLock() 锁定任务调度 • taskUnLock() 重新允许任务调度 • taskIdSelf() 获得任务本身的ID • taskIdVerify() 判断ID对应的任务是否仍然存在 • taskDelay() 延迟 • taskTcb 获得任务的控制块TCB
任务间通讯 • 共享内存(全局变量、数组、结构体) • 管道(pipe) • 信号灯(semaphore) • 消息队列 (message queue)
参考文档 • Tornado安装目录\docs\books.html • 《嵌入式实时操作系统VxWorks及其开发环境Tornado》,中国电力出版社 • VxWorks开发人员指南丛书 ,清华出版社 • http://www.windriver.com/ • http://bbs.edw.com.cn/list.asp?boardid=3 ,电子产品世界——嵌入式设计论坛 • BSP training, Device driver, Tornado training Workshops • BSP Developer’s Kit for VxWorks, user’s Guide
文件分布 • Tornado • docs • host • target
文件分布 • BSP • all • bspname
文件分布 • 用户程序 • .c .h • makefile • [XXXgnu]
硬件控制 • 板载灯 • 配合EPLD或者FPGA进行初期调试 • 串口(后期调试) • Bootrom启动后期 • 网口(TCP/IP, UDP) • Bootrom启动后期 • PCI器件 • bootrom和VxWorks中都用关于PCI通用寄存器(256byte)配置的部分 • 用户程序负责用户寄存器的填写
中断处理 • 初始化部分 • 挂接终端(intConnect()) • 中断服务程序 • 关中断(intDisable()) • 通知硬件中断已经被相应 • 中断服务任务 • 处理中断 • 开中断(intEnable())
硬件轮询(while(1)+taskDelay()) • 软件延迟 void dailyFunc(int param1,int param2…) { while(1) { taskDelay(TIME_TO_GO); /*需要定时执行的内容*/ } } void initDailyFunc() { taskSpawn(…,(FUNCPTR)dailyFunc,…param1,param2…); }
硬件轮询(watchdog) • 硬件延迟 void dailyFunc(int param) { wdStart(wdDailyFunc,TIME_TO_GO,(FUNCPTR)dailyFunc,param); /*需要定时执行的内容*/ } void initDailyFunc() { wdDailyFunc = wdCreate(); wdStart(wdDailyFunc, TIME_TO_GO,(FUNCPTR)dailyFunc,param); }
网络运行(一) • 通讯协议
网络运行(二) • 网络监控 • socket函数返回错误 • ping()
六、更多技术细节… • 网络通讯的缓冲队列实现 • 多任务控制 • 善用宏定义 • 自启动VxWorks制作 • 嵌入式软件的控制端调用 • VxWorks编程规范