程序员人生 网站导航

UCOS2_STM32F1移植详细过程(三)

栏目:综合技术时间:2016-08-04 09:05:22

Ⅰ、概述

上1篇文章是讲述ST芯片相干的配置和OS裁剪相干的配置,接着上1篇文章来说述关于UCOS的移植,该文主要针对uC/OS-II Ports下面os_cpu_a.asm、os_cpu_c.c和os_cpu.h文件底层端口代码来说述。

请下载“UCOS2_STM32F1_3个简单任务”作为参考工程。

 

笔者将“UCOS移植详细进程”分为多篇文章来说述,敬请关注。

关于本文的详情请往下看(微信请点击“浏览原文”查看内容链接内容)。

 

本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相干的文章,请用微信搜索“EmbeddDeveloper” 或扫描下面2维码、关注,将有更多精彩内容等着你。

 

Ⅱ、下载

笔者将F0、F1、F3、F4移植到最新UCOS2.92上。移植好的、独立的4个工程供大家下载学习、研究。建立的任务都是1样的,只是针对芯片不同,Ports目录下相干的源代码有差异、标准外设库也存在差异。每个系列针对不同型号芯片只需要适当改1下“型号”就好了。

提供下载的软件工程都是在板子上运行,保证没问题才上传至360云盘。

UCOS基于STM32F0系列实例:

https://yunpan.cn/cRCZrQ3dzeVQq  访问密码 e73f

 

UCOS基于STM32F1系列实例:

https://yunpan.cn/cRCZxGFsqHa6Q  访问密码 39ff

 

UCOS基于STM32F3系列实例:

https://yunpan.cn/cRCZqPRCWs8UW  访问密码 b305

 

UCOS基于STM32F4系列实例:

https://yunpan.cn/cRCZPqbFqXSPR  访问密码 f177

 

UCOS源代码工程

官网下载(需要账号):

https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true

 

360云盘下载(定期更新至最新):

https://yunpan.cn/cRzcf8eSacEhE  访问密码 1235

 

ST标准外设库

官网下载(需要账号):

http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software.html?querycriteria=productId=SC961

 

360云盘下载(定期更新至最新):

https://yunpan.cn/cSaCpGejMSfr8  访问密码 60ae

 

参考资料:

https://yunpan.cn/cRCdSt73GwT6j  访问密码 499e

 

Ⅲ、工程目录结构说明

 

文件结构和工程目录结构对应关系如上图所示。


第1类(标准外设库):

Startup Code:启动代码

STM32F10x_StdPeriph_Driver:标准外设库库驱动

CMSIS:标准接口

 

第2类(µC/OS-II实时内核):

uC/OS-II Source:内核源代码(与处理器无关)

uC/OS-II Ports:OS端口底层代码(与处理器、编译平台有关)

 

第3类(用户利用):

Bsp:利用底层代码(初始化、驱动等)

App:利用实现代码(配置OS、利用等)

 

该文主要针对uC/OS-II Ports进行移植描写。我们不使用UCOS自带的调试功能,这里就不再描写(使用)os_dbg.c文件。

 

Ⅳ、配置os_cpu_a.asm文件

os_cpu_a.asm文件位于工程uC/OS-II Ports结构下面,主要是系统底层相干的1部份汇编代码。

该文件主要对外部援用(全局变量、函数)做了1个申明,及部份系统相干源代码(汇编)做了1个定义。

下面我将定义的几个源代码做1个描写,移植进程需要修改的我会重点提示出来。

 

1.全局申明


该文件开头对全局变量和函数进行了1次声明,只是使用的汇编,就如C语言里面的extern。

上脸部分是外部(其他源文件)定义的变量和函数,下脸部分是申明本文件定义的函数,下面我会对这定义的源代码进行讲述。

将OS_CPU_PendSVHandler改成PendSV_Handler,为了兼容ST标准外设库启动代码(startup_stm32f10x_hd.s)。

 

2.NVIC配置


这部份是对NVIC(中断控制)寄存器相干进行定义,就如预处理中宏定义1样,对寄存器地址,状态进行定义。

 

3.代码生成指令


