UCOS2_STM32F1移植详细过程(三)
Ⅰ、概述
上一篇文章是讲述ST芯片相关的配置和OS裁剪相关的配置,接着上一篇文章来讲述关于UCOS的移植,该文主要针对uC/OS-II Ports下面os_cpu_a.asm、os_cpu_c.c和os_cpu.h文件底层端口代码来讲述。
请下载“UCOS2_STM32F1_3个简单任务”作为参考工程。
笔者将“UCOS移植详细过程”分为多篇文章来讲述,敬请关注。
关于本文的详情请往下看(微信请点击“阅读原文”查看内容链接内容)。
本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。
Ⅱ、下载
笔者将F0、F1、F3、F4移植到最新UCOS2.92上。移植好的、独立的4个工程供大家下载学习、研究。建立的任务都是一样的,只是针对芯片不同,Ports目录下相关的源代码有差异、标准外设库也存在差异。每一个系列针对不同型号芯片只需要适当改一下“型号”就行了。
提供下载的软件工程都是在板子上运行,保证没问题才上传至360云盘。
UCOS基于STM32F0系列实例:
https://yunpan.cn/cRCZrQ3dzeVQq 访问密码
UCOS基于STM32F1系列实例:
https://yunpan.cn/cRCZxGFsqHa6Q 访问密码
UCOS基于STM32F3系列实例:
https://yunpan.cn/cRCZqPRCWs8UW 访问密码
UCOS基于STM32F4系列实例:
https://yunpan.cn/cRCZPqbFqXSPR 访问密码
UCOS源代码工程
官网下载(需要账号):
360云盘下载(定期更新至最新):
https://yunpan.cn/cRzcf8eSacEhE 访问密码 1235
ST标准外设库
官网下载(需要账号):
360云盘下载(定期更新至最新):
https://yunpan.cn/cSaCpGejMSfr8 访问密码 60ae
参考资料:
https://yunpan.cn/cRCdSt73GwT6j 访问密码 499e
Ⅲ、工程目录结构说明

文件结构和工程目录结构对应关系如上图所示。
第一类(标准外设库):
Startup Code:启动代码
STM32F10x_StdPeriph_Driver:标准外设库库驱动
CMSIS:标准接口
第二类(µC/OS-II实时内核):
uC/OS-II Source:内核源代码(与处理器无关)
uC/OS-II Ports:OS端口底层代码(与处理器、编译平台有关)
第三类(用户应用):
Bsp:应用底层代码(初始化、驱动等)
App:应用实现代码(配置OS、应用等)
该文主要针对uC/OS-II Ports进行移植描述。我们不使用UCOS自带的调试功能,这里就不再描述(使用)os_dbg.c文件。
Ⅳ、配置os_cpu_a.asm文件
os_cpu_a.asm文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的一部分汇编代码。
该文件主要对外部引用(全局变量、函数)做了一个申明,及部分系统相关源代码(汇编)做了一个定义。
下面我将定义的几个源代码做一个描述,移植过程需要修改的我会重点提示出来。
1.全局申明

该文件开头对全局变量和函数进行了一次声明,只是使用的汇编,就如C语言里面的extern。
上面部分是外部(其他源文件)定义的变量和函数,下面部分是申明本文件定义的函数,下面我会对这定义的源代码进行讲述。
将OS_CPU_PendSVHandler改为PendSV_Handler,为了兼容ST标准外设库启动代码(startup_stm32f10x_hd.s)。
2.NVIC配置

这部分是对NVIC(中断控制)寄存器相关进行定义,就如预处理中宏定义一样,对寄存器地址,状态进行定义。
3.代码生成指令

这几条指令主要是针对汇编指令的一个处理。
4.状态保存与恢复

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

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

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

PendSV_Handler中断函数定义于这里,主要是在执行该中断对M3内核寄存器进行一些操作(保存与修改)。
将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结构下面,主要是系统底层相关的一部分C语言接口代码。
该文件有许多HOOK函数,也就是所谓的钩子函数,主要用于系统初始化、与任务相关等,如:系统初始化时OSInitHookBegin()、OSInitHookEnd(); 创建任务时OSTaskCreateHook等。其实我们自己移植,有很多HOOK函数是不需要使用,或者不用去实现函数体里面的代码。下面我将讲述几个重要的函数,有些不重要的HOOK函数不再讲述。
下面我将定义的几个源代码做一个描述,移植过程需要修改的我会重点提示出来。
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初始化任务堆栈

