移植ucosII到STM32F103ZE(二)
1.
uC/OSII简介:
uC/OS 内核基本可以分为任务调度,任务同步和内存管理三部分:
任务调度
ucosii为保证实时性,给每个任务分配一个不同的优先级。当发生任务切换时,总是切换到就绪的最高优先级任务。有2种情况会发生任务切换。
1.任务等待资源就绪或自我延时;
2.退出中断;
情况1可以理解为任务主动放弃cpu的使用权。情况2可以理解为中断后,某种资源可能就绪了,需要任务切换。
需要注意的是SysTick中断,这个中断是os的“心跳”,必须得有。这样就使得cpu会发生周期性地任务切换。由于ucosii 不支持时间片轮转调度,因此在该中断中必须做的工作仅有os的时间管理。也就是调用OSTimeTick()
任务同步
任务同步和大多数操作系统的做法差不多,如果学过操作系统或是有多线程编程经验的话,应该很好理解。无非是任务A 因为某个资源未就绪,就放弃 cpu 使用权,等任务 B 或是中断使该资源就绪,当再次任务进行切换时如果任务 A 优先级最高,则任务A 继续执行。具体怎么实现就看上面推荐的书吧。
内存管理
ucosii的内存管理,之前应该讲过的。
ucosii 代码组成
os_core.c 是ucosii 的核心,它包含了内核初始化,任务切换,事件块管理等,其中事件块是各个同步量(这里我把互斥量,信号量,邮箱,队列统称为同步量,不是很科学,图个方便。事件标志组不是以事件块为基础的,不过原理也差不多)的基础。
os_task.c
任务管理代码
os_flag.c
事件标志管理代码
os_mbox.c
消息邮箱管理代码
os_mutex.c
互斥型信号量管理代码
os_q.c
消息队列管理代码
os_sem.c
同步量管理代码。
os_mem.c
内存管理代码。
os_time.c
时间管理代码,主要做各种延时。
os_tmr.c
定时器管理代码
定时器管理代码,这部分代码时从V2.81 版才开始有的,邵老师的书讲的是V2.55 版的代码,是没有这部分内容的。如果前面的代码都理解的话,这部分代码也是不难理解的。一个定时器大体由3 部分组成:定时时间,回调函数和属性。当定时时间到了的话,就进行一次回调函数的处理,定时器属性说明定时器是周期性的定时还是只做一次定时。如果用户使能了OS_TMR_EN,ucosii 会在内部创建一个定时器任务,负责处理各个定时器。这个任务一般应该由硬件定时器的中断函数中调用OSTmrSignal()去激活。所以从本质上说os_tmr.c 中的定时器是由一个硬件定时器分化出来的。
默认情况下是由SysTick 中断里通过OSTimeTickHook()去激活定时器任务的。
移植相关文件
os_cpu.h:
进行数据类型定义,处理器相关代码和几个函数原型。
os_cpu_c.c:
定义一些用户hook函数。
os_cpu_a.asm:移植需要用汇编代码完成的函数,主要就是任务切换函数。
os_dbg.c:
内核调试相关数据和函数,可以不改。
ucosii 内核就介绍到这里。
2.
STM32F10x库文件简介:
解压从ST官网下载的stm32f10x_stdperiph_lib.zip库文件后,有六个文件,如下图:
其中 Libraries 包含库的源代码,Project 包含stm32 各个外设的使用范例和一个工程模板,Utilitiess 是使用 st 公司评估板的例子,_htmresc是两个图标stm32f10x_stdperiph_lib_um.chm教我们怎么用标准外设库。我们主要关心 Libraries和Project 文件夹,等会我们要从中拷取需要的资料。
1)
建立工程文件夹结构:
准备使用 32 位单片机,应该是个不小项目,因此工程目录也应做个规划。这里推荐一下所使用的目录结构。
Ø假设建立了一个名为stm32-ucosII-demo的文件夹,该目录下有 6个文件夹App, Bsp, Libraries, OS-uCOSII, Project, Readme。
App 用来存放应用程序文件,Bsp 用来存放版级驱动文件,Libraries 用来存放 STM32 的标准外设库文件,OS-uCOSII 用来存放uCOS 文件,Project用来存放工程文件,Readme用来存放TXT 格式的本项目自述或说明文件。
ØProject 下再建立两个子文件夹Output 和List。
ØOS-uCOSII下再建立两个子文件夹core和port。
2)
整理库代码:
由于 Libraries 下的 CMSIS 文件夹中很多代码是和编译器及芯片相关的,导致文件夹多且深度大,不利于工程维护,实际上一个项目往往是用固定的编译器和芯片,因此有必要对库进行整理。
a)
把刚解压的STM32F10x_StdPeriph_Lib_V3.5.0Libraries下的STM32F10x_StdPeriph_Driver文件夹拷贝到新文件夹Stm32-ucosII-demoLibraries 中。
b)
在新文件夹Stm32-ucosII-demo Libraries 目录下建立CM3 文件夹,把
STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport下的core_cm3.c ,core_cm3.h和
STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x 下的stm3210x.h,system_stm32f10x.c,system_stm32f100x.h 拷贝到新 LibrariesCM3 文件夹中,并去掉这 3个文件的只读属性。
c)
在新文件夹LibrariesCM3 目录下建立 startup文件夹,并根据你所选的芯片类型,将LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm 下对应的启动文件拷贝到 startup 文件夹中。这里拷贝的是 startup_stm32f10x_hd.s。
d)
把STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_Template 下的stm32f10x_it.c,stm32f10x_it.h,stm32f10x_conf.h拷贝到新Stm32-ucosII--demoApp 中。
e)
所有文件的树形目录图如下:
f)
下面对该库文件做个简单介绍
LibrariesSTM32F10x_StdPeriph_Driver下的内容很好理解就是 stm32的各个外设模块驱动代码。misc.h和misc.c 是和 CM3 内核有关的NVIC 和 SysTick 的驱动代码。
LibrariesCMSIS 下是什么呢?
uC/OS 内核基本可以分为任务调度,任务同步和内存管理三部分:
任务调度
ucosii为保证实时性,给每个任务分配一个不同的优先级。当发生任务切换时,总是切换到就绪的最高优先级任务。有2种情况会发生任务切换。
1.任务等待资源就绪或自我延时;
2.退出中断;
情况1可以理解为任务主动放弃cpu的使用权。情况2可以理解为中断后,某种资源可能就绪了,需要任务切换。
需要注意的是SysTick中断,这个中断是os的“心跳”,必须得有。这样就使得cpu会发生周期性地任务切换。由于ucosii 不支持时间片轮转调度,因此在该中断中必须做的工作仅有os的时间管理。也就是调用OSTimeTick()
任务同步
任务同步和大多数操作系统的做法差不多,如果学过操作系统或是有多线程编程经验的话,应该很好理解。无非是任务A 因为某个资源未就绪,就放弃 cpu 使用权,等任务 B 或是中断使该资源就绪,当再次任务进行切换时如果任务 A 优先级最高,则任务A 继续执行。具体怎么实现就看上面推荐的书吧。
内存管理
ucosii的内存管理,之前应该讲过的。
ucosii 代码组成
os_core.c 是ucosii 的核心,它包含了内核初始化,任务切换,事件块管理等,其中事件块是各个同步量(这里我把互斥量,信号量,邮箱,队列统称为同步量,不是很科学,图个方便。事件标志组不是以事件块为基础的,不过原理也差不多)的基础。
os_task.c
os_flag.c
os_mbox.c
os_mutex.c
os_q.c
os_sem.c
os_mem.c
os_time.c
os_tmr.c
定时器管理代码,这部分代码时从V2.81 版才开始有的,邵老师的书讲的是V2.55 版的代码,是没有这部分内容的。如果前面的代码都理解的话,这部分代码也是不难理解的。一个定时器大体由3 部分组成:定时时间,回调函数和属性。当定时时间到了的话,就进行一次回调函数的处理,定时器属性说明定时器是周期性的定时还是只做一次定时。如果用户使能了OS_TMR_EN,ucosii 会在内部创建一个定时器任务,负责处理各个定时器。这个任务一般应该由硬件定时器的中断函数中调用OSTmrSignal()去激活。所以从本质上说os_tmr.c 中的定时器是由一个硬件定时器分化出来的。
默认情况下是由SysTick 中断里通过OSTimeTickHook()去激活定时器任务的。
移植相关文件
os_cpu.h:
os_cpu_c.c:
os_cpu_a.asm:
os_dbg.c:
ucosii 内核就介绍到这里。
2.
解压从ST官网下载的stm32f10x_stdperiph_lib.zip库文件后,有六个文件,如下图:
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/321490_1_0.jpg)
其中 Libraries 包含库的源代码,Project 包含stm32 各个外设的使用范例和一个工程模板,Utilitiess 是使用 st 公司评估板的例子,_htmresc是两个图标stm32f10x_stdperiph_lib_um.chm教我们怎么用标准外设库。我们主要关心 Libraries和Project 文件夹,等会我们要从中拷取需要的资料。
1)
准备使用 32 位单片机,应该是个不小项目,因此工程目录也应做个规划。这里推荐一下所使用的目录结构。
Ø
App 用来存放应用程序文件,Bsp 用来存放版级驱动文件,Libraries 用来存放 STM32 的标准外设库文件,OS-uCOSII 用来存放uCOS 文件,Project用来存放工程文件,Readme用来存放TXT 格式的本项目自述或说明文件。
Ø
Ø
2)
由于 Libraries 下的 CMSIS 文件夹中很多代码是和编译器及芯片相关的,导致文件夹多且深度大,不利于工程维护,实际上一个项目往往是用固定的编译器和芯片,因此有必要对库进行整理。
a)
b)
STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport下的core_cm3.c ,core_cm3.h和
STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x 下的stm3210x.h,system_stm32f10x.c,system_stm32f100x.h 拷贝到新 LibrariesCM3 文件夹中,并去掉这 3个文件的只读属性。
c)
d)
e)
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/321490_1_1.jpg)
f)
LibrariesSTM32F10x_StdPeriph_Driver下的内容很好理解就是 stm32的各个外设模块驱动代码。misc.h和misc.c 是和 CM3 内核有关的NVIC 和 SysTick 的驱动代码。
LibrariesCMSIS 下是什么呢?
评论