(一)概要设计
研究时钟系统,配置操作系统时钟。操作系统需要根据“心跳”的节拍进行工作,进行时钟节拍的配置是构建操作系统的第一步,将ARM3内部时钟进行分频后用于操作系统。
明确任务控制块的组成部分以及任务管理方式。任务控制块TCB是任务管理的核心数据结构。和UCOS等系统不同,我们对任务控制块内容进行了简化,只保留了任务优先级、任务状态字、任务等待节拍、堆栈指针等不可或缺的重要内容,让结构更加清晰明了。管理方式也只保留了最为重要的任务创建、任务就绪、任务挂起、任务撤销、任务切换等内容。
深入理解任务切换的核心。如何将当前任务环境进行快速完整的保存、让下一个任务及时进入CPU运行是切换的核心。经讨论发现运用ARM3自带的PendSV中断可快速高效的进行任务切换 。
(二)关键技术
1.初始化系统时钟
将HCLK时钟进行1/8分频后用于系统时钟。
2.任务控制块的创建与初始化
通过结构体数组将任务控制块中的内容初始化,代码简短清晰。
3.任务的创建
使用者根据需求创建堆栈、任务函数,指明任务优先级。操作系统共有7个优先级,一个空闲任务。系统通过给出的堆栈地址,将堆栈进行相关的初始化,然后将任务优先级任务状态字、堆栈地址等信息放入任务控制块。
4.任务的执行
通过Start()函数开启任务执行:通过对就绪队列的查找,找到最高优先级将此任务移除就绪队列加入运行队列开始执行此任务
5.任务的管理
任务有就绪、挂起、运行三种状态。
任务创建之初默认处于就绪态,将任务加入就绪队列。
任务从就绪态转为运行态:当前运行任务不是就绪队列中的最高优先级,进入PendSV中断,保存当前运行任务的运行环境变化PrioCur(当前任务优先级)等变量,需要运行的任务通过堆栈将运行环境恢复到CPU中。
退出PendSV中断:任务从运行态(或就绪态)转为挂起态。将此任务从运行队列(或就绪队列)中退出,加入挂起队列。找到就绪队列中的最高优先级通过PendSV中断进行任务切换,运行最高优先级任务。
任务延时函数:将延时的时间赋值给任务控制块中的TCBDly变量,将此从运行态转为挂起态,每运行一次SysTick_Handler()中断函数将TCBDly减一,判断TCBDly的值是否变为0,TCBDly为0时将此任务恢复倒就绪队列,进行最高优先级任务查找,最高优先级任务不是当前运行任务则通过PendSV中断进行任务切换,运行最高优先级任务。
(三)所遇问题
对系统时钟控制不清楚,后重新学习了32时钟树并查看了UCOS系统时钟部分的设定。
未接触过汇编,后自行查找资料并向老师求助,对UCOS汇编代码部分进行阅读和理解。