这个函数比较重要,在创建任务的时候调用它。主要是对芯片内核寄存器进行一个配置,并现场保护数据。这个函数根据芯片内核不同,也存在很大不同。
Ⅶ、配置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文件中都屏蔽掉了的,这里也将他们屏蔽掉。
Ⅷ、说明
相关的文章可以到我博客上查看,我也会定期更新,新内容第一时间在微信分享。
当你掌握UCOS在一种平台上的移植,其他平台移植原理类似,请不要局限某一平台。
以上总结仅供参考,若有不对之处,敬请谅解。
Ⅸ、最后
关注微信,回复“更多内容”,将获得更多内容(如:UCOS实例等,不断更新中......)。
如果你喜欢我分享的内容,你又想了解更多相关内容,请关注文章开头的微信公众号,新内容持续更新中,后期将会有更多精彩内容出现。
UCOS2_STM32F1移植详细过程(三)的更多相关文章
- UCOS2_STM32F1移植详细过程
源:UCOS2_STM32F1移植详细过程(三) UCOS2_STM32移植过程.系统内核.事件描述(汇总)
- UCOS2_STM32F1移植详细过程(四)
Ⅰ.概述 上一篇文章是讲述uC/OS-II Ports下面os_cpu_a.asm.os_cpu_c.c和os_cpu.h文件底层端口代码的移植(修改)和说明,接着上一篇文章来讲述关于UCOS移植应用 ...
- UCOS2_STM32F1移植详细过程(一)
Ⅰ.概述 该文写针对初学µC/OS的朋友,基于以下平台来一步一步移植µC/OS嵌入式操作系统.UCOS移植相关平台: 系统平台:µC/OS-II (最新V2.92版) 硬件平台:STM32F1 ...
- UCOS2_STM32F1移植详细过程(二)
Ⅰ.概述 打开上一篇文章新建的工程,是提取的ST标准库里面源代码文件和UCOS工程包源代码文件.下载过的朋友可能会知道,直接编译那个工程会有大片的错误和警告,原因在于那个工程是没有经过修改源代码的工程 ...
- UCOS2_STM32移植详细过程(汇总)
Ⅰ.概述 笔者发现一个问题,很多初学者,甚至很多工作一两年的人,他们有一种依赖的思想,就是希望从别处获取的软件代码不做任何修改,直接可以运行或者使用.笔者想说,实践才是检验真理的关键,实践才是掌握知识 ...
- android wifi驱动移植详细过程
转自:http://bbs.imp3.net/thread-10558924-1-1.html 对于刚入手android没多久的人来说,android wifi 驱动的移植确实还是有难度的,不过参考了 ...
- redis cluster + sentinel详细过程和错误处理三主三备三哨兵
redis cluster + sentinel详细过程和错误处理三主三备三哨兵1.基本架构192.168.70.215 7001 Master + sentinel 27001192.168.70. ...
- STM32F0xx_EXIT中断配置详细过程
Ⅰ.概述 EXIT外部中断在使用到按键或者开关控制等应用中比较常见,低功耗中断唤醒也是很常见的一种.因此,EXIT在实际项目开发中也是比较常见的一种. STM32F0中外部中断EXIT属于中断和事件的 ...
- 第一部分:使用iReport制作报表的详细过程(Windows环境下)
提示:在有些板块,文中的图片看不到,建议到我的blog浏览文章:http://blog.csdn.net/jemlee2002/文章将会涉及3个方面的内容: 第一部分:使用iReport制作报表的详细 ...
随机推荐
- 启用 CORS 来解决这个问题(ajax跨域请求)
<input type="file" name="btn_Upload" value="上传" id="btn_Upload ...
- FileSystem实例化过程
HDFS案例代码 Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get(n ...
- SQL Server int类型值最大2147483647(2^31 - 1)
突发奇想,一个字增字段,假设每天增加1000条记录,多少年之后写不进int类型的字段了2147483647 / 1000 / 365 = 5883.51684109589041095890410958 ...
- git学习第一课
##git管理工具学习(Windows7)###1.下载安装git安装包###2.注册github账号①github.com官网注册并创建项目用户名xiaqiubo项目名xiaoxia②复制http ...
- 【Unity Shaders】学习笔记——SurfaceShader(十)镜面反射
[Unity Shaders]学习笔记——SurfaceShader(十)镜面反射 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以. 水 ...
- Flex4 自定义通用的ImageButton
Flex4与之前版本的一个极大区别就是外观皮肤的分离,虽然进一步解耦,但存在一个不爽的地方就是增加了编码的工作量,你能想象为你的每个自定义组件都写一个对应的皮肤吗?可能仅仅和你之前写过的组件差了那么一 ...
- 如何绕过CDN找源站ip?
这是一个总结帖,查了一下关于这个问题的国内外大大小小的网站,对其中说的一些方法总结归纳形成,里面具体发现ip的方法不是原创,所有参考的原贴都也贴在了后面,大家可以自行看看原贴. 首先,先要明确一个概念 ...
- 跟我学 NHibernate (三)
在使用 NHibernate 时,一定要将Mapping 映射文件,也就是 xml 文件的编译方式设置成 嵌入式,这是因为在 NHibernate 启动时,它会主动的到项目的启动目录中寻找 被设置为嵌 ...
- linux查看内存和回收内存
清理前内存使用情况 free -m free -g echo 1 > /proc/sys/vm/drop_caches 清理后内存使用情况 free -m
- 《App研发录》知识点汇总
原文链接:http://www.jianshu.com/p/fc8c4638937e <App研发录>这部书是包建强写的,说来也巧,在读这边书之前在看池建强的<Mac 人生元编程&g ...