ucos实时操作系统学习笔记——操作系统在STM32的移植

使用ucos实时操作系统是在上学的时候,导师科研项目中。那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西。后来工作了,闲来无聊就研究了一下这个只有几千行代码的操作系统,也没所有的代码都看,只是看了其中部分内容。自己还自不量力的尝试着去写过简单的操作系统,最后写着写着就被带到了ucos的设计思路上了,后来干脆就“copy”代码了,虽说对操作系统内核的理解有很大的帮助,但是很是惭愧啊,智力不够,对操作系统内核的设计者更加仰慕,O(∩_∩)O哈哈~

之前项目开发用的STM32,接下来就从ucos在STM32的移植开始讲一下学习过程吧。当时系统移植也是根据开发板例程来的,像OS_STK,OS_CPU_SR以及堆栈的增长方式等设置都已经根据ARM-CoreM3的硬件特性设置好了,所以移植过程相对简单一点。以下所讲内容纯属个人理解,如果不对的地方,请批评指正。

首先,讲一下个人对ucos操作系统整体架构的理解,网上有很多对ucos每个文件是干什么的做介绍的文章,在这里不做详细介绍,可以网上搜一下。ucos主要包括TIMER管理(os_tmr.c),任务(os_task.c),任务间通信(os_sem.c,os_mutex.c等),内存管理(os_mem.c),和处理器相关底层实现。除了处理器相关底层实现外,其他的算是操作系统内核的东西,处理器相关实现却因处理器的不同而具体实现不同。操作系统移植主要的操作就是做这部分内容。

  其次,讲一下个人对ucos操作系统工作原理的理解,主要分为四点:

1. 操作系统给每个任务分配一个优先级,当有任务切换时,cpu的使用权会分配给优先级最高的任务;

2. 在操作系统内核中,当有比较重要的数据操作时,会通过开关中断来保证数据的可靠性和正确性;

3. 通过手动设置异步中断寄存器的值触发中断处理函数,实现任务的切换(此操作主要是任务间的通信操作实现的);

4. 中断会自动保存寄存器的值,完成中断处理之后,会检查有没有比当前任务优先级更高的任务,从而决定是否进行任务切换操作(此中断中比较重要的是“心跳”定时器中断保证了没有外部中断的情况下,实现任务切换);

ucos在STM32上的移植主要是针对上面提到的工作原理中的后面三点实现的,其中讲到的第一点是操作系统内核中做得事情。移植中的函数声明是在操作系统内核中,对于STM32的移植,函数的具体实现是在os_cpu_a.asm中。接下来分析一下移植过程中使用到的各个函数的。

1. 和工作原理第2条相关的进出临界区函数(其实是开关中断函数)。

#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();};

#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}.

2. 和工作原理第3条相关的任务切换函数

#define OS_TASK_SW() OSCtxSw()

3. 和工作原理第4条相关的中断退出任务切换函数

OSIntCtxSw(), 该函数是当中断处理函数完成操作之后由OSIntExit函数调用,实现原理和OSCtxSw相同,但是意义不同。

以上这三个函数是这样组织的:

对应1,对于进入临界区的函数,主要是通过修改中断寄存器中的值实现的。OS_CPU_SR_Save()通过将中断寄存器中的值取出并存入到cpu_sr中,修改中断寄存器的值,屏蔽中断(NMI和硬件fault是不能被屏蔽的)。OS_CPU_SR_Restore()是将之前存到cpu_sr中的值写入到中断寄存器,从而恢复到没有屏蔽中断之前的状态。

对应2和3,对于进行任务切换的函数,其主要是通过触发中断,在中断处理函数中通过将高优先级任务的堆栈中的数据填入到cpu寄存器中,从而实现任务的切换。这两步需要注意的是在STM32启动的过程中(即startup_stm32f10x_hd.s),需要设置中断向量对应的中断处理函数OS_CPU_PendSVHandler(),将原来的Pend_SVHandler()替换掉。

对于在STM32上的移植,比较重要的是设置操作系统的“心跳”函数SysTick_Handler,函数代码如下:

void SysTick_Handler(void) { OS_CPU_SR cpu_sr; OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */ OSIntNesting++; OS_EXIT_CRITICAL(); OSTimeTick(); /* Call uC/OS-II\'s OSTimeTick() */ OSIntExit(); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwgwz.html