STM32固件库3.5+uCOS2.86移植(转自暴走的工程师)

2024-02-17 22:10

本文主要是介绍STM32固件库3.5+uCOS2.86移植(转自暴走的工程师),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

考了很多移植的资料和代码,终于移植好了。。。应该是完美移植吧~~哈哈哈~~
编译环境是IAR
工程适用于STM32F10X大容量产品,如果不是,请自行修改启动文件和工程配置
编译器优化等级最高。。。这个你们根据需要自己调整吧。。。

###############################################################################
1.Jean J.Labrosse与μCOS—II
μCOS—II是一个实时可剥夺型操作系统内核,该操作系统支持最多64个任务,但每个任务的优先级必须互不相同,优先级号小的任务比优先级号大的任务具 有更高的优先级,并且该操作系统总是调度优先级最高的就绪态任务运行。此内核的代码是美国人Jean J.Labrosse用C语言编写的(花了一年时间),具有很好的可移植性,其2.52版本通过了美国航天航空管理局的安全认证,可靠性非常高。
2.准备工作
去micrium(uscos官网)和arm指令官网(为了汇编)找相应的appNote和源码
STM32F103ZE AN1913
arm指令。。随便给的,再找一找具体的

先把固件库先建立好。






下面进行移植。首先去官网下载ucos的最新版本2.86源码。还有2.86的keil的工程以及2.92IAR的工程(不知道为虾米,就是木有2.92的源码下载。。。)

把源码解压,在工程的根目录下新建文件夹uCOS_II,再在这个文件夹里面再新建两个文件夹Source和Ports

在Source文件夹里面放入如下文件
STM32固件库3.5+uCOS2.86移植(来自阿莫)不完全搬运与实践评论

在工程里面把文件包含进去并设置好。

编译,肯定会出错。

提示:.\uCOS_II\Source\ucos_ii.h(44): error: 

#5: cannot open source input file "app_cfg.h": No such file or directory

把2.86工程里面的app_cfg.h复制并放到APP文件夹下。再编译
评论:app_cfg.h只是一些配置文件,可以根据自己的需要剪裁

提示:.\uCOS_II\Source\ucos_ii.h(45): error:  #5: cannot open source input file "os_cfg.h": No such file or directory

把2.90源码里的os_cfg_r.h改名为os_cfg.h以及os_dbg_r.c改名为os_dbg.c后放入APP文件夹下。再编译
评论:os_cfg.h 和os_dbg.h也可以在\Micrium\Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD找到

提示:.\uCOS_II\Source\ucos_ii.h(46): error:  #5: cannot open source input file "os_cpu.h": No such file or directory

把2.92工程里的os_cpu.h和os_cpu.c,以及2.86工程的os_cpu_a.asm复制到ports文件夹下。(注意2.90版本新增的一个钩子函数)编译
评论:没遇到此类问题
提示:.\object\ucos_ii.axf: Error: L6218E: Undefined symbol App_TCBInitHook (referred from os_cpu_c.o).等等几个

os_cfg.h里的OS_APP_HOOKS_EN设置为0。编译

无错误。

#################################################

注意:以下是2.90新增的钩子函数,如报错,请在os_cpu.c增加以下代码

STM32固件库3.5+uCOS2.86移植(来自阿莫)不完全搬运与实践评论

########################################

但是还有很多事情要做。。。 (以上仅供参考~)

新建文件夹BSP。用于放驱动层与应用层之间的BSP文件。

把2.86工程里面才bsp.c和bsp.h放进去,并进行适当的修改(自己斟酌。。。)。唯一要注意的是需要保留OS_CPU_SysTickClkFreq这个函数。
评论:以上这段要适量剪裁,其实OS_CPU_SysTickClkFreq在初始阶段没有编译哦,加不加无所谓


使用st V3.5.0 库中的startup_stm32f10x_hd.s 作为启动代码
需要修改的地方:
用OS_CPU_PendSVHandler 替换startup_stm32f10x_hd.s 中所有的PendSV_Handler
用OS_CPU_SysTickHandler 替换startup_stm32f10x_hd.s 中所有的SysTick_Handler
评论:st v3.5.0的确实要替换这两个鬼东东,但是如果你用Micrium\Software\EvalBoards\ST\STM32-SK\IAR\OS-Probe-LCD\app_vect_v5.c 这个C程序的启动文件 完全不用更改
测试一下咯。。。 写一个串口驱动。。很简单
void uart_init(void)
{
u32 baudRate = 115200;//波特率float temp;u16 BRR_Value;u16 BRR_Mantissa;u16 BRR_Fraction;//定义时钟选择结构体
    RCC_ClocksTypeDef RCC_ClocksStatus;RCC_GetClocksFreq(&RCC_ClocksStatus);//选择PCLK2 为时钟 RCC设置里未分频,即72Mhztemp = (float)(RCC_ClocksStatus.PCLK2_Frequency)/(baudRate*16);BRR_Mantissa = (u32)temp;    //得到BRR[15:4]整数部分
BRR_Fraction = (u32)(temp - BRR_Mantissa)*16;  //得到BRR[3:0]小数部分
BRR_Mantissa<<=4;BRR_Value = BRR_Mantissa + BRR_Fraction;  //拼接整数和小数部分
USART1->BRR = BRR_Value;  //设置波特比率
   USART1->CR1 |= 1<<13;    // Enable the USART by writing the UE bit in USART_CR1 register to 1
   USART1->CR1 |= 1<<2;    // Set the TE bit in USART_CR1 to send an idle frame as first transmission
   USART1->CR1 |= 1<<3;    //    Set the RE bit USART_CR1. This enables the receiver which begins searching for a start bit.
       }
