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