这几条指令主要是针对汇编指令的1个处理。

 

4.状态保存与恢复


这两个汇编函数是程序运行在临界区,对数据的保存和恢复的函数。主要作用就是保护数据不被破坏。

 

5.运行最高优先级任务


这个函数在任务切换的时候调用,知道任务切换原来的朋友来讲这里不难理解。UCOS是按优先级来履行任务,优先级越高(优先级数值越小),越容易被履行。当履行的任务处于挂起(或删除)时,系统就需要进行任务切换,切换的规则就是切换到最高优先级去履行。

 

6.上下文切换


系统切换任务可以从两个地方,也就是从任务级和中断级。这两个函数的意思都1样,当需要履行任务切换时,根据条件履行某1个。

 

7.PendSV_Handler中断


PendSV_Handler中断函数定义于这里,主要是在履行该中断对M3内核寄存器进行1些操作(保存与修改)。

将OS_CPU_PendSVHandler改成PendSV_Handler,为了兼容ST标准外设库启动代码(startup_stm32f10x_hd.s)。

 

8.总结os_cpu_a.asm

对UCOS的移植,os_cpu_a.asm文件主要就是修改OS_CPU_PendSVHandler的名称,包括申明时的名称和定义源代码时的名称,其他源代码保持不变。

 

Ⅴ、配置os_cpu_c.c文件

os_cpu_c.c文件位于工程uC/OS-II Ports结构下面,主要是系统底层相干的1部份C语言接口代码。

该文件有许多HOOK函数,也就是所谓的钩子函数,主要用于系统初始化、与任务相干等,如:系统初始化时OSInitHookBegin()、OSInitHookEnd(); 创建任务时OSTaskCreateHook等。其实我们自己移植,有很多HOOK函数是不需要使用,或不用去实现函数体里面的代码。下面我将讲述几个重要的函数,有些不重要的HOOK函数不再讲述。

下面我将定义的几个源代码做1个描写,移植进程需要修改的我会重点提示出来。

 

1.系统滴答



这些都是关于SysTick系统滴答的宏定义和函数体,由于我们使用M3标准(ST库里面有)的SysTick系统滴答函数接口,我们屏蔽掉os_cpu_c.c里面SysTick相干的定义。

 

2.OSInitHookBegin


这个函数被OSInit()开头调用,也就是我们main函数开始调用OSInit()就会调用它。

注意:

#if OS_CPU_HOOKS_EN > 0u

也就是需要在os_cfg.h文件里面配置OS_CPU_HOOKS_EN>0.

 

3.OSTaskStkInit初始化任务堆栈


这个函数比较重要,在创建任务的时候调用它。主要是对芯片内核寄存器进行1个配置,并现场保护数据。这个函数根据芯片内核不同,也存在很大不同。

 

 

Ⅶ、配置os_cpu.h文件

os_cpu.h文件位于工程uC/OS-II Ports结构下面,主要是系统底层相干的某些定义(堆栈、数据类型)、申明(函数)等。

该文件下面源代码比较简单,有些不使用,即移植进程需要修改的我会重点提示出来。

 

1.OS数据类型


这部份是为系统定义相干的数据类型,这里不用修改。

 

2.临界区管理


我们使用默许使用临界区第3模式,这个定义主要是与os_cpu_a.asm文件中定义OS_CPU_SR_Save()函数有关。


3.函数申明


函数申明比较简单,这里有几个函数我们在os_cpu_a.asm和os_cpu_c.c文件中都屏蔽掉了的,这里也将他们屏蔽掉。

 

Ⅷ、说明

相干的文章可以到我博客上查看,我也会定期更新,新内容第1时间在微信分享。

当你掌握UCOS在1种平台上的移植,其他平台移植原理类似,请不要局限某1平台。

以上总结仅供参考,若有不对的地方,敬请体谅。

 

Ⅸ、最后

关注微信,回复“更多内容”,将取得更多内容(如:UCOS实例等,不断更新中......)。

如果你喜欢我分享的内容,你又想了解更多相干内容,请关注文章开头的微信公众号,新内容延续更新中,后期将会有更多精彩内容出现。

 

浏览原文


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