2019-2020-1 20175313 《信息安全系统设计基础》ucosii
目录
ucosii(必做)
一、题目要求
- 下载附件,尝试在vc6.0 中编译运行ucos
- 下载附件,尝试在vs2017中编译运行ucos,给出你遇到的问题和解决方式
二、vc6.0中编译运行ucos
编译结果截图:
运行结果截图:
- 遇到的问题:运行完成后,我并未输入任何东西,就直接结束进程了。
- 解决方法:尚未解决。
三、vs2017中编译运行ucos
由于C盘空间已满未能成功下载。
ucosii(选做)
一、题目要求
阅读附件中的代码,回答:
- ucos是如何分层的?
- HAL都有哪些代码?
- 分析任务是如何切换的。
二、ucos分层
由上图可知,ucosii一共分为三层。上层访问抽象接口层、设备管理核心数据结构层和硬件设备驱动模块层。
上层访问抽象接口层
一般的抽象层设计会直接在这一层提供5个访问接口API: DeviceOpen、DevGetch、DevPutch、DevControl和DeviceClose,分别用于打开设备、读设备、写设备、设备控制和关闭设备。而在这个设计里面更改了这种定义模式提供两个公用的接口DeviceOpen和DeviceClose,同时为不同的外设分别提供特定的抽象接口,在移植的时候利用这些抽象接口的不变性保证应用程序的可移植能力。这样做的优点更适合于有单片机开发经验的工程人员直接调用。
设备管理核心数据结构层
这是通用驱动框架的核心,主要用每个设备分配一个设备控制块,通过链表形式进行管理,该链表定义为设备控制块链表DEV_CONTROL_BLOCK* HvlConList。在这一层,为系统中的每个硬件设备分配唯一的设备ID。上层应用程序通过将设备ID作为参数传递给DeviceOpen函数实现对相应设备的核心管理数据结构的定位搜索,通过搜索,DeviceOpen函数找到相应设备控制块,申请设备的使用权限,获得相应硬件设备的操作句柄,该句柄指向具体的外设底层操作函数列表,返回该设备句柄;再通过上层抽象接口层提供的接口函数对设备进行访问。
硬件设备驱动模块层
这一层是硬件设备驱动模块功能的实现层,对各个硬件设备的驱动在相应的硬件设备驱动模块中完成。各个硬件设备驱动模块,原则上需要实现如下几个函数: DevGetch、 DevPutch、DevControl,分别完成相应设备的读、写、控制,当然,可以根据具体设备的特性,只实现3个驱动函数的其中一部分,例如,如果某设备不支持写操作,那么就不
用实现DevPutch函数。
三、HAL代码部分
硬件抽象层(HAL)
- 硬件抽象层(HAL)是体系结构相关的底层程序
- 处理系统启动、硬件初始化以及中断与异常
- 硬件抽象层对内核其它部分提供统一的调用接口
- HAL可以提供BSP规范,提供跨平台可移植性
- 硬件抽象层具有与硬件密切相关性
- 硬件抽象层具有与操作系统无关性
- 接口定义的功能应包含硬件或系统所需硬件支持的所有功能
- 接口定义简单明了,太多接口函数会增加软件模拟的复杂性
具有可测性的接口设计有利于系统的软硬件测试和集成
附件中所有以FS开头的文件都是HAL代码。
四、任务切换
当进行任务切换时:
保存任务运行环境
运行环境包括了两部分:
- 处理器中的运行环境:PC,SP
- 内存中的运行环境:任务代码、任务堆栈
- 处理器通过两个指针寄存器(PC和SP)来与任务代码和任务堆栈建立联系并运行它
使用任务调度算法,确认进行切换的任务
- 在内存中为每个任务创建一个虚拟的处理器
- 需要运行某个任务时就把该任务的虚拟处理器复制到实际处理器中
- 由操作系统的调度器按某种规则来进行这两个复制工作
虚拟处理器应该存储的主要信息(任务的Context):
- 程序的断点地址(PC)
- 任务堆栈指针(SP)
- 程序状态字寄存器(PSW)
- 通用寄存器内容
- 函数调用信息(已存在于堆栈)
任务的Context通常保存在任务堆栈中
用一个数据结构保存任务堆栈指针(SP),这个数据结构叫做任务控制块,它除了保存任务堆栈指针之外还要负责保存任务其他信息
参考资料
- ucos软件结构
- 密码系统设计基础·实时操作系统
- 5303柴轩达 ucosii-2(选做)