//我这个用库了。。不用库也一样。。没找到不用库的版本
void USART1_Puts(char * str)
{//USART_ClearFlag(USART1,USART_FLAG_TC); 清零TC用的,网上说法:“清除标志位,否则第1位数据会丢失”while(*str){GPIO_ResetBits(GPIOF, GPIO_Pin_8);USART_SendData(USART1, *str++);while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){       }GPIO_SetBits(GPIOF, GPIO_Pin_8);}
}主程序来一下~
int  main (void)
{OSInit();                                                  OSTaskCreateExt(AppStartTask,(void *)0,(OS_STK *)&AppStartTaskStk[TASK_STK_SIZE-1],TASK_START_PRIO,TASK_START_PRIO,(OS_STK *)&AppStartTaskStk[0],TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);OSStart();                             
}
再来个task任务~别忘了声明啊static  void  AppStartTask (void *p_arg);static  void  AppStartTask (void *p_arg)
{(void)p_arg;USART1_Puts("aaaaa!\r\n");while(1) {delay();}
}

下面就简单讲下ucos移植时各个文件的要点。

首先是source文件夹里面的源码,是用C写好的系统源码,这个不需要我们改,包括以下文件。
STM32固件库3.5+uCOS2.86移植(来自阿莫)不完全搬运与实践评论
然后是Ports文件夹里面的,这个是与硬件平台有关的代码,有一部分用汇编写成。本来这一部分的编写是需要我们自己来的,但是既然官网都给我们了,不用是傻13。。。主要有以下文件:

STM32固件库3.5+uCOS2.86移植(来自阿莫)不完全搬运与实践评论
a:os_cpu.h主要声明了与微处理器无关的常量、宏和声明。ucos为了可移植性,用INT32U代替了unsigned int等等之类的,就是在此声明的。

B:os_cpu.c里的是与CPU相关的C函数和钩子函数。里面真正需要我们写的只有OSTaskStkInit()这个函数。这个函数主要用于任务堆栈的初始化。

C:os_cpu_a.asm主要是与处理器相关的汇编代码。占移植工作的70%。(不过我不写,哈哈哈)实现的是下面五个与处理器相关的函数。

1、OS_CPU_SR_Save();关中断函数
2、OS_CPU_SR_Restore();恢复中断函数
3、OSStartHighRdy();启动最高优先级任务运行
4、OSCtxSw();任务级任务切换
5、OSIntCtxSw();ISR中执行任务级任务切换

D:os_dbg.c主要是一些变量。不用写,把源码里的os_dbg_r.c改名为os_dbg.c即可



最后就是与应用层相关的配置文件了,都被我放进APP文件夹里了。主要有app_cfg.h和os_cfg.h两个文件。os_cfg.h直接把 os_cfg_r.h改名为os_cfg.h就可以了,主要是裁剪操作系统用的,里面是操作系统功能开关和配置。app_cfg.h是放APP层里面建立 任务的优先级和堆栈大小的。



差点忘了说了,移植时千万注意启动文件的修改。。。官方给的工程是自己写的启动文件,而且它自己写了中断服务控制,我习惯了直接调用中断,因此没有使用官 方这方面的源码,而且就速度说,多重的函数调用肯定比直接调用慢的。我直接使用了固件库的启动文件。之前就是因为没有修改好所以悲剧的。。。移植不难,难 的是移植过程一大堆你不知道解决方法的问题而已。不要认为看了我的这篇东西自己就可以移植了。哈哈,少年,你还不懂~

转载于:https://www.cnblogs.com/quray/p/4847441.html

这篇关于STM32固件库3.5+uCOS2.86移植(转自暴走的工程师)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/719132

相关文章

Mybatis从3.4.0版本到3.5.7版本的迭代方法实现

《Mybatis从3.4.0版本到3.5.7版本的迭代方法实现》本文主要介绍了Mybatis从3.4.0版本到3.5.7版本的迭代方法实现,包括主要的功能增强、不兼容的更改和修复的错误,具有一定的参考... 目录一、3.4.01、主要的功能增强2、selectCursor example3、不兼容的更改二、

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

计算机视觉工程师所需的基本技能

一、编程技能 熟练掌握编程语言 Python:在计算机视觉领域广泛应用,有丰富的库如 OpenCV、TensorFlow、PyTorch 等,方便进行算法实现和模型开发。 C++:运行效率高,适用于对性能要求严格的计算机视觉应用。 数据结构与算法 掌握常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划等),能够优化代码性能,提高算法效率。 二、数学基础