一、要求
- 下载附件,尝试在vc6.0中编译运行ucos
- 下载附件,尝试在vs2017中编译运行ucos,给出你遇到的问题和解决方式
- ucos是如何分层的?
- HAL都有哪些代码?
- 分析任务是如何切换的?
- 在附件中增加两个任务,一个随机打印你的学号,一个打印你的姓名
- 给出运行结果截图
- 把代码提交到码云
二、步骤
认真学习云班课PPT——ch03a/b/c
vc6.0中编译运行ucos
vs2017中编译运行ucos
- 存在输入闪退的问题
三、结果
ucos分为硬件相关层、驱动接口层、应用接口层、应用层
- 硬件相关层:尽量所有硬件相关都囊括在其中,不论GPIO还是定时器或是串行接口,只要提供标准统一的接口,就可以让上层通畅,这其中有三个最为重要的接口
Open
,Close
,Ctrl
。Open主要来完成对应硬件初始化,形参中包括了些,初始化的相关参数。Close失能硬件。Ctrl来实现一些控制的修改如:优先级,中断回调函数等等,硬件的不同,内容也大为不同。 - 驱动接口层:其实在上一层也算是驱动层,只不过因为硬件相关,而把他分离。这层中会用到一个或多个硬件层的接口,进行组合来实现特定功能的程序。这部分程序可举例进行说明。以Flash为列,它这里主要调用硬件层的SPI函数接口,但是主要的写,读指令都是在这里函数中完成的。在这层中需要提供5个标准统一的接口函数:
XXXOpen
、XXXClose
、XXXWrite
、XXXRead
、XXXIoCtl
。
没有被用到的函数可以为空。本来还需要Install
函数来进行动态加载和删除,因为stm32
内存一般都很有限,所以舍弃动态分配。而把这5个函数用常量的形式直接编译到ROM中。在驱动的抽象接口层中可以做选择,哪些驱动要加载到内核,哪些不需要。不要的驱动不参与编译。这样有限的资源 可以得到合理的应用。这一层大部分工作可以说属于一次性投入。 - 应用接口层:主要连接驱动和应用。又是连接应用层模块与模块之间的一层, 这一块有很强的特殊性,第一包括了驱动抽象接口层,第二包括了模块与模块的接口层。第三又与应用层密不可分。
驱动抽象接口通过ID访问那ID对应的那五个函数。抽象接口也是一次性投入的函数,在设计时对其可靠性要很重视。
模块与模块的接口层,包括模块的接口头文件,这些头文件要求是非常独立的,不能加载模块内的内部头文件,应该包括接口函数的函数声明,在接口中尽量少用到全局变量。如果非要用到可以使用函数的方式进行传递,或ucos
消息队列方式。最好用ucos
进行传递,因为有很好的互斥保护功能。 - 应用层:所有模块都算是应用层,在模块内所有变量或函数(接口除处)应该都本地化。在模块内可以有本模块化共用的主头文件,来方便本模块的维护。对硬件的访问其实直接调用应用接口就可完成。