微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32移植uC/OS-II总结

STM32移植uC/OS-II总结

时间:11-20 来源:互联网 点击:
uC/OS-II成功移植STM32 上了,虽然理解还不是很深刻,但大体明白移植方法,以前曾经将uC/OS-II移植到MSP430F1611上,但是也没关注那么多,现在按照网友的介绍进行移植,下载官方的V2.86版本的固件,自己建工程,修改Port部分,建立两个任务,但是调试时死在程序死在了OSStart();里。经过单步发现程序的软件中断触发后调用服务函数失败,停在了

OSStartHang BOSStartHang //停在这里,而且这里正常情况下不应该在这的;

然后就开始查问题,最终解决。发现无论学什么,一定要知其然知其所以然,不然学的永远都只是皮毛。现在把自己的移植过程和理解记录下来。

下载将官方的库,Port部分是需要修改的部分,Source部分不用修改。

(1)OS_CPU.h文件下面定义类型名称,堆栈类型OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()选方法3是最合适的;定义栈增长方向,STM32是高地址向低地址增长的,所以#define OS_STK_GROWTH 1

另外再定义几个函数。直接参考移植程序,这里不做说明了。注意一点的是要屏蔽掉有关Systick的几个函数,OS_COU_C.c文件里的有关函数也要屏蔽,这是因为我们在自己的程序里自己去定义我们需要的Systick函数。

(2)OS_CPU_C.c文件定义了OSTaskStkInit()函数和一些Hook函数,OSTaskStkInit()是任务切换时候用到的,Hook函数书操作系统给用户扩展用的,因为操作系统轻易不能让用户修改,故留出一些接口供用户扩展。

如上所述,屏蔽掉涉及Systick的函数和一些宏定义;

(3)OS_CPU_A.asm是一些用汇编写的函数,直接复制粘贴,需要修改的地方后面详细介绍。

uC/OS-II移植时有两个重要的中断,一个是SysTick_Handler(),还一个是PendSV_Handler()。SysTick是心跳信号,SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基。OS 都需要这种“滴答”来推动任务和时间的管理。。PendSV挂起中断操作,它的典型应用是进行任务切换,操作系统在实际运行中具体会出现这样的问题,就是在任务切换的时候发生中断,中断必须得到响应,保证它的实时性,否则后果是不堪想象的。那么在 ISR 执行过程中,发生SysTick 异常,并且抢占了该ISR,OS 执行必要的操作,然后pend 起PendSV 异常以作好任务切换的准备,重新回到中断,中断完成后再进行任务切换,具体参考《Cotex-M3权威指南》7.6节。如下图:


再介绍一下另外几个文件,在stm32f10x_it.h函数中的都是一些中断入口函数,有SysTick_Handler()、PendSV_Handler()等函数,在CMSIS启动文件中定义了这些中断的入口地址,包括SysTick_Handler()、PendSV_Handler()等,这样就对应起来了,启动文件直接可以找到入口函数。OS需要心跳时钟,所以我们直接在程序里初始化SysTick函数,在SysTick_Handler()函数中调用OSIntEnter();OSTimeTick();OSIntExit(),这很好理解了,就是把操作系统的时钟和硬件时钟对接上了。所以也就不需要OS_CPU.h和OS_CPU_C.c中的SysTick相关的定义了。

但官方为什么要在OS_CPU.h和OS_CPU_C.c中定义OS_CPU_SysTickHandler()这个名称的函数呢?其实在stm32f10x_it.h中已经定义了SysTick_Handler()函数,这是因为官方用的是他自己的启动文件(两个文件init.s,vectors.s。init.s负责进入main(),vectors.s 设置中断向量。),他的启动文件中的入口中断地址名称OS_CPU_SysTickHandler()。同样在启动文件中他也自己定义了OS_CPU_PendSVHandler()函数,所以在OS_CPU_A.asm中定义的入口函数也是OS_CPU_PendSVHandler()。而我们的启动文件是PendSV_Handler()。所以我前面遇到的卡死就是因为PendSV中断没找到对应的中断处理函数。所以可以修改OS_CPU_A.asm,将OS_CPU_PendSVHandle全部替换成PendSV_Handler(),并且屏蔽掉stm32f10x_it.h中的PendSV_Handler()。另一种方法是只用修改启动文件,将PendSV_Handler()替换成OS_CPU_PendSVHandle()即可。

另外介绍两个文件,一个是OS_cfg.h和App_cfg.h,这是两个配置文件,OS_cfg.h是对OS进行配置,比如OS_TICKS_PER_SEC配置、OS_TIME_DLY_HMSM_EN等对用到的模块进行使能操作。App_cfg.h是用户自己按需要添加的,主要是设置任务堆栈大小,任务优先级等。

这是我移植过程中学到的,菜鸟起步,理解还不是很深,难免有误,欢迎指正。